Unityシェーダーの基礎知識。
[Toggle]を使ってShaderVariantの実装、シェーダーのコード分岐。
関連ページ
前回のページ
では
[KeywordEnum]
を使ってShaderVariantを実装し、1つのシェーダーに3つの異なった効果を載せました。
しかし3つでは無く2つの効果を載せる場合は、
[Toggle]
を使った方がもっと分かり易く簡易なコードになります。

シェーダー概要
今回作成したシェーダーの内容は以下の通りです。
Inspectorの
Use Silhouette
のオンオフを切り替えることで、シルエットの有効/非有効が切り替わります。
コードの中身が違うだけで、実装結果は
前々回のページ
の[MaterialToggle]と全く一緒です。
([MaterialToggle]はShaderVariantを使わないトグルの実装です)

コード全文
下が今回のテストのコード全文です。
前回との変更点は主に
Properties
と
shader_feature
の部分です。

Shader
"UI/TestVariant2"
{
Properties
{
//Toggleの()内の文字列がShader Variantのキーワードになる
[Toggle(_USE_SILHOUETTE_ON)]
_UseSilhouettes("Use
Silhouette",
Float)
=
0
}
SubShader
{
Tags
{
"Queue"
=
"Transparent"
}
Cull
Off
ZWrite
Off
Blend
SrcAlpha
OneMinusSrcAlpha
Pass
{
HLSLPROGRAM
#pragma
vertex
vert
#pragma
fragment
frag
//Shader Variantの宣言
#pragma
shader_feature_local
_USE_SILHOUETTE_ON
#include
"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct
Attributes
{
float4
positionOS
:
POSITION;
float2
uv
:
TEXCOORD0;
half4
color
:
COLOR;
};
struct
Varyings
{
float4
positionCS
:
SV_POSITION;
float2
uv
:
TEXCOORD0;
half4
color
:
COLOR;
};
//uGUI Image > Source Imageにアタッチされた画像を参照する
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
Varyings
vert
(Attributes
input)
{
Varyings
output;
output.positionCS
=
TransformObjectToHClip(input.positionOS.xyz);
output.uv
=
input.uv;
output.color
=
input.color;
return
output;
}
half4
frag
(Varyings
input)
:
SV_Target
{
half4
col
=
SAMPLE_TEXTURE2D(_MainTex,
sampler_MainTex,
input.uv);
//キーワードの有無で処理を分岐させる
#if
defined(_USE_SILHOUETTE_ON)
//チェックONの時だけ実行される処理
col.rgb
=
half3(0.5,
0.5,
0.5);
#else
col
*=
input.color;
#endif
return
col;
}
ENDHLSL
}
}
}


コード解説
シェーダー効果が2つしか無いなら、実際のところキーワードの定義は1つで十分です。
#if文では、そのキーワードが選択されてるか否かを見れば事足ります。
まずPropertiesの中を見てみます。
Properties
{
//Toggleの()内の文字列がShader Variantのキーワードになる
[Toggle(_USE_SILHOUETTE_ON)]
_UseSilhouettes("Use
Silhouette",
Float)
=
0
}
[Toggle]
内の()の中身を
ドロワー引数
と呼びます。
ここにトグルがオンになった時のキーワードを定義しておきます。
shader_feature
の方にもドロワー引数と同じキーワードを宣言させます。
//Shader Variantの宣言
#pragma
shader_feature_local
_USE_SILHOUETTE_ON
最後にピクセルシェーダーの方で遷移分けして実装完了です。
half4
frag
(Varyings
input)
:
SV_Target
{
half4
col
=
SAMPLE_TEXTURE2D(_MainTex,
sampler_MainTex,
input.uv);
//キーワードの有無で処理を分岐させる
#if
defined(_USE_SILHOUETTE_ON)
//チェックONの時だけ実行される処理
col.rgb
=
half3(0.5,
0.5,
0.5);
#else
col
*=
input.color;
#endif
return
col;
}
0
0