知識0からのUnityShader勉強

知識0からのUnityShader勉強

UnityのShaderをメインとして、0から学んでいくブログです。

【UnityShader】Shaderで定義されている宣言 #10

前回の成果

soramamenatan.hatenablog.com

テクスチャが貼れるようになった。

今回やること

そろそろコメントであとで理解すると書いてあるところを理解していこうと思います!

LOD

詳しくはこの回

soramamenatan.hatenablog.com

で紹介したのですが、具体的にどのくらいの数値を使用すればいいのかがなかったので補足します。

次の表は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をサポートしていない。

docs.unity3d.com

Decal

vertexLitの一種。
このシェーダーではメインテクスチャとサブテクスチャの2枚を設定できる。
サブテクスチャのアルファチャンネルを利用してメインテクスチャの見える範囲を設定することができ、模様のようにすることができる。

docs.unity3d.com

Reflective VertexLit

注意: Unity 5 ではこのシェーダーは スタンダードシェーダー へと置き換わりました。

反射頂点ライティング - Unity マニュアル:より引用

困る。

docs.unity3d.com

Diffuse

注意: Unity 5 ではこのシェーダーは スタンダードシェーダー へと置き換わりました。

拡散 - Unity マニュアル:より引用

うーん、これも同じ。

docs.unity3d.com

Diffuse Detail

これもスタンダードシェーダーに。
しかし、Reflective VertexLitのように2枚目のテクスチャを用意することができる。
これはカメラが近付くにつれ表示されるようになるので、Terrainのような描画コストの高いものなどに使える。

docs.unity3d.com

Reflective Bumped Unlit

自動車などの金属製の物体の反射面を描画するのにしようします。
このシェーダーはライトの影響を受けないので複数のライトを使用することによるパフォーマンスの低下を受けません。

ws.cis.sojo-u.ac.jp

Bumped

スタンダードシェーダーに置き換わっています。
Diffuseにノーマルマップが追加されているだけ。

docs.unity3d.com

Specular

鏡面反射になります。
詳しくはこちらへ。

soramamenatan.hatenablog.com

Bumped Specular

スタンダードシェーダーに置き換わっています。
名前の通り、BumpedにSpecularが加わっています。
描画コストは少し重めのようです。

docs.unity3d.com

Parallax

視差マッピングのことです。
Bumpedにハイトマップ(高低マップ)を加えたもので、より凹凸や突起を表現することができます。

こちらがバンプマッピング(Bumped)で

f:id:soramamenatan:20190710103912j:plain


こちらが視差マッピングです。

f:id:soramamenatan:20190710103927j:plain

床井研究室 - 第8回 視差マッピング:より引用

2つ並べてあるだけだとよくわからないので、2つを切り替えるgifを用意しました。 f:id:soramamenatan:20190710104905g:plain

このように見ると視差マッピングの方が立体感があります。
描画コストは高めです。

Parallax Specular

ParallaxにSpecularが付与されただけです。

docs.unity3d.com

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 ターゲットとほとんど同じ (後述を参照)

  • Windows Phone で DX11 フィーチャーレベル 9.3 にコンパイルします。

#pragma target 3.0

  • DX9 シェーダーモデル 3.0。デリバティブ指示、テクスチャ LOD サンプリング、Interpolator 10個、より多くの計算とテクスチャの指示が可能です。

  • DX11 フィーチャーレベル 9.x GPU (ほとんどの Windows Phone デバイス) ではサポート無し

  • 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 より前の OpenGLOpenGL 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

  • DX11 シェーダーモデル 5.0.

  • SM5.0 より前の DX11、4.3 より前の OpenGL (つまり Mac)、 OpenGL ES 2.0/3.0/3.1、Metal ではサポートされません。

  • Supported on DX11+ SM5.0, OpenGL 4.3+, OpenGL ES 3.1+AEP, Vulkan, Metal (without geometry), PS4/XB1 consoles.

シェーダーコンパイルターゲットレベル - Unity マニュアル:より引用

シェーダーを使う際によく定義されるのは

#pragma target 3.0

です。
なぜ3.0に指定しているのかというと、大体のモバイル端末がShader Model3.0までは動くからです。

FallBack

これは全てのSub Shaderの実行に失敗した時に""で囲ってあるシェーダーが実行されます。

FallBack "Diffuse"

この場合は固定関数シェーダーであるDiffuseが指定されます。

これで今までブログであとで理解するコメントの部分は理解できたと思います!
今回は以上となります!