Unity Shader #1-1 シンプルシェーダー
レンダーパイプラインの過程では、いくつかのオプション用のコマンドがあります。
フェースカリング Face Culling
サーフェスの裏側はデフォルトで処理中にカリングされます。
CGPROGRAMの前にCull Offを追加すると、裏面のフェースカリングをオフにできます。
Plain TextPass
{
Cull Off
CGPROGRAM
//...
ENDCG
}
その他のオプション:
- Cull Off: 裏面のフェースカリングをオフにする
- Cull Back: [デフォルト] 面の裏側をカリングする
- Cull Front: 面の表側をカリングする
Inspectorでカリングモードを設定したい場合は、Properties部分に1行追加し、Cull[_CullMode]を使用します。
Plain TextProperties
{
[Enum(UnityEngine.Rendering.CullMode)]_CullMode("CullMode", float) = 2
}
Pass
{
Cull [_CullMode]
CGPROGRAM
//...
ENDCG
}
CullMode:
- 0: Off
- 1: Front
- 2: Back
時間 Time
_Timeパラメータで時間値を使用できます。
_Time.x/y/z/w: t/20, t, 2t, 3t
_SinTime.w: 時間のcos値
_CosTime.w: 時間のcos値
アルファテスト Alpha Test
フラグメントシェーダーでは、clip(n)関数は以下の動作をします:
n < 0: フラグメントを非表示にする
n >= 0: フラグメントを表示する
clip()関数で解像度/ブレンド/波エフェクトを実現でき、今後のノートで扱います。
ブレンド/半透明の場合は、CGPROGRAMの前に上記のCullと同様にBlendコマンドを追加する必要があります。
Plain TextPass
{
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
//...
ENDCG
}
OneMinusSrcAlpha以外にも、他のブレンドモードがあります。よく使われるもう1つのモードはBlend SrcAlpha Oneです。
また、ZWriteをオフにすることを忘れないでください。そうしないと、ソート/レンダリング順序に明らかで深刻な問題が発生する可能性があります。
Plain TextPass
{
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
//...
ENDCG
}
場合によってはZWriteをオンにする必要があり、これらのケースは今後のノートで扱います。
半透明オブジェクトはRender Queueで2500より後(デフォルトは3000)にする必要があることを思い出してください。そのため、Passの前にSubShader部分にTags{}を追加します。
Plain TextSubShader
{
Tags{"Queue" = "Transparent"}
Pass
{
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
//...
ENDCG
}
}
もう1点、色(またはfloat)のアルファ値を手動で設定する場合は、アルファ値が(0,1)の範囲内にあることを常に確認してください。saturate()関数を安全装置として使用できます。saturate()は(0,1)の範囲外の値を返さないようにします。
Plain Texthalf alpha = saturate(tex2D(_MainTex, i.uv).r * _Color.a * _Emiss);