Unity 半透明リムライトシェーダ


よく薬のCMなどで使われている「光彩がついたスケルトンみたいな質感のCG」に使われている半透明のリムライトなマテリアル。
今取り掛かっている案件で、こんな表現がちょっと必要になったので作ってみました。

この素体のマテリアルが今回の作例です

リムライト実装の参考にしたのは公式リファレンスのこれ。
https://docs.unity3d.com/ja/current/Manual/SL-SurfaceShaderExamples.html

シェーダ部分のコードはこんな感じになっています。

CGPROGRAM
#pragma surface surf Standard alpha:blend
#pragma target 3.0

struct Input {
	float2 uv_MainTex;
	float3 worldNormal;
 	float3 viewDir;
};

sampler2D _MainTex;
fixed4 _Color;
float _Alpha;
float4 _RimColor;
float _RimPower;

void surf (Input IN, inout SurfaceOutputStandard o) {
	o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb + _Color;
	o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));

	float alpha = 1 - (abs(dot(IN.viewDir, IN.worldNormal)));
	o.Alpha =  alpha * 1.5 * _Alpha;

	half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
	o.Emission = _RimColor.rgb * pow (rim, _RimPower);
}
ENDCG

ただ、これだけではモデルのメッシュの表示順序でメッシュが複数重なったような気持ち悪い表示になってしまいますが、ここ http://tsubakit1.hateblo.jp/entry/2015/09/09/233000 を参考にして、1パス目でZ値の書き込み(Zwrite On)を行い、2パス目に透明シェーダを実装しました。
なぜこのような面倒なことをやらないといけないかは、上記参考記事に詳しく書いてあるので読んでみるといいと思います。

// 1パス目
Pass{
	Zwrite On
	ColorMask 0
	Lighting OFF
}

// 2パス目
Tags {"RenderType"="Transparent" "Queue"="Transparent"}
Zwrite Off
ZTest LEqual

Tags { "Queue"="Transparent" }
LOD 200

// ここから上の CGPROGRAM 〜 ENDCG を書く

こんな感じ。

はいこれで、無事「気持ち悪い表示にならない透明リムライトシェーダ」ができました。

・今回参考にさせていただいたURL
https://docs.unity3d.com/ja/current/Manual/SL-SurfaceShaderExamples.html
http://tsubakit1.hateblo.jp/entry/2015/09/09/233000