夜風のMixedReality

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

ゼロから始めるUnityシェーダー開発 ShaderLabでAlphaTextureを扱うシェーダーを書く

本日はShader枠です。

昨日はShaderGraphでα値を制御するAlphaTextureを使用できるシェーダーを書きました。

本日はShaderLabでコードで同じことを実装していきます。

redhologerbera.hatenablog.com

〇透明度を扱うシェーダー

透明度をシェーダーで扱うためには以下の要件を満たしている必要があります。

・レンダキューが3000台である(厳密には3000以外もある)

・AlphaBlendingが定義されている。

・Shaderの出力でAlpha値が定義されている

redhologerbera.hatenablog.com

〇AlphaTextureを扱うシェーダー

まずはシェーダーで透明度を扱えるようにRenderTypeとBlendを定義します。

Shader "Unlit/AlphaTextureShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" }//定義
        LOD 100
        Blend OneMinusSrcAlpha One //追加


        Pass
        {
    ・・・

次にPropertiesブロックにテクスチャのパラメータを定義します。

    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _AlphaTex("AlphaTex",2D) = "white"{}
    }

これによってinspectorウィンドウのマテリアルのパラメータにAlphaTexのパラメータが追加されます。

次に定義したパラメータをシェーダー内で使用するためにHLSL文内でパラメータを定義します。

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _AlphaTex;//定義

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

最後にalphaというパラメータを定義し、tex2Dメソッドでサンプリングします。

この結果を最終出力であるcolの第4パラメータであるaに渡すとこでテクスチャに合わせた透明度を使用することができます。

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                fixed alpha = 1-tex2D(_AlphaTex,i.uv);
                col.a = alpha;
             
      // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }

以上でShaderLab言語でもAlphaTextureを再現できました。