UVマッピングを行わずに、自動で地形や岩石にシームレスなテクスチャを貼り付けるTriplanarシェーダーで発生する斜面の引き伸ばしを解消します。
不具合の症状と具体的な現象
Shader Graphで **Triplanar(三面投影)** ノードを使用して、UV展開が困難な3Dモデル(広大な地形、洞窟の壁面、ゴツゴツした岩肌など)にテクスチャを投影する際、特定の場所で以下のような描画の乱れが生します。
- 傾斜が緩やかな場所ではきれいにテクスチャが表示されるが、急な崖やほぼ垂直に近い斜面になると、テクスチャが縦方向や横方向にビヨーンと不自然に引き伸ばされて見える(ストレッチ現象)。
- テクスチャの解像度がストレッチ部分だけ極端に低下し、ぼやけた線状のパターンが目立ってしまう。
- ポリゴンの境目でテクスチャが突然切り替わり、不自然な継ぎ目がくっきりと現れてしまう。
初心者向けの例え話:3方向のプロジェクターと斜めの壁
このストレッチ現象の原因と対策を理解するために、Triplanarマッピングを「暗い部屋の中で、3台のプロジェクターを使って、複雑な形の岩の彫刻にスライド写真を映し出している状態」に例えてみましょう。
1台目のプロジェクターは真上(Y軸)から床に向かって、2台目は正面(Z軸)から、3台目は真横(X軸)から、それぞれ同じテクスチャ模様を彫刻に向かって投影しています。もし彫刻の面が真上を向いていれば、真上のプロジェクターの光がまっすぐ当たるので、歪みのないきれいな模様が見えます。同様に、真横を向いている垂直な壁なら、真横のプロジェクターの光が垂直に当たるためきれいに見えます。
問題は、「斜め45度を向いている崖の斜面」です。この斜面に対しては、真上のプロジェクターの光も、真横のプロジェクターの光も、どちらも斜めに当たることになります。懐中電灯の光を壁に斜めから当てると、光の円が楕円形に長く引き伸ばされて歪んでしまいますよね。これがテクスチャのストレッチバグの正体です。
これを解決するための `Blend` パラメータ は、「2台のプロジェクターの光が重なる部分の境界線をぼかして、滑らかに混ぜ合わせる機能」です。Blendの値を大きくすることは、プロジェクターのレンズのボケ足を広げて、お互いの歪んだ部分を打ち消し合うようにグラデーションをかけてきれいにオーバーラップさせることに相当します。また、彫刻の表面の細かい凹凸(法線情報)を伝えることで、光の当たる角度を自動補正できるようになります。
想定される主な原因
Triplanarノードでのストレッチ現象は、以下の2つの設定不足によって引き起こされます。
- Blend(ブレンド値)が低すぎる: Triplanarノードの `Blend` パラメータは、投影軸(X, Y, Z)の切り替わり部分をどの程度重ね合わせて混ぜるかを決定します。デフォルト値の `1.0` ではブレンド境界がシャープすぎるため、投影角度が厳しく歪んだ部分がそのまま画面に露出してしまいます。
- Normal(法線入力)が未接続: ノードの `Normal` 入力が空のままだと、シェーダーは各ピクセルの正確な法線(傾き)ではなく、簡略化された頂点法線情報のみを使用して投影ウェイトを計算します。これにより、メッシュの細かな凹凸部分でブレンドが正常に行われず、引き伸ばしが目立ちます。
具体的な解決方法と手順
Shader Graph内で **Triplanar ノード** の設定と接続を以下のように修正します。
手順1:Blend値の引き上げ(最も重要)
Triplanar ノードを選択し、パラメータインスペクターで **`Blend`** の値をデフォルトの `1.0` から **`5.0` 〜 `8.0`** 程度に引き上げます。値を大きくするほど、投影される3面のテクスチャが滑らかなグラデーションで重なり合い、ストレッチしている中間領域がブレンドによって隠され、人間の目には均一なテクスチャに見えるようになります。
手順2:Normal (Input) への法線ベクトルの接続
シェーダーグラフ内に **`Normal Vector`** ノードを新たに配置し、その空間設定を **`World`** (ワールドスペース) に設定します。このノードの出力を、Triplanar ノードの **`Normal (Input)`** ポートへ接続します。これにより、ピクセルレベルでの正確なポリゴンの傾きが計算に反映され、三面サンプリングのブレンド境界が非常に正確に補正されます。
手順3:タイリングとスケールの最適化
Triplanarノードの `Tile` 入力に適切な値を入力し、テクスチャの密度を調整します。また、接続する3Dモデルの `Transform` のスケールが正しく適用されているか確認し、オブジェクト空間ではなくワールド空間基準での投影を行います。
実務向けテクスチャストレッチ防止チェックリスト
| 確認項目 | 理想的な設定状態 | 効果とメリット |
|---|---|---|
| Blend パラメータ | 5.0 〜 8.0 の範囲で調整されている | 斜面のテクスチャ引き伸ばしをブレンドで滑らかに隠蔽する。 |
| Normal 入力ポート | `Normal Vector (World Space)` が接続されている | ピクセルの傾きを加味した正確な三面サンプリングを行う。 |
以下は、Triplanarマッピングにおけるブレンドウェイトの計算を数学的に表現し、シェーダーグラフの計算を最適化するためにカスタムHLSLとして記述したコードブロックです。
// Triplanarマッピングの3軸投影ブレンドウェイトを計算するカスタム関数
void CalculateTriplanarWeights_float(
float3 worldNormal, // ワールド空間の法線ベクトル(入力)
float blendPower, // ブレンドの鋭さ。5.0〜8.0を推奨(入力)
out float3 blendWeights // 3軸のブレンド比率(出力)
)
{
float3 absNormal = abs(worldNormal);
float3 weights = pow(absNormal, blendPower);
blendWeights = weights / (weights.x + weights.y + weights.z);
}
このTriplanarノードのブレンド設定と法線接続をマスターすることで、アーティストがメッシュごとに手動でUV展開を行う膨大な時間を節約しつつ、どこから見ても継ぎ目がなく歪みのない美しいマテリアルを素早く地形や障害物アセットに適用できるようになります。背景グラフィックスのクオリティアップにおいて、非常に効果の高いプロシージャル手法です。