本日は昨日に引き続き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言語の部分を見ていきます。