ゲームエフェクトデザイナーのブログ (新)

レポート記事とかUE4のマテリアルとか。C#とかも触ったり。

UE4 Dotproductでテクスチャのチャンネルを指定する

UE4のマテリアルで、テクスチャのRGBAのどのチャンネルを使うかをマテリアルインスタンスで指定したい場合があります。

そんな時、Static Component Mask Parameterを使った場合はこちらのように構成すると‥

f:id:moko_03_25:20180514010533j:plain

マテリアルインスタンスチェックボックスを変えることで自由に指定できます。

f:id:moko_03_25:20180514010538j:plain

しかしStatic Switch Parameterを使った場合と同様に、チェックボックスを変更すると別シェーダーとなり親マテリアルと同じデータサイズになってしまうという注意点があります。

この問題についてはEpic Games Japan篠山さんのスライドが詳しいです。

この問題を把握している上でStatic Component Mask Parameterを使用する分には良いと思いますが、代替えに良い方法があります。

それはDotproduct内積)ノードを使う方法です。

テクスチャとConstantノードをDotで掛け合わせるだけです。
この時、テクスチャとConstantノードはチャンネル(要素)の数を合わせておきます。

Dotでどのような計算が行われているかというと、テクスチャのRとConstant 4VectorのRを乗算、GとGを乗算、BとBを乗算、AとAを乗算、それらを全て足す‥という感じです。下図のConstantノードはR以外0が入っているのでR同士の乗算の結果だけが残るという訳です。

f:id:moko_03_25:20180514011443j:plain

そしてConstantノードをパラメータ化することで、マテリアルインスタンスで自由にチャンネルを指定することができます。内積がこんなところでも役に立つとは!

f:id:moko_03_25:20180514011836j:plain

こちらのテクニックはUE4標準のNormalFromHeightmap関数で使われています。

以上、知っておくと便利と思う小技でした!