本日は昨日に引き続きShader枠です。
昨日に引き続き先日筆者の所属している会社で行ったShader勉強会の内容をまとめていきます。

〇第三章 UnityでのShaderタイプ
さて、前回、前々回でShaderに関して目的としているものやどのような処理を行っているかを簡単に説明しました。
ここからは実際にUnityでShaderを扱っていきます。
まずはUnityでのShaderのタイプを紹介します。
Unityでは大きく分けるとプログラムを記述するコードベースのShaderと、プログラム言語の知識を必要とせずにノードと呼ばれるブロックをつなぎ合わせて構築するノードベースのShaderがあります。
この中でもさらに種類があります。
〇コードベースのShader

コードベースのシェーダーはC#同様IDEを用いてコードを記述します。

このタイプはUnityのShader構文であるShaderLabを用いたものとComputerShaderがあります。
〇ShaderLab
ShaderLabはShaderをUnityのマテリアルと紐づけるためにある独自の構文です。
ShaderLabは.shaderであらわされるファイルで、この中でcg/HLSL言語を使用してプログラムを記述します。
この際に使用される関数で多用されるものとしてSurfaceシェーダー、vertex&(Geometry&)Fragmentシェーダーがあります。
SurfaceシェーダーはUnityが独自に用意しているシェーダー関数で、ライティングなどを気にすることはなく比較的簡単に記述できます。
struct Input {
float4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = 1;
}
注意点としてURPでは使用できません。
対してVertex&(Geometry&)Fragmentシェーダーは第二章で紹介したグラフィックスパイプラインのシェーダーステージに基づき実行されている処理を記述します。
#pragma vertex vert
#pragma fragment frag
・・・
v2f vert (appdata v)//VertexShaderステージでの処理
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target//FragmentShaderステージでの処理
{
half d = _Amount;
fixed4 col = fixed4(0,0,0,0);
return col;
}
筆者は後者のvertex&fragmentシェーダーの形を理解して使用することを強く推奨しています。
〇ComputerShader
ComputerShaderはShaderと名は付くものの描画を行うシェーダーではありません。
正確にはジオメトリーシェーダーの代わりに使用されることはありますが、GPUの演算能力を用いて描画計算以外の計算も行おうというGPGPU(GeneralPurposeGPU)の一種になります。
こちらはShaderと名前がついているためこちらで紹介していますが詳細に関してはここでは説明しません。
〇ノードベースのシェーダー
ノードベースのシェーダーは大きくUnityに組み込みのShaderGraphとAmplifyShader2種類あります。
AmplifyShaderは有料のエディタツールです。
正直筆者は触ったことがないので今回は省略します。
Amplify Shader Editor | ビジュアルスクリプティング | Unity Asset Store
ShaderGraphはノードと呼ばれる各処理のGPUブロックをつなげていくことでノンコーディングでシェーダーを構築できます。

こちらの出力を見るとVertexとFragmentの二つのブロックがありこれは頂点シェーダー、フラグメントシェーダーのそれぞれに対応しています。

つまり本質的にはShaderGraphもコードで記述するシェーダーも同じものであるということが言えます。
今回はUnityでのShaderのタイプに関して紹介しました。