リムライティングというカッコいいエフェクトです。リムは"ふち"っていう意味です。
nn-hokuson.hatenablog.com
リムライティングのシェーダプログラム
今回もコードにちょこちょこメモしています。
Shader "Custom/sample" { SubShader{ Tags{ "RenderType" = "Opaque" } LOD 200 //氷シェーダーをベースに //オブジェクトの輪郭部分のエミッションを高くする CGPROGRAM #pragma surface surf Standard #pragma target 3.0 struct Input { float2 uv_MainTex; float3 worldNormal; float3 viewDir; }; void surf(Input IN, inout SurfaceOutputStandard o) { //基本カラー fixed4 baseColor = fixed4(0.05, 0.1, 0, 1); //リムカラー fixed4 rimColor = fixed4(0.5,0.7,0.5,1); o.Albedo = baseColor; //求めたrim(0< rim <1)をrimColorにかける //が、そのままだとcosθに従うので減衰が弱い //3乗することによって減衰を強調してやる //satulate: 値を0~xに制限する float rim = 1 - saturate(dot(IN.viewDir, o.Normal)); o.Emission = rimColor * pow(rim, 2.5); } ENDCG } FallBack "Diffuse" }
いきなり出てきたsatulate、どうやら値をclampする関数のようです。
nyahoon.com
適応
リムライティングのノード
完成形です
内積をとって1から引くパートです。氷のときとほぼ同じなのですが、さきほどのsaturateをabsoluteの代わりに使います。もしくはclampでも代用できます。
Power(Mathf.Powとかで使われるPowはPowerの略)で渡ってきた値を2.5乗してあげます。
最後にふちの色と掛け合わせてEmissionに代入して終わりです。この時注意といいますか、氷のときのShaderをそのまま使うとAlphaBlendになっていると思うのですが、ここをOverWriteにしておかないと、中途半端に透けたりと見た目が壊れるので注意です。
完成した姿
ベースカラーが重たい色になってしまっていますが、ふちが明るくなり、輪郭が協調されているのが分かると思います。
今回は以上です。
おまけ
途中分からなくなり、試しにShaderForgeでも作ってみました