夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ゼロから始めるUnityShader開発 第五章 透明度のシェーダーを書く その③一般的なAlphaBlending

本日はシェーダー枠です。

 昨日は透明度を持った半透明なオブジェクトの描画を行いました。

 キーポイントとして透明度を持ったオブジェクトの描画には以下の二つがあります。

・不透明なオブジェクトが描画された後に描画する

・すでに描画されているピクセルと半透明シェーダーによって計算されたピクセルの色をどのように混ぜるかというAlphaBlendingの設定

 先日の状態ではこのAlphaBlendingがOne Oneですでに描画されたピクセルに対して加算する形で混ぜていたため明るく描画されていました。

 

今回はこのAlphaBlendingについてみていきます。

〇AlphaBlendingとは?

AlphaBlendingとはシェーダーで描画した色をどのようにすでに描画されている色に合成するかというパラメータになります。

docs.unity3d.com

〇SrcColor DstColor

よく見かける例としてはBlend SrcColor DstColorです。

    SubShader
    {
        Tags { "RenderType"="Transparent" }
        LOD 100

        Blend SrcColor DstColor
        Pass
        {
        ・・・
        }

SrcColorはシェーダーによって出力される生の色を指します。

DstColorはすでに描画されている色を指します。

つまりこのシェーダーで描画した色をすでに描画している色と混ぜ合わせる処理になります。

これはガラスなどの物理的な透明度表現などによく使用されます。

〇SrcAlpha OneMinusSrcAlpha

こちらもよく見るブレンドです。

    SubShader
    {
        Tags { "RenderType"="Transparent" }
        LOD 100

        Blend SrcAlpha OneMinusSrcAlpha
        BlendOp Add 
        Pass
        {

OneMinusSrcAlpha1からSrcAlphaを引いた値になります。

SrcAlphaとはシェーダーで計算されたアルファを意味しています。

例えば次のようなシェーダーの場合SrcAlpha0.6OneMinusSrcAlpha0.4となります。

 float4 frag (v2f i) : SV_Target
            {
                float4 col = tex2D(_MainTex, i.uv);
                col.a = 0.6f;
                return col;
            }

こちらは最終的な色味が必ず1になるため明るくも暗くもなることがなくポピュラーな透過に向いています。

〇One OneMinusSrcAlpha

    SubShader
    {
        Tags { "RenderType"="Transparent" }
        LOD 100

        Blend One OneMinusSrcAlpha
        BlendOp Add 
        Pass
        {

Oneは数値の1を示しています。

 この処理では特徴としてcol.a = 0.0f;としても以下のように完全に透明になることはありません。 ただしテクスチャで黒の部分は完全に透明になっているのが確認できると思います。

筆者としてまだ完全にマニュアルを解いて理解できたわけではありませんが、上記の表現が最も一般的なようです。