Lingheng Tony Tao

Unity Shader · 第 2.1 回 / 全 13 回 · 2021年10月10日

Unity Shader #2.1 基本コマンド

Unity Shader #1-1 シンプルシェーダー

レンダーパイプラインの過程では、いくつかのオプション用のコマンドがあります。

フェースカリング Face Culling

サーフェスの裏側はデフォルトで処理中にカリングされます。

CGPROGRAMの前にCull Offを追加すると、裏面のフェースカリングをオフにできます。

Pass
{
    Cull Off
    CGPROGRAM
    //...
    ENDCG
}

その他のオプション:

  • Cull Off: 裏面のフェースカリングをオフにする
  • Cull Back: [デフォルト] 面の裏側をカリングする
  • Cull Front: 面の表側をカリングする

Inspectorでカリングモードを設定したい場合は、Properties部分に1行追加し、Cull[_CullMode]を使用します。

Properties
{
    [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コマンドを追加する必要があります。

Pass
{
    Blend SrcAlpha OneMinusSrcAlpha
    CGPROGRAM
    //...
    ENDCG
}

OneMinusSrcAlpha以外にも、他のブレンドモードがあります。よく使われるもう1つのモードはBlend SrcAlpha Oneです。

また、ZWriteをオフにすることを忘れないでください。そうしないと、ソート/レンダリング順序に明らかで深刻な問題が発生する可能性があります。

Pass
{
    ZWrite Off
    Blend SrcAlpha OneMinusSrcAlpha
    CGPROGRAM
    //...
    ENDCG
}

場合によってはZWriteをオンにする必要があり、これらのケースは今後のノートで扱います。

半透明オブジェクトはRender Queueで2500より後(デフォルトは3000)にする必要があることを思い出してください。そのため、Passの前にSubShader部分にTags{}を追加します。

SubShader
{
    Tags{"Queue" = "Transparent"}
    Pass
    {
        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha
        CGPROGRAM
        //...
        ENDCG
    }
}

もう1点、色(またはfloat)のアルファ値を手動で設定する場合は、アルファ値が(0,1)の範囲内にあることを常に確認してください。saturate()関数を安全装置として使用できます。saturate()は(0,1)の範囲外の値を返さないようにします。

half alpha = saturate(tex2D(_MainTex, i.uv).r * _Color.a * _Emiss);