ShaderLab文法: Fog
ShaderLab構文:Blending

ShaderLab文法: AlphaTest

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

アルファテストは,ピクセルが画面に描画されることを拒否する最後の機会です。

最終の出力カラーが計算された後,カラーは任意のオプションでアルファ値を固定値と比較させることが出来ます。もしテストに失敗すると,ピクセルは画面に描画されません。

構文

    AlphaTest Off

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

    AlphaTest comparison AlphaValue

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

Comparison

Comparison(比較)は次の言葉のどれかを指定します:

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

AlphaValue

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

詳細

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

この図では,左の木は 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 }
        }
    }
}

これは単独ではあまり良くありません。次にライティングを追加して,しきい値としてCutoffを微調整できるようにします:

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で設定したState(状態)は,その中のパスでデフォルト値として,継承されます。

ShaderLab文法: Fog
ShaderLab構文:Blending