読者です 読者をやめる 読者になる 読者になる

CGメソッド

CG制作に関してのヒント

MENU

【Unity】Unlitシェーダーにマスクを追加する方法

Unity Unity-Shader

follow us in feedly

f:id:min0124:20160828115925p:plain

勉強がてら、デフォルトのUnlitシェーダーにマスクを追加してみました。

もっと簡単にできるかと思いきや、結構変更箇所が多かったです。

やり方

ベースの生成

まずAssets>Create>Shader>Unlit Shaderを選択してベースになるシェーダーを作成

f:id:min0124:20161207080112p:plain

プロパティをセット

6行目に_AlphaTex ("Alpha mask (R)", 2D) = "white" {}を追加

シェーダーにAlpha mask (R)の項目が追加されます。

※ここでPropertiesはシェーダで使う変数とUnityエディタとの関連付けを行う。

f:id:min0124:20161207080001j:plain

タグの追加

10行目のTags { "RenderType"="Opaque" }から

Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}に変更

Queue"="Transparent"

オブジェクトを描画する順番を判定。アルファブレンディングするもはTransparentに。透過オブジェクトはこれにしないとうまく描画されない。

IgnoreProjector

プロジェクターの影響OFF

RenderType

マテリアルのインスペクタープレビューがどのようにプレビューを表示するか示す

  • Opaque ソリッド(不透明)

  • Transparent 透過してます

アルファブレンディングを使用

12行目にBlend SrcAlpha OneMinusSrcAlphaを追加

計算としてはフレームバッファの(1 - Source Alpha)を乗算。

テクスチャの情報の受け取り

37行目にsampler2D _AlphaTex;を追加

どのテクスチャユニットからどういう方法でテクスチャをサンプリングするかを指定

計算情報を追加

53・54行目に下記のコードを追加

fixed4 col2 = tex2D(_AlphaTex, i.uv);
return fixed4(col.r, col.g, col.b, col2.r);

アルファチャンネルに、Alpha mask (R)にアサインした白黒テクスチャのRチャンネルを使用

フォグのコードを削除

表示結果には影響ないのですが、4箇所のフォグのコードを使わないので消しておきます。

// make fog work
#pragma multi_compile_fog
UNITY_FOG_COORDS(1)
UNITY_TRANSFER_FOG(o,o.vertex);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);

結果

f:id:min0124:20161207083753j:plain

Shader "Unlit/Transparent_AlphaMask"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _AlphaTex ("Alpha mask (R)", 2D) = "white" {}
    }
    SubShader
    {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        LOD 100
        Blend SrcAlpha OneMinusSrcAlpha
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag


            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                half2 uv : TEXCOORD0;
            
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            sampler2D _AlphaTex; 
            float4 _MainTex_ST;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);

                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                fixed4 col2 = tex2D(_AlphaTex, i.uv);
                return fixed4(col.r, col.g, col.b, col2.r);


            }
            ENDCG
        }
    }
}

参考

その2 ShaderLabでUnityシェーダの下地作り

https://forum.unity3d.com/threads/solved-how-to-add-an-alpha-mask-over-the-existing-transparent-cutout-soft-edge-unlit-shader.289856/