Unity Unlitシェーダーの初期プログラムのキーワードと構造

前回、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 初期プログラムの構造

実装の中身をはぶき、構造だけを見ると次のようになります。

Unity 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!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました