LoginSignup
15
16

More than 5 years have passed since last update.

Unity でShaderの勉強 その4

Posted at

引き続きShaderの勉強をしていきます。

前回はZTestやZWrite周りを勉強したので今回はBlend周りをやってみたいと思います。

Test1(半透明用)とTest2(不透明用)シェーダーを作りました。

Test1
Shader "Custom/Test1"{
    Properties {
        _MainColor("MainColor" , Color) = (1,1,1,1)
    }
    SubShader {
        Tags {"Queue" = "Transparent" "RenderType" = "Transparent"}
        ZWrite Off
        ZTest LEqual
        Blend SrcAlpha OneMinusSrcAlpha

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            uniform float4 _MainColor;

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

            float4 frag() : SV_TARGET {
                return _MainColor;
            }
            ENDCG
        }
    }
}
Test2
Shader "Custom/Test1"{
    Properties {
        _MainColor("MainColor" , Color) = (1,1,1,1)
    }
    SubShader {
        Tags {"Queue" = "Geometry" "RenderType" = "Opaque"}
        ZWrite On
        ZTest LEqual

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            uniform float4 _MainColor;

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

            float4 frag() : SV_TARGET {
                return _MainColor;
            }
            ENDCG
        }
    }
}

白CubeにTest1,赤CubeにTest2をつけてみたところ正常に動作しました。
スクリーンショット 2016-09-23 0.14.16.png
スクリーンショット 2016-09-23 0.15.03.png

あえて描画しない

描画しない
Shader "Custom/Test3" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
    }

    SubShader {
        Tags {"Queue" = "Geometry-1"}

        Pass{
            Zwrite On
            ColorMask 0
        }

    } 
}

このシェーダーをつけることによって、
これが
スクリーンショット 2016-09-23 1.14.55.png
こうじゃ!
スクリーンショット 2016-09-23 1.15.52.png

プチ解説
完全透明Cubeの背後にあるタイルのシェーダーのQueueはGeometryが設定されています(Unlitシェーダー)
今回のシェーダーのQueueはGeometry-1が設定されているので先に描画が行われます。デプスバッファに位置情報が書き込まれますが、ColorMask 0が設定されているため何も描画されません。そのためピクセル位置にはQueue = Backgroundの背景の色がそのまま残ることになります。
次いでQueue = GeometryのタイルのZTestが行われますが、ZTest LEqualが指定してあるため、より手前にある完全透明に勝てず描画が行われません。
結果的にピクセルに残る色は背景になる、というわけです :)
シェーダー面白い :)

15
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
16