初めに
平面の板や、3Dモデルをインポートした際に面が裏返っており、マテリアルの設定でTwoSidedをオンにして対応する場合はあるかと思います。その際にTwoSidedをオンにしただけではUVが反転したままになってしまうのでその際の対策になります。
環境情報
Windows 11
UE 5.3.2
実装
まずは不要かもしれないですが、単純にTwoSidedを行っただけの状態です。
ただTwoSidedを有効にしただけだと裏面はUが反転した状態になってしまいます。
なので裏面だけUを反転させる処理を行うMaterial Functionを作成します。
こちらがUのみ反転処理行うものです。
Input UVにはUV値を入力として渡します。
入力値をUとVに分けるためにComponent MaskでRチャネル(U)とGチャネル(V)に分けます。
Rチャネルに対して反転させるためにOneMinusを挟みます。
表面なのか裏面なのかを判定させるためにTwoSidedSignを使います。
TwoSidedSignは表面の場合は1を返し、裏面の場合は-1を返します。
U値に対してOneMinusを適用するかをLerpで分けているので、TwoSidedSignに対してStepを通すことで表面=1、裏面=0になるようにしていますがLerpの代わりにIfを使う方法もあるので必ずこの構成にする必要はないです。
作成したMaterial Functionを適用してみると下図のような感じになります。
無事に裏面の反転ができるようになりました。
ノーマルマップに対して調整を行う
Uだけを反転させるMaterial Functionを作成しましたが、この処理だけだとノーマルマップの表現が裏面で少し異なります。
試しにノーマルマップを適用してみた例が下図です。
少し分かり辛いですが、凹凸表現が表面と裏面で異なります。
これはUを反転しても法線方向を反転したわけではないため凹凸表現として裏面のまま、つまり表面に対してちょうど凹凸が反転している状態になっています。
なのでノーマルマップに対しては裏面の凹凸表現を反転させる必要があります。
以下がノーマルマップに対して凹凸表現を反転させる処理を行うMaterial Functionです。
InputとしてはNormalMapのRGBを受け取るようにしています。
ノーマルマップではGチャネルがBitangent(表面の縦方向)に該当するのでこちらに対してTwoSidedSignを掛け合わせることで裏面の凹凸表現を反転させることができます。
作成したMaterial Functionを組み込むと下図のようになります。
このように裏面の凹凸も表面と同じにすることができます。
注意事項
今回作成したUを反転する処理は必ずTransformを変更する前に適用してください。
元々のUを基準に計算したTransformに対して後からUを反転する処理を入れても変更したTransform分に対しては適用されません
TwoSidedSignはピクセルシェーダーでしか使えません。
カスタムUVなどの頂点シェーダーに対しては使えないので注意してください。
上記のTransformとの話にもなりますが、UnrealEnginでのマテリアルの計算は頂点シェーダー→ピクセルシェーダーの順番で行われます。
通常のMaterial Attributeはピクセルシェーダーの計算になりますがカスタムUVは頂点シェーダーで計算されるので、カスタムUVの方でTransformを変更していないかにも気を付けてください。