夜風のMixedReality

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

CutoutShaderを書く

本日はShader勉強枠です。

〇CutoutShader

CutOutとは切り抜きを意味します。

一般的にCutoutShaderは葉っぱや草などの自然物を表すのに使用されます。

また、Ping画像などalpha値(透明度)を持つテクスチャの描画に使用されます。

今回は次のようなコードを描きました。※UnityURP専用です。

Shader "HoloMoto/SimpleCutoutShader"
{
    Properties//Unityのマテリアルに表示されるパブリックな変数
    {
        _MainColor("MainColor",color) = (1,1,1,1)       
        _MainTex("MainTex",2D)="White{}"
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        AlphaToMask On
        Pass{

        HLSLPROGRAM//ここからENDHLSLまではcg/HLSL言語で記述
        #pragma vertex vert
        #pragma  fragment frag
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
 

        struct appdata_t
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };
        sampler2D _MainTex;
        float4 _MainTex_ST;
        float4 _MainColor;
        struct v2f
        {
                       float4 vertex :POSITION;
               float2 uv :TEXCOORD0;
        };

        v2f vert (appdata_t v)//頂点shader 頂点の処理を行う。
        {
            v2f o;//V2f構造体をoと指す
           o.vertex = TransformObjectToHClip(v.vertex); 
           o.uv = v.uv;
            return  o;//Oに出力
        }
        float4 frag(v2f i):SV_TARGET
        {
          float4 col = _MainColor * tex2D(_MainTex,i.uv);//RGBA=1,1,1,1=白
           return col;//出力
        }
        ENDHLSL
      }       
    }
}

〇Alpha値をShaderで使う

今回のCutoffShaderでは[AlphaToMask On]という分を加えています。これによってCutoutの処理が行われます。

[AlphaToMask On]は[alpha-to-coverage]をオンにします。

この[alpha-to-coverage]はAlphaBlendをカバレッジマスクに置き換える処理です。

このカバレッジマスクによって通常は透明度を持つ描画の場合レンダリングの順番によって(Blend)実現していますがこの順番に依存しない形でレンダリングを行うことができます

docs.unity3d.com

以上でCutoutなシェーダーを記述することができました。

f:id:Holomoto-Sumire:20210814191130j:plain