Version: Unity 6.0 (6000.0)
言語 : 日本語
ShaderLab: 古いライティング (非推奨)
ShaderLab: 古いテクスチャ合成

ShaderLab: 古いアルファテスト

ノート: このページの ShaderLab 機能は古いものであり、後方互換性のためだけに文書化されています。シェーダーのソースファイルに HLSL コードが含まれている場合、Unity はこれらのコマンドを完全に無視します。シェーダーのソースファイルに HLSL コードが含まれていない場合、Unity はインポート時にこれらのコマンドを通常のシェーダープログラムにコンパイルします。

レンダーパイプラインの互換性

機能名 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタム SRP
古いアルファテスト はい いいえ いいえ いいえ

概要

最終的な出力色が計算された後、任意で色のアルファ値と固定値を比較することができます。テストに失敗すると、ピクセルは画面に描画されません。

構文

AlphaTest Off

すべてのピクセル(デフォルト)をレンダリングまたは …

AlphaTest comparison AlphaValue

アルファ値が特定の範囲にあるピクセルをレンダリングするように、アルファテストを設定します

比較 比較には以下のいずれかを指定します。

| | | |:—|:—| |Greater |ピクセルのアルファ値が AlphaValue より大きい場合のみレンダリング。 | |GEqual |ピクセルのアルファ値が AlphaValue 以上の場合のみレンダリング。 | |Less |ピクセルのアルファ値が AlphaValue より小さい場合のみレンダリング。 | |LEqual |ピクセルのアルファ値が AlphaValue 以下の場合のみレンダリング。 | |Equal |ピクセルのアルファ値が AlphaValue と等しい場合のみレンダリング。 | |NotEqual |ピクセルのアルファ値が AlphaValue と等しくない場合のみレンダリング。 | |Always |すべてのピクセルをレンダリング。AlphaTest Off と同等の機能です。 | |Never |すべてのピクセルをレンダリングしない。 |

AlphaValue 0 と 1 の間の浮動小数点数。float あるいは range プロパティへの変数の参照も可能で、その場合は標準的な角かっこを使用して記述する必要があります ([VariableName])。

詳細

透明な部分のある凹形のオブジェクトをレンダリングする場合にアルファテストは重要です。グラフィックスカードは、画面に描画されたすべてのピクセルの深度の記録を管理します。新しいピクセルがすでにレンダリングされているものよりも遠くにある場合、新しいピクセルはディスプレイに描画されません。つまり、ブレンド を行ってもオブジェクトは透き通って見えません。

この図では、左の木は AlphaTest を用いてレンダリングされています。中のピクセルが、完全に透明または不透明のどちらかであることに注目してください。中央の木は Alpha Blending のみ使用してレンダリングされています。深度バッファの影響で、近くの枝の透明な部分が遠くの葉を覆っていることに注目してください。右の木は以下の例の最後のシェーダーでレンダリングされています。アーティファクトをなくすためにブレンディングとアルファテストを組み合わせて実行しています。

最も簡単な例として、テクスチャにアルファチャンネルを割り当てます。オブジェクトはアルファ値が 0.5 より大きい場所のみ表示されます。

Shader "Simple Alpha Test" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
    }
    SubShader {
        Pass {
            // Only render pixels with an alpha larger than 50%
            AlphaTest Greater 0.5
            SetTexture [_MainTex] { combine texture }
        }
    }
}

これだけではあまり良い結果は得られません。次にライティングを追加して、カットオフ値を調整できるようにします。

Shader "Cutoff Alpha" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
        _Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
    }
    SubShader {
        Pass {
            // Use the Cutoff parameter defined above to determine
            // what to render.
            AlphaTest Greater [_Cutoff]
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On
            SetTexture [_MainTex] { combine texture * primary }
        }
    }
}

植物や樹木をレンダリングするとき、多くのゲームではアルファテストで特徴的な鋭いエッジが発生ます。回避方法はオブジェクトを 2 回レンダリングすることです。最初のパスで、アルファテストを使用して不透明度が 50% を超えるピクセルのみレンダリングします。2 回目のパスでは、ピクセルの深度を記録せずに、除外された部分のグラフィックスをアルファブレンドします。遠くの枝が手前の枝を上書きするので若干混乱を招くかもしれませんが、葉には多くのディテールが含まれるため実際に気付くことはあまりありません。

Shader "Vegetation" {
    Properties {
        _Color ("Main Color", Color) = (.5, .5, .5, .5)
        _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
        _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
    }
    SubShader {
        // Set up basic lighting
        Material {
            Diffuse [_Color]
            Ambient [_Color]
        }
        Lighting On

        // Render both front and back facing polygons.
        Cull Off

        // first pass:
        // render any pixels that are more than [_Cutoff] opaque
        Pass {
            AlphaTest Greater [_Cutoff]
            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }

        // Second pass:
        // render in the semitransparent details.
        Pass {
            // Dont write to the depth buffer
            ZWrite off
            // Don't write pixels we have already written.
            ZTest Less
            // Only render pixels less or equal to the value
            AlphaTest LEqual [_Cutoff]

            // Set up alpha blending
            Blend SrcAlpha OneMinusSrcAlpha

            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }
    }
}

個別のパスではなく、SubShader の中には設定がいくつかあることに注意してください。SubShader で設定したステートは、その中のパスでデフォルト値として継承されます。

ShaderLab: 古いライティング (非推奨)
ShaderLab: 古いテクスチャ合成