SurfaceShaderオプションのalpha,alpha:fadeの違いについて(@Unity)


はじめに

HLSLの基礎もついて来たので最近はオプションや、tagの設定など少し細かい部分に目を向けて勉強をしています.そこで今回は自分的にSurfaceShadreのalpha,alpha:fadeオプションの違いについて些細な違いではありますが、少し面白かったのでちょろっと書きたいと思います.

実装内容

それでは実際のコードと出力をみて行きましょう.

  1. alphaを指定した場合
transparent.shade
Shader "Custom/transparent" {
    Properties {
        [HDR]_Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags 
        { 
            "Queue" = "Transparent"
            "RenderType" = "Transparent"
        }
        LOD 200
        Cull Back

        CGPROGRAM
        #pragma surface surf Standard alpha
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {

            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

2.alpha:fadeを指定した場合

transparent.sahder
#pragma surface surf Standard alpha:fade

(1行しか変えてないのでスクリプトは同じものを使っているので、スクリプト名が同じでも混乱しないでください.すみません)

解説

実際これらのmaterialを付加させたオブジェクトは見事透過しています.
これらの違いは透過している部分が実際に存在しているように見せるか見せないかの違いがあります.つまり、alphaを選択した場合は透過部分は存在しているように見え、alpha:fadeを選択した場合は存在していないようにレンダリングしてくれます.めっちゃ細かい部分のこだわりですねぇー、でもこう言った部分が楽しい気づきだったりって感じています.

おまけ

先ほどのスクリプトのtagの部分ですが、"Queue" = "Transparent"にしないとまずいです.何故ならば、unityのソリッドモデルのレンダリングの手順としてカメラからのZ orderingを決め、その後、ポリゴンの表面がカメラの方を向いているか向いていないかの判定をしてレンダリングを行います.しかし透過させたいジオメトリまでこの工程でレンダリングしてしまうと透明の透けている本来なら見えないポリゴンの裏側がレンダリングされないことになってしまいます。。。。それではまずいということで、"Queue" = "Transparent"に設定することで最後にレンダリングされ、ブレンドされるといった工程に設定できます.
ここで、最後にレンダリングするのにZ orderingは平気なの?という疑問が上がるかもしれないかと思うのですが、それについてはZ orderingを保管しているbuffer(Z buffer)があるのでそれを確認しつつレンダリングしているようなので平気なそうです.

他のtagなどについてはhttps://docs.unity3d.com/ja/540/Manual/SL-SubShaderTags.html

何か気になる部分などがあればコメントください、最後まで読んでいただきありがとうございます.