TriPlanar での自然物描画
4 / 4 TriPlanarの実装
このステップの目的
三方向の投影と法線による色の合成を、HLSLの処理と対応付けます。
TriPlanarの実装方法です。
三次元の頂点座標XYZからXY,XZ,YZの三組のUV座標を作り、それぞれでサンプリングした色を面の法線に応じてブレンドします。
頂点座標は通常、ワールド座標かローカル座標のどちらかを選ぶことになります。
以下は、サンプルのTriplanarHLSL.shaderのフラグメント関数から、投影と合成の部分を抜き出したコードです。
hlsl
float3 uv = position * _Tile;
float4 colorX = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv.zy);
float4 colorY = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv.xz);
float4 colorZ = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv.xy);uv.zyはX軸方向から、uv.xzはY軸方向から、uv.xyはZ軸方向からの投影に使います。
次に、法線の各成分の絶対値から重みを作ります。
hlsl
float3 weight = pow(abs(normal), _Blend);
weight /= weight.x + weight.y + weight.z;
float3 color = colorX.rgb * weight.x
+ colorY.rgb * weight.y
+ colorZ.rgb * weight.z;_Blendが1なら、法線の各成分の絶対値をそのまま使います。
値を大きくすると、最も正面に近い投影の割合が高くなります。
その後、各値を合計で割り、重みの合計を1にそろえます。
つまり、一枚のテクスチャーでも三方向から三回読み込むことになります。
Shader Graphでは、このHLSLコードと同等の機能をもつTriplanarノードが提供されており、コーディング無しで利用可能です。
Unity公式のTriplanarノードの説明
Shader GraphでのTriplanarノード利用例
法線マップの補間
法線マップは色ではなく、表面の向きを表すデータです。
三平面はそれぞれX軸、Y軸、Z軸方向からの投影に対応しているため、テクスチャーのサンプリング結果を単純にブレンドするだけでは適切な法線を得られません。
それぞれの投影方向に合わせて変換された法線をブレンドしなければならず、追加の処理が必要です。
Shader Graphでは、TriplanarノードのTypeをNormalにすることで、法線マップ用の処理を使えます。
チェックリスト
- 三組のUV、三回のテクスチャー参照、重み付きの合成を理解した