続きです。
www.tattichan.work
これまではパラメータをちょっといじる程度でしたがいきなりやることが増えます。
nn-hokuson.hatenablog.com
氷シェーダのシェーダプログラム
お手本にそってShaderを作成します。内積が分かれば理解できるはず。
Shader "Custom/sample" { SubShader{ Tags{ "Queue" = "Transparent" } LOD 200 //変更点 //サーフェイスシェーダに、法線ベクトルと視線ベクトルを入力している //透明度の求めるために、ベクトル計算をしている //ドラゴンの輪郭部分の透明度が低くなっているのに対して、中央部分の透明度は高くなるようにする CGPROGRAM #pragma surface surf Standard alpha:fade #pragma target 3.0 struct Input { //オブジェクトの法線ベクトル float3 worldNormal; //視線(カメラが向いている方の)ベクトル float3 viewDir; }; void surf(Input IN, inout SurfaceOutputStandard o) { o.Albedo = fixed4(1, 1, 1, 1); //内積の基本 //垂直: A * B = 0 //平行: A * B = 1 or -1 //オブジェクトの面が自分に向いている(平行な)ほど0に近くなる。 //オブジェクトの輪郭は、自分から向いている向きに対してほぼ垂直なため0に近くなる //内積値をそのままアルファとして用いると、輪郭が透明になり、中央部分の透明度が低くなり、目的と逆の効果を生む。 //そのため1から内積値を引いている float alpha = 1 - (abs(dot(IN.viewDir, IN.worldNormal))); //1.5fはお好みで数値をかえる o.Alpha = alpha*1.5f; } ENDCG } FallBack "Diffuse" }
完成
氷シェーダをノードでつくってみる
先に完成形です。先ほどの式をノードでそのまま再現してみます。
まずは内積を作りましょう。
・View Direction space view: 視線(カメラが向いている方の)ベクトル
・Normal Vector space world: オブジェクトの法線ベクトル
を内積を計算してくれるDot Productに入力します。
絶対値はAbsoluteで計算することができます。
内積値を1から引く必要があるので、One Minusに入れます。
出てきた値に1.5をかけます。1次元の定数はVector 1、掛け算にはMultiplyノードを使います。
最終的なoutをalphaに入力すれば完成です。