ノート: このページの 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 |すべてのピクセルをレンダリングしない。 |
透明な部分のある凹形のオブジェクトをレンダリングする場合にアルファテストは重要です。グラフィックスカードは、画面に描画されたすべてのピクセルの深度の記録を管理します。新しいピクセルがすでにレンダリングされているものよりも遠くにある場合、新しいピクセルはディスプレイに描画されません。つまり、ブレンド を行ってもオブジェクトは透き通って見えません。
この図では、左の木は 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 で設定したステートは、その中のパスでデフォルト値として継承されます。