UnityでAlpha値を変更するshaderメモ


はじめに

これは自らの戒めのために記事である.参考にならない人も多いかもしれない.

背景情報

objファイルに記載されているvertexカラーをunityに反映させると同時にalpha値をいじりたくなった.
アルファ値を追加する前のコードは以下の通り.メッシュに記述された情報を参照して反映している.

_.shader
Shader "Custom/VertexColorShader" {
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert vertex:vert
        #pragma target 3.0

        struct Input {
            float4 vertColor;
        };

        void vert(inout appdata_full v, out Input o){
            UNITY_INITIALIZE_OUTPUT(Input, o);
            o.vertColor = v.color;

            }

        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = IN.vertColor.rgb;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

やったこと

今回はvectorColorのアルファではなく,別の値を代入できるようにする.
SurfaceOutputとやらを使っているので,Unity公式を参考にするとAlphaを代入できるらしい.
ほならばsurfacePutputに一行追加するだけで済むはず.

_.shader
        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = IN.vertColor.rgb;
            o.Alpha = 0.1  // ここに追加
        }

しかし,alpha値は反映されなかった

解決

  1. "RenderType"="Opaque""RenderType"="Transparent" "Queue" = "Transparent"}に変更
  2. pragmaalphaを追加

以下,完成コード

_.shader
Shader "Custom/TransParentShader" {

    SubShader {
        Tags { "RenderType"="Transparent"  "Queue" = "Transparent"}
        Blend SrcAlpha OneMinusSrcAlpha

        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert vertex:vert alpha
        #pragma target 3.0

        struct Input {
            float4 vertColor;
        };
        // fixed4 _Color;
        void vert(inout appdata_full v, out Input o){
            UNITY_INITIALIZE_OUTPUT(Input, o);
            o.vertColor = v.color;
        }
        void surf (Input IN, inout SurfaceOutput o) {   
            o.Albedo = IN.vertColor.rgb;
            o.Alpha =  0.1;
        }
        ENDCG
    }
        // 影を描写しない
    FallBack "Transprent/Cutout/Diffuse"
}