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のアップデートをやっていこうと思う~
Unity5のサーフェイスシェーダー
昨日の続きでUnity5のサーフェイスシェーダー内部を覗いてみた。
PBRに対応するため内部で面倒なことをしていると思い込んでいたら、まるごとすっきりとリメイクされている模様。
よってほとんど説明する内容が無い・・・。
Shader "Custom/NewShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Vertex/FragmentシェーダーをPBRで書く必要が無い限りは物理ベースの計算を隠蔽したままコーディングができそうな気配!
これはありがたい・・・。
Unity5のCustomShaderの互換性
昨日の記事に引き続き、まずはPBRの部分を無視してShader機能の互換性について調査。
アップデート時の注意点をまとめてみた。
・ライトの光の強度が2倍になったよ
・サーフェイスシェーダのインタポレーターと命令数の増加でSM2.0だと命令数リミットにより動作しない可能性があるよ→問題が出たらSM3.0にしてみたら?
・ノンユニフォームメッシュはCPUの段階で事前スケールされなくなったことにより NormalやTangentベクトルのNormalizeの必要性がでたよ(サーフェイスシェーダーの場合は生成してくれる)
・フォグの描画タイミングを変更 #pragmaにnofogと表記することで明示的にフォグのサポート状況を管理できるようになったよ
・サーフェイスシェーダーのAlphaチャンネルにデフォルトで1.0が出力されるようになったよ
・パフォーマンス改善のためForward描画中にマテリアルインデックス順に描画していた仕様を変更→ソートは行わないためインデックスに依存した仕様だった場合は注意ね
・見たこともないいくつかの固定関数シェーダーの廃止(使ったら警告がでる)
・プログラマブルシェーダーと固定関数シェーダーの併用ができなくなったよ
・シェーダーコンパイラが変更され少し速くなったよ
・変数「unity_Scale」は廃止するから 今後はWorldスペースに変換してスケール行列を適用してね
・Forwardで描写された影のEffectPass(ShadowCollectorパス)の処理は移動したので古いパスは削除して問題ないよ
結構深いことをしていないとクリティカルな問題は生じなそうな変更点ですね。
UnityからGPUに渡す部分をシンプルにしたい思惑が見て取れます。
Unity5のCustomShader
Unity5でPBRが導入されてカスタムシェーダの書き方に関する最新の記事を探していたんですが
Unity5の公開当初はまったくといっていいほど情報がありませんでした。
情報が出るのを待っていたんですが、仕事が忙しくなってしまいなかなかチェックができていませんでした。
ようやく時間がとれるようになってきたのでネットサーフィンしてみると以前全く見つからなかった情報がチラホラと。
http://docs.unity3d.com/Manual/UpgradeGuide5-Shaders.html
http://www.alanzucconi.com/2015/06/24/physically-based-rendering-and-lighting-models-in-unity3d/
相変わらず日本語資料は皆無です。
PBRのシェーディングの概要は理解しているつもりなのですが、計算部分まで学習してしまうか悩ましいところです。
(覗いてもいないのでどのくらいのハードルなのか分からないし怖い・・・。)
まだ資料は読んでないのですが、Terrain専用のカスタムシェーダーの作成を目標に動き出すことにしました。
(以前、サークルのレベルデザイナー担当の方が、Terrainの思索段階で何度もテクスチャペイントを使って雰囲気を出しては作り直して~という作業を行っていたのを見て、TerrainShaderを書いてみたいと思っていました。)
UnityのTerrainはシェーダの構造が特殊でマテリアルのものを移植できないみたいなので、そのあたりも資料を集めねば。