こんにちは。
制作部プログラマーの村田です。
今回はUnreal Engine4(以下UE4)のプチ便利機能についてお届けしたいと思います。
※UE4のバージョンは4.23.1での確認となります。
CustomizedUVsとは
CustomizedUVs自体の説明をする前に↓のようなノードを作成した場合、Shaderコードはどうなると思いますか?
↓こうなります。
void CalcPixelMaterialInputs(in out FMaterialPixelParameters Parameters, in out FPixelMaterialInputs PixelMaterialInputs)
{
︙
// 移動量計算
float Local0 = (View_GameTime * 0.50000000);
float Local1 = (View_GameTime * 0.00000000);
// Panner処理
float2 Local2 = ( float2 (Local0,Local1) + Parameters.TexCoords[0].xy);
// Texture Sample
float4 Local3 = ProcessMaterialColorTextureLookup(Texture2DSampleBias(Material_Texture2D_0, Material_Texture2D_0Sampler,Local2,View_MaterialTextureMipBias));
// EmissiveColorにセット
PixelMaterialInputs.EmissiveColor = Local3;
︙
}
Shaderファイル名を見てもらえればわかるかと思いますが、、
PixelShaderで計算が行われています。
今回はテストで作成したものなので、内容もシンプルで計算コストもそこまで高くはありませんが、こういったPixelShaderの計算コストをVertexShaderに逃がすことをできるのがCustomizedUVsです。
CustomizedUVsを利用した形にさっきのマテリアルノードを置き換えると↓のようになります。
PixelShaderは↓こうなり、、
void CalcPixelMaterialInputs(in out FMaterialPixelParameters Parameters, in out FPixelMaterialInputs PixelMaterialInputs)
{
︙
// Texture Sample
float4 Local0 = ProcessMaterialColorTextureLookup(Texture2DSampleBias(Material_Texture2D_0, Material_Texture2D_0Sampler,Parameters.TexCoords[0].xy,View_MaterialTextureMipBias));
// EmissiveColorにセット
PixelMaterialInputs.EmissiveColor = Local1;
︙
}
VertexShaderは↓こうなります。
void GetMaterialCustomizedUVs(FMaterialVertexParameters Parameters, inout float2 OutTexCoords[ 1 ])
{
// 移動量計算
float Local2 = (View_GameTime * 0.50000000);
float Local3 = (View_GameTime * 0.00000000);
// Panner処理
float2 Local4 = ( float2 (Local2,Local3) + Parameters.TexCoords[0].xy);
// UV値セット
OutTexCoords[0] = Local4;
}
先程PixelShaderで行われていた計算がVertexShaderに移っているのがわかるかと思います。
使い方
マテリアルの設定から「Num Customized UVs」の値を1以上にすることで出力ピンに「Customized UV(X)」が追加されます。
(Xは格納するTEXCOORD番号)
格納したCustomizedUVを使う時は通常通り「TexCoord」ノードを使用すればOKです。
CustomizedUVsの弱点
お手軽にピクセル負荷を減らせるCustomizedUVsですが、勿論弱点もあります。。
当たり前ですが、頂点負荷がかかります。
なので、最適化として使用する場合は、必ず事前に頂点負荷なのかピクセル負荷なのかの切り分けは行いましょう。
また、頂点で計算を行うことで大きく見た目が変わる可能性があります。
頂点間の値が線形で補間されるため↓のようなことが起こります。
UV値を2乗して出力した結果です。
左がPixelShaderで2乗した結果。
対して右2つがVertexShaderでUV値を2乗した結果です。
真ん中と右のPlaneの結果の違いは頂点数の違いによるものです。
右のPlaneでは頂点数が4つなので、2乗の計算を行っても線形補間されてしまい、通常のUV値と変わらないものが出力されてしまっています。
真ん中のPlaneは右のPlaneに比べて頂点数が多いため、左のPlaneに近い出力結果となっていますがブロック状の境目がかなり目立ってしまっています。
こういった問題があるので、使用場面はしっかり見極めましょう。
最後に
使用の有無はケースバイケースになるかと思いますが、
使いこなせれば処理負荷の削減に繋がる便利な機能ですので、是非活用してみてください。
最後まで読んでいただきまして、ありがとうございました。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。