夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ゼロから始めるUnityShader開発 第四章 ShaderLabの記述 前編

本日は昨日に引き続きShader枠です。

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

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

〇第四章 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回×ピクセル数の計算処理が行われるという意味を指しています。

これは例えば、一つ目のパスでアウトラインを描画して、二つ目のシェーダーで本体のシェーダーを記述するといったことができます。 

redhologerbera.hatenablog.com

〇CGPROGORAM~ENDCG

 CGPROGRAM
 ・・・
 ENDCG

もしくは近年では次のような形式も見られます。

HLSLPROGRAM
・・・
ENDHLSL

ShaderLabはUntiy独自の構文ですが、この間はShaderLabの構文ではなくhlsl言語で記述されています。


ここまでがShaderLabの内容になります。

次回はHLSL言語の部分を見ていきます。