うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】ShaderGraph で Bi-Planar Mapping を実装してみた

「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:

👉 Bi-Planar.shadergraph

またShaderGraphに利用してる hlsl が以下

👉 Bi-Planar.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で簡単に導入できるので、地形・壁・プロシージャルモデルなど、いろんな場面でぜひ使ってみてください!