本日は昨日に引き続きShader枠です。
昨日に引き続き先日筆者の所属している会社で行ったShader勉強会の内容をまとめていきます。
〇第四章 ShaderLabの記述
ここからは実際にShaderを記述していきます。
〇環境
・Unity2021.3.5f1
・UniversalRenderPipeline(URP)
本ブログでのチュートリアルはURPで行います。ビルドインでも考え方は一緒ですが、一部シェーダーでエラーが発生する場合があります。
〇Shaderの作成
ShaderはUnityのプロジェクトウィンドウから右クリック、Create→Shader→UnlitShaderを選択します。
Shaderは次のアイコンで作成されます。
ダブルクリックでIDEでファイルを開きます。
作製したシェーダーは次のようになっています。
Shader "Unlit/TutorialShader" { Properties { ・・・ } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { ・・・ }; struct v2f { ・・・ }; ・・・ v2f vert (appdata v) { ・・・ } fixed4 frag (v2f i) : SV_Target { ・・・ } ENDCG } } }
〇Shader名
Shader "Unlit/TutorialShader"{ }
Shaderの冒頭は次のようにShader "●●"の形になっています。
これはこのシェーダーの名前になり、今回作成したUnlit/TutorialShaderはマテリアルのシェーダーのネームスペースになります。
〇Propetiesブロック
Properties//マテリアルに表示されるパラメータ(Public変数) { _MainTex ("Texture", 2D) = "white" {} }
このブロックでは記載したパラメータをマテリアルのパラメータとしてUnityインスペクタやC#などで変更可能な形で記述することができます。
一般的なプログラム言語のPublic変数に相当しています。
〇SubShader
SubShader//Shader本体 { Tags { "RenderType"="Opaque" }//Shader属性 透明度を持たせたい場合はTransparentなどを定義する。 LOD 100//GPUなどでパフォーマンスがない場合この数値に応じて別のSubShaderを用意してそちらを使用させることができる。 Pass//Shaderのパス { CGPROGRAM ・・・ ENDCG } }
SubShaderはShader本体を記述するブロックです。
SubShader内はLOD(Level of detail)を定義することができ、この値に応じてデバイスごとに1つのSubShaderが実行されています。
つまりデバイスの性能に応じて優先度を変えることができるSubShaderを複数定義できます。
〇Pass
Pass//Shaderのパス { CGPROGRAM ・・・ ENDCG }
SubShadferではデバイスごとに排他的に一つの処理が実行されていますが、Passは複数記述した場合複数実行されています。
つまり2つのパスを記述した場合1フレームで2回×ピクセル数の計算処理が行われるという意味を指しています。
これは例えば、一つ目のパスでアウトラインを描画して、二つ目のシェーダーで本体のシェーダーを記述するといったことができます。
〇CGPROGORAM~ENDCG
CGPROGRAM ・・・ ENDCG
もしくは近年では次のような形式も見られます。
HLSLPROGRAM ・・・ ENDHLSL
ShaderLabはUntiy独自の構文ですが、この間はShaderLabの構文ではなくhlsl言語で記述されています。
ここまでがShaderLabの内容になります。
次回はHLSL言語の部分を見ていきます。