PBRShader for UnityTerrain
結論から言うと恐らく現状ではPBR対応のサーフェイスシェーダーをTerrainのCustomShaderとして利用することはできない
http://forum.unity3d.com/threads/terrain-pbr.276734/
Unity Technologiesによると公式にて近日中に対応予定。とのこと。
PBRに拘らなければCustomShaderを適用したMaterialをTerrainの設定画面から指定することができた。
以下は角度によってテクスチャを自動で切り替えるシェーダーを適用した例
ただしTangentVectorが取得できない等Terrain特有の癖が分かるまではUnity上で細かくデバッグしながら作成したほうが良さそう。
シェーダーからTerrainのInspector内の PaintTexture にアクセスしたい場合は以下を記述する。
(4つのテクスチャが登録されていると過程)
プロパティ内
[HideInInspector] _Splat3("Layer 3 (A)", 2D) = "white" {}
[HideInInspector] _Splat2("Layer 2 (B)", 2D) = "white" {}
[HideInInspector] _Splat1("Layer 1 (G)", 2D) = "white" {}
[HideInInspector] _Splat0("Layer 0 (R)", 2D) = "white" {}
[HideInInspector] _Normal3("Normal 3 (A)", 2D) = "bump" {}
[HideInInspector] _Normal2("Normal 2 (B)", 2D) = "bump" {}
[HideInInspector] _Normal1("Normal 1 (G)", 2D) = "bump" {}
[HideInInspector] _Normal0("Normal 0 (R)", 2D) = "bump" {}
入力部分の構造体の例
struct Input {
float2 uv_Sample;
float2 uv_Main : TEXCOORD0;
float2 uv_Splat0 : TEXCOORD1;
float2 uv_Splat1 : TEXCOORD2;
float2 uv_Splat2 : TEXCOORD3;
float2 uv_Splat3 : TEXCOORD4;
};
変数宣言部でサンプラーを利用できるようにする
uniform sampler2D _Splat0,_Splat1,_Splat2,_Splat3;
サーフェイスシェーダー内部でのアクセス方法
tex2D(_Splat0, IN.uv_Splat0)
グーグル上で資料が増えたこともあって、シェーダーまわりの知りたいことは一通り調査が終わった!
次はずっとしたかったのにできなかったSubstanceDesignerとPainterのアップデートをやっていこうと思う~