波打際のブログさん

主に、プログラミング備忘録など。

シェーダー入門したくないけど書いてみたい その5 透過編

はじめに

 この記事ではシェーダに関して入門することができません。とりえあずUnityでシェーダを書いて見たい人向けのブログです。

今回は透過に対応したシェーダを書いてみます。

事前準備

 事前準備が済んでいない方は、第一回目の事前準備の項目を参考に事前準備を行ってください。
シェーダー入門したくないけど書いてみたい その1 - 波打際のブログさん

05.TransparencyShader

`05.TransparencyShader/TransparencyShader.unity` を開いてみてください。開くと半透明の箱がレンダリングされていると思います。
f:id:alfa-jpn:20150807015515p:plain

このシェーダは次のように実装されています。

Shader "ShaderLesson/05.TransparencyShader/Question" {
    SubShader {
        Pass {
            Tags { "RenderType" = "Transparent" "Queue"="Transparent" }
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 vert(float4 v:POSITION) : SV_POSITION {
                return mul (UNITY_MATRIX_MVP, v);
            }

            fixed4 frag() : SV_Target {
                return fixed4(1.0, 0, 0, 0.5);
            }
            ENDCG
        }
    }
}

このシェーダのポイント

 このシェーダのポイントは、Blendでブレンディングの指定をしていること、QueueタグにTransparentを指定していることです。

ブレンディングの指定

 ピクセル同士をどのようにブレンドするかを `Blend` 構文で指定しています。これを指定しないとブレンディングが無効なのでシェーダの値がそのままピクセルの値になります。`SrcAlpha OneMinusSrcAlpha` でアルファブレンディングを指定しています。

Queueタグ

 今まで定型文のように全く変化のなかったタグですが、今回はいつもと異なりRenderTypeとQueueタグにTransparentが指定されています。特に重要になってくるのがQueueタグです。QueueタグにTransparentを指定することでシェーダのレンダリング順を後回しにしています

 なぜ後回しにしなければいけないのかというと、他のシェーダーがピクセルに描画してしまうと、それより後ろにあるオブジェクトはそのピクセルに書き込めなくなってしまうためです。

f:id:alfa-jpn:20150807023148p:plain

RenderTypeは他のシェーダからシェーダを参照するときに使われる値を設定します。

演習

 透過シェーダを書き換えて、箱にテクスチャを指定できるようにし、下記のようにテクスチャの灰色部分が完全に透過してレンダリングされるシェーダを作ってください。(ヒント: if制御構文使えます。)
f:id:alfa-jpn:20150807024335p:plain


今回はここまでです。
次回はUnityのライティングに対応したシェーダについて解説と演習を行います。