本日はShader枠です。
昨日はShaderGraphでα値を制御するAlphaTextureを使用できるシェーダーを書きました。
本日はShaderLabでコードで同じことを実装していきます。
〇透明度を扱うシェーダー
透明度をシェーダーで扱うためには以下の要件を満たしている必要があります。
・レンダキューが3000台である(厳密には3000以外もある)
・AlphaBlendingが定義されている。
・Shaderの出力でAlpha値が定義されている
〇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を再現できました。