「UV展開めんどくさい…」「地形に自然にテクスチャ貼りたい!」
そんなときに便利なのが Bi-Planar Mapping(バイプラナーマッピング)。この記事では、GitHubに公開されているShaderGraphを使って、UnityでBi-Planarシェーダーを実装する方法を紹介します。
Tri-Planarとの比較も交えつつ、使いどころや仕組みもざっくり解説していきます。
Bi-Planar Mappingってなに?
Bi-Planar Mappingは、オブジェクトの法線の方向に基づいて2軸からテクスチャを投影し、滑らかにブレンドする手法です。
特徴:
- ✅ UV展開不要(プロシージャル生成モデルにも強い)
- ✅ 面に沿って自然にテクスチャが貼られる
- ✅ Tri-Planarより軽量(2軸のみ)
🛠 使用するShaderGraph
今回使うのは、作成したこちらのBi-Planar用ShaderGraph:
またShaderGraphに利用してる hlsl が以下
ダウンロードして、Unityのプロジェクトに取り込めばすぐ使えます。
ただ、metaごとDLしない場合は自力でファイル参照をセットしてください
ShaderGraphの中身をちょっとだけ覗く
以下は、ShaderGraph内で使用されている主要な処理の一部。理解しておくと応用しやすくなります。
1. ブレンド係数の計算:CalcBlendWeights
float2 CalcBlendWeights(float3 absNormal, int2 axes, float blendSharpness)
法線の絶対値を使って、どの軸の投影を優先するかブレンド比率を決めます。
2. サンプリングセットアップ:SetupBiPlanarSample
void SetupBiPlanarSample(...)
法線の方向に応じて、2方向からUVを生成し、それぞれのテクスチャをサンプリングします。
3. カラー用マッピング:BiPlanarMapping_float
Out = (texA * weight.x + texB * weight.y) / (weight.x + weight.y);
テクスチャAとBをブレンドして最終カラーを出力。
4. ノーマル用マッピング:BiPlanarNormal_float
Out = normalize(worldNormalA * weight.x + worldNormalB * weight.y);
RNM(Reoriented Normal Mapping)でノーマルマップをワールド空間に変換し、同様に2軸ブレンドします。
Tri-Planarとの比較
Bi-PlanarとTri-Planarの違いは簡単に言うと:
特性 | Bi-Planar | Tri-Planar |
---|---|---|
軽さ | ◎(2軸) | △(3軸) |
滑らかさ | ○ | ◎ |
テクスチャ自然さ | ◎ | ◎ |
処理負荷 | 中〜やや軽め | 高め |
💡 補足:Bi-Planarは2軸方向からのサンプリングとブレンドを行うため、通常のUV展開テクスチャよりは処理が重くなります。ただし、Tri-Planar(3軸分の処理)に比べれば負荷は軽く、パフォーマンスと品質のバランスが良い手法です。
実例:スフィアでの比較
以下は、同じキューブにTri-PlanarとBi-Planarを適用したときの比較例です。
手前がBi-Planar、奥がTri-Planarになっています。
Bi-Planarは2軸のみのブレンドなので、3軸の混ざりが必要な曲面(特に斜め方向)では、少しだけ違和感が出る場合もあります。
まとめ
Bi-Planar Mappingは、軽量でUVいらずなのに自然なテクスチャ表現ができる超便利な手法。ShaderGraphで簡単に導入できるので、地形・壁・プロシージャルモデルなど、いろんな場面でぜひ使ってみてください!