前回、Unity で自作のシェーダーを作成するため Unlit Shader を新規作成し、 Visual Studio でその初期のプログラムを確認しました。
前回の記事:Unity シェーダーの新規作成とプログラミングの始め方 | Compota-Soft-Press
今回は、Unlit Shader の初期のプログラムを調べ、キーワードを説明し、プログラムの構造を紹介します。
※ Unity は 2021.3.14f1、Test Framework パッケージは Version 1.1.33、Visual Studio は Community 版 Version 17.2.5、 OS は Windows 10 です。
Unlit Shader 初期プログラムのキーワード
初期プログラム(テンプレート)で使われているキーワードについて、登場する行が早い順に説明します。
Shader
公式サイトから引用します。
Shader コマンドはシェーダーの名前の文字列を含んでいます。 シェーダーを Material インスペクターで選択するとき、スラッシュ(/) を使うとサブメニューにシェーダーを配置できます。
https://docs.unity3d.com/ja/2021.3/Manual/SL-VertexFragmentShaderExamples.html
1行目に書かれている今回の Shader の文は、
Shader "Unlit/SCTilemapShadowUnlitShader"
なので、Unlit カテゴリの SCTilemapShadowUnlitShader という名前のシェーダを定義します。
Properties ブロック
公式サイトの引用です。
Properties ブロックには、 マテリアルの一部として保存されマテリアルインスペクターに表示される、 シェーダー変数 (テクスチャ、色など) が含まれています。 Unlit シェーダーテンプレートでは、1 つのテクスチャプロパティが宣言されています。
https://docs.unity3d.com/ja/2021.3/Manual/SL-VertexFragmentShaderExamples.html
Unlit Shader のテンプレート(初期プログラム)では、ブロック内にひとつシェーダー変数が含まれています。
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
_MainTex については、マテリアルで設定するテクスチャに対応していて、既定では white という内蔵テクスチャを用います。
参照:Effectiveさお
SubShader ブロック
ブロックという分類については「ShaderLab: SubShader の定義 – Unity マニュアル」を参照してください。
公式サイトの引用です。
シェーダーは、1 つ以上のSubShaderを持つことが可能です。 SubShader は主に、シェーダーを異なる GPU 能力に合わせて実装するために使用されます。
https://docs.unity3d.com/ja/2021.3/Manual/SL-VertexFragmentShaderExamples.html
GPU などの環境条件や用途ごとに SubShader ブロックを複数作成でき、環境や用途に応じて最適な SubShader が選択されます。
参照:Unityシェーダプログラム入門 UnlitShaderの要素を全て解説|アマガミナブログ
Tags ブロック
公式サイトの引用です。
タグは、データのキーと値のペアです。Unity は、事前定義されたキーと値を使用して、指定されたSubShader をいつどのように使用するかを決定します。または、カスタム値を使用して独自のカスタム SubShader タグを作成することもできます。C# コードから SubShader タグにアクセスできます。
https://docs.unity3d.com/jp/current/Manual/SL-SubShaderTags.html
LOD ブロック
公式サイトの引用です。
LOD 値をサブシェーダーに割り当てることができます。この値は、計算負荷を示します。
ランタイムでは、シェーダーの LOD 値を単一のシェーダーオブジェクト、またはすべてのシェーダーオブジェクトに設定することができます。Unity は LOD 値が低いサブシェーダーを優先します。Unity がサブシェーダーを使用するタイミングをどのように選択するかについては、シェーダーオブジェクト: レンダリング時の操作順序 を参照してください。
https://docs.unity3d.com/jp/current/Manual/SL-ShaderLOD.html
Pass ブロック
ブロックという分類については「ShaderLab: パスの定義 – Unity マニュアル」を参照してください。
公式サイトの引用です。
各 SubShader は複数の Pass (パス) で構成されています。各パスはシェーダーのマテリアルとレンダリングされるオブジェクトの頂点コードとフラグメントコードの実行を表しています。
https://docs.unity3d.com/ja/2021.3/Manual/SL-VertexFragmentShaderExamples.html
Pass の中では、vert 関数による頂点シェーダーの処理と flag 関数によるピクセルシェーダーの処理を定義できます。
それらの関数で用いる構造体を struct で宣言できます。
以下は、初期プログラムの struct, vert 関数, flag 関数の抜粋です。
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
Pass ブロックの始まりと終わりに CGPROGRAM と ENDCG があります。
その範囲は Cg 言語で記述されます。 Cg 言語は GPU で描画処理を行う Shader 用の言語です。
HLSL 言語とほぼ同義です。
参照:Unityで使用するシェーダー言語 – Unity マニュアル
さきほどの Propertis ブロックは ShaderLab という Unity 独自の言語です。
参照:【Unity】 スクリプトで始めるUnity Shaderの基礎2019 (1) – Qiita
Unlit Shader 初期プログラムの構造
実装の中身をはぶき、構造だけを見ると次のようになります。
描画処理の中心は頂点シェーダー処理の vert 関数、ピクセルシェーダー処理の flag 関数になります。
それらが用いる構造体を事前に struct で宣言しています。
Pass は上記の記述によりレンダリングするほかに、レンダリングエンジンに name と tag を使って Pass の意図を伝えたり、レンダリングステートの設定を行います。
参照:ShaderLab: Pass – Unity マニュアル
SubShader は GPU 環境や用途ごとに複数記述でき、実行環境に応じた SubShader が選ばれます。
Properties はマテリアルの設定で行えるシェーダー変数を宣言します。
Shader コマンドは、前述した機能や構造体、変数を持つシェーダーのカテゴリと名前を定義します。
まとめ
今回は、Unity の Unlit Shader を新規作成した際の初期プログラム(テンプレート)について、キーワードと構造の観点から説明しました。
マテリアル経由で設定するシェーダー変数の宣言、環境や用途に応じて選択できる SubShader 、頂点・ピクセルシェーダーの処理を定義する部分などの構造がわかりました。
Shader のプログラムが ShaderLab 言語と HLSL (≒Cg) 言語で構成されていることもわかりました。
まだ、理解・説明不足な点も多いので、必要に応じてさらに紹介します。
参照サイト Thank You!
- Unity のリアルタイム開発プラットフォーム | 3D/2D、VR/AR のエンジン
- カスタムシェーダーの基礎 – Unity マニュアル
- Effectiveさお
- ShaderLab: SubShader の定義 – Unity マニュアル
- ShaderLab: パスの定義 – Unity マニュアル
- 【Unity】 スクリプトで始めるUnity Shaderの基礎2019 (1) – Qiita
- ShaderLab: SubShader の定義 – Unity マニュアル
- ShaderLab: タグを SubShader に割り当てる – Unity マニュアル
- ShaderLab: LOD 値を SubShader に割り当てる – Unity マニュアル
- Unityシェーダプログラム入門 UnlitShaderの要素を全て解説|アマガミナブログ
- ShaderLab 構文 – Unity マニュアル
- Unityで使用するシェーダー言語 – Unity マニュアル
記事一覧 → Compota-Soft-Press
コメント