【UnityShader】Shaderで定義されている宣言 #10
前回の成果
テクスチャが貼れるようになった。
今回やること
そろそろコメントであとで理解すると書いてあるところを理解していこうと思います!
LOD
詳しくはこの回
で紹介したのですが、具体的にどのくらいの数値を使用すればいいのかがなかったので補足します。
次の表はUnityのビルドインシェーダーのLODです。
用途 | LODの値 |
---|---|
VertexLit | 100 |
Decal,Reflective VertexLit | 150 |
Diffuse | 200 |
Diffuse Detail,Reflective Bumped Unlit | 250 |
Bumped,Specular | 300 |
Bumped Specular | 400 |
Parallax | 500 |
Parallax Specular | 600 |
となっています。
簡単に1つ1つ説明していこうと思います。
vertexLit
最も早いレンダリングパス。
ただし、頂点のみで計算が行われるため、影
法線、Specularをサポートしていない。
Decal
vertexLitの一種。
このシェーダーではメインテクスチャとサブテクスチャの2枚を設定できる。
サブテクスチャのアルファチャンネルを利用してメインテクスチャの見える範囲を設定することができ、模様のようにすることができる。
Reflective VertexLit
注意: Unity 5 ではこのシェーダーは スタンダードシェーダー へと置き換わりました。
困る。
Diffuse
注意: Unity 5 ではこのシェーダーは スタンダードシェーダー へと置き換わりました。
拡散 - Unity マニュアル:より引用
うーん、これも同じ。
Diffuse Detail
これもスタンダードシェーダーに。
しかし、Reflective VertexLitのように2枚目のテクスチャを用意することができる。
これはカメラが近付くにつれ表示されるようになるので、Terrainのような描画コストの高いものなどに使える。
Reflective Bumped Unlit
自動車などの金属製の物体の反射面を描画するのにしようします。
このシェーダーはライトの影響を受けないので複数のライトを使用することによるパフォーマンスの低下を受けません。
Bumped
スタンダードシェーダーに置き換わっています。
Diffuseにノーマルマップが追加されているだけ。
Specular
鏡面反射になります。
詳しくはこちらへ。
Bumped Specular
スタンダードシェーダーに置き換わっています。
名前の通り、BumpedにSpecularが加わっています。
描画コストは少し重めのようです。
Parallax
視差マッピングのことです。
Bumpedにハイトマップ(高低マップ)を加えたもので、より凹凸や突起を表現することができます。
こちらがバンプマッピング(Bumped)で
こちらが視差マッピングです。
床井研究室 - 第8回 視差マッピング:より引用
2つ並べてあるだけだとよくわからないので、2つを切り替えるgifを用意しました。
このように見ると視差マッピングの方が立体感があります。
描画コストは高めです。
Parallax Specular
ParallaxにSpecularが付与されただけです。
SubShader
SurfaceShaderやVertexShader、FragmentShaderといったShader本体を記述する箇所となっています。
他にもレンダリングパスの一覧やパス共通のStateを設定する箇所でもあります。
CGPROGRAM
Cg言語でこれから記述していきますという意味です。
Cg言語は今まで記述してきたシェーダーを使用するための言語のことです。
ENDCG
記述が終わりましたよという意味です。
上のCGPROGRAMとはセットで使います。
#pragma target
この宣言の後に数字をつけていたのですがこの数字には意味があります。
よく使用される3.0以外は流し見で良いです。
#pragma target 2.0
Unity でサポートされるすべてのプラットフォームに使用できます。
DX9 シェーダーモデル 2.0 制限された計算とテクスチャの指示。
Interpolator 8個、頂点テクスチャサンプリング 無し、フラグメントシェーダーのデリバティブ 無し、明示的 LOD テクスチャサンプリング 無し。
#pragma target 2.5 (デフォルト)
依然として補間が 8 しかない点、明白な LOD テクスチャサンプリングがない点 を除いて 3.0 ターゲットとほとんど同じ (後述を参照)
#pragma target 3.0
DX9 シェーダーモデル 3.0。デリバティブ指示、テクスチャ LOD サンプリング、Interpolator 10個、より多くの計算とテクスチャの指示が可能です。
OpenGL ES 2.0 デバイスのなかには、使用されるドライバ拡張と機能によって完全にはサポートしないものがあります。
#pragma target 3.5 (または es3.0)
OpenGL ES 3.0 機能 (D3D プラットフォームの DX10 SM4.0、ジオメトリシェーダーのみ含まれない)
DX11 9.x (WinPhone) と OpenGL ES 2.0 ではサポートされません。
DX11 以降、OpenGL 3.2 以降、OpenGL ES 3 以降、Metal、Vulkan,、PS4/XB1 コンソールでサポートされます。
シェーダー、テクスチャ配列などのネイティブ整数オペレーション
#pragma target 4.0
DX11 シェーダーモデル 4.0 DX11 9.x (WinPhone)、OpenGL ES 2.0/3.0/3.1、Metal ではサポートされません。
DX11 以降、OpenGL 3.2 以降、OpenGL ES 3.1 以降のAEP、Vulkan, PS4/XB1 コンソールでサポートされます。
ジオメトリシェーダーと es3.0 ターゲットが持つすべてが含まれます。
#pragma target 4.5 (または es3.1)
OpenGL ES 3.1 機能 (D3D プラットフォームの DX11 SM5.0、テッセレーションシェーダーのみ含まれない)
SM5.0 より前の DX11 、4.3 より前の OpenGL (つまり Mac) 、OpenGL ES 2.0/3.0 はサポートされません。
DX11 以降の SM5.0、OpenGL 4.3 以降の OpenGL ES 3.1、Metal、Vulkan、PS4/XB1 コンソールでサポートされます。
コンピュートシェーダー、ランダムアクセステクスチャ書き込み、atomics などが含まれます。ジオメトリシェーダーとテッセレーションシェーダーは含まれません。
#pragma target 4.6 (または gl4.1)
OpenGL 4.1 機能 (D3D プラットフォームの DX11 SM5.0、コンピュートシェーダーのみ含まれない)。基本的には、これが最高レベル。 Mac にサポートされる OpenGL レベル
SM5.0 より前の DX11、4.1 より前の OpenGL、OpenGL ES 2.0/3.0/3.1、Metal ではサポートされません。
Supported on DX11+ SM5.0, OpenGL 4.1+, OpenGL ES 3.1+AEP, Vulkan, Metal (without geometry), PS4/XB1 consoles.
#pragma target 5.0
シェーダーを使う際によく定義されるのは
#pragma target 3.0
です。
なぜ3.0に指定しているのかというと、大体のモバイル端末がShader Model3.0までは動くからです。
FallBack
これは全てのSub Shaderの実行に失敗した時に""で囲ってあるシェーダーが実行されます。
FallBack "Diffuse"
この場合は固定関数シェーダーであるDiffuseが指定されます。
これで今までブログであとで理解するコメントの部分は理解できたと思います!
今回は以上となります!