Triplanar ノード
説明
Triplanar は、ワールド空間への投影によって UV 生成とテクスチャサンプリングを行う方法です。入力 Texture は 3 回 (ワールドの x、y、z 軸で各 1 回ずつ) サンプリングされ、結果の情報はモデル上に平面的に投影され、法線あるいはサーフェスの角度でブレンドされます。生成された UV は入力 Tile でスケール可能で、最終的なブレンドの強度は入力 Blend で制御されます。Blend は、法線が各平面サンプルのブレンドにどのような影響を与えるかを制御し、これは 0 以上である必要があります。Blend の値が大きいほど、最も法線の向きに合った平面からより多くの影響がサンプルに与えられます。(最大ブレンド指数は、プラットフォームとノードの精度によって、17 から 158 までの間になります。) 0 のブレンドでは法線の向きに関わらず各平面のウェイトが同等になります。投影は入力 Position および Normal をオーバーライドすることで修正できます。これは一般的に、地形などの大きなモデル (これらで、UV 座標を手動で作成すると問題やパフォーマンス上効率が悪くなる原因になります) にテクスチャを付けるために使用されます。
入力 Texture の有効なタイプはドロップダウンメニュー Type で切り替え可能です。Normal に設定すると、法線がワールド空間に変換されるので、新しい接線を構築した上で出力前に接線空間に変換し戻すことが可能になります。
注意: このノード は、Fragment (フラグメント) シェーダーステージ でのみ使用可能です。
ポート
Name | Direction | タイプ | バインディング | 説明 |
---|---|---|---|---|
Texture | 入力 | Texture | なし | 入力テクスチャの値 |
Sampler | 入力 | サンプラー状態 | なし | 入力 Texture のサンプラー |
Position | 入力 | Vector 3 | ワールド空間位置 | フラグメント位置 |
Normal | 入力 | Vector 3 | ワールド空間法線 | フラグメント法線 |
Tile | 入力 | Vector 1 | なし | 生成された UV のタイリングの量 |
Blend | 入力 | Vector 1 | なし | 異なるサンプル同士のブレンドの因子 |
Out | 出力 | Vector 4 | なし | 出力値 |
制御
Name | タイプ | オプション | 説明 |
---|---|---|---|
タイプ | ドロップダウン | Default、Normal | 入力 Texture のタイプ |
生成されるコードの例
以下のサンプルコードは、このノードの出力の一例を示したものです。
Default
float3 Node_UV = Position * Tile;
float3 Node_Blend = pow(abs(Normal), Blend);
Node_Blend /= dot(Node_Blend, 1.0);
float4 Node_X = SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.zy);
float4 Node_Y = SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.xz);
float4 Node_Z = SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.xy);
float4 Out = Node_X * Node_Blend.x + Node_Y * Node_Blend.y + Node_Z * Node_Blend.z;
Normal
float3 Node_UV = Position * Tile;
float3 Node_Blend = max(pow(abs(Normal), Blend), 0);
Node_Blend /= (Node_Blend.x + Node_Blend.y + Node_Blend.z ).xxx;
float3 Node_X = UnpackNormal(SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.zy));
float3 Node_Y = UnpackNormal(SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.xz));
float3 Node_Z = UnpackNormal(SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.xy));
Node_X = float3(Node_X.xy + Normal.zy, abs(Node_X.z) * Normal.x);
Node_Y = float3(Node_Y.xy + Normal.xz, abs(Node_Y.z) * Normal.y);
Node_Z = float3(Node_Z.xy + Normal.xy, abs(Node_Z.z) * Normal.z);
float4 Out = float4(normalize(Node_X.zyx * Node_Blend.x + Node_Y.xzy * Node_Blend.y + Node_Z.xyz * Node_Blend.z), 1);
float3x3 Node_Transform = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);
Out.rgb = TransformWorldToTangent(Out.rgb, Node_Transform);