一 概覽
本文講解了各向異性頭發(fā)效果的原理,Shader的具體實(shí)現(xiàn)抖誉,以及部分注意事項(xiàng)殊轴。
社會(huì)你坤弟,人慫話又多袒炉,這次先上Demo: AnisotropicHair
二 原理
1 面片模型
配合基本顏色貼圖來(lái)模擬發(fā)絲的效果旁理。
2 基本貼圖
3 高光走向
Kajiya-Kay模型:利用切線(tangent)方向來(lái)計(jì)算高光強(qiáng)度。
4 兩層高光
Marschner模型:兩層高光我磁,并為第二層高光添加噪點(diǎn)孽文。
三 Shader實(shí)現(xiàn)
1 Diffuse Lighting
fixed4 albedo = tex2D(_MainTex, i.uv);
half3 diffuseColor = albedo.rgb * _MainColor.rgb;
2 兩層高光
//獲取頭發(fā)高光
fixed StrandSpecular ( fixed3 T, fixed3 V, fixed3 L, fixed exponent)
{
fixed3 H = normalize(L + V);
fixed dotTH = dot(T, H);
fixed sinTH = sqrt(1 - dotTH * dotTH);
fixed dirAtten = smoothstep(-1, 0, dotTH);
return dirAtten * pow(sinTH, exponent);
}
//沿著法線方向調(diào)整Tangent方向
fixed3 ShiftTangent ( fixed3 T, fixed3 N, fixed shift)
{
return normalize(T + shift * N);
}
fixed3 spec = tex2D(_AnisoDir, i.uv).rgb;
//計(jì)算切線方向的偏移度
half shiftTex = spec.g;
half3 t1 = ShiftTangent(worldBinormal, worldNormal, _PrimaryShift + shiftTex);
half3 t2 = ShiftTangent(worldBinormal, worldNormal, _SecondaryShift + shiftTex);
//計(jì)算高光強(qiáng)度
half3 spec1 = StrandSpecular(t1, worldViewDir, worldLightDir, _SpecularMultiplier)* _SpecularColor;
half3 spec2 = StrandSpecular(t2, worldViewDir, worldLightDir, _SpecularMultiplier2)* _SpecularColor2;
3 結(jié)合起來(lái)
fixed4 finalColor = 0;
finalColor.rgb = diffuseColor + spec1 * _Specular;//第一層高光
finalColor.rgb += spec2 * _SpecularColor2 * spec.b * _Specular;//第二層高光,spec.b用于添加噪點(diǎn)
finalColor.rgb *= _LightColor0.rgb;//受燈光影響
finalColor.a += albedo.a;
四 注意事項(xiàng)
1 半透明渲染次序錯(cuò)亂
頭發(fā)挽起來(lái)的部位出現(xiàn)在了前面:
通過(guò)添加一個(gè)寫入深度的Pass可解決此問(wèn)題:
Pass
{
ZWrite On //寫入深度夺艰,被遮擋的像素將不能通過(guò)深度測(cè)試
ColorMask 0 //不輸出顏色
}
2 半透穿透
但隨之而來(lái)卻產(chǎn)生了另外一個(gè)問(wèn)題:下層頭發(fā)被剔除之后芋哭,上層頭發(fā)直接和背景色進(jìn)行了混合
除了調(diào)整貼圖alpha值之外,還可在通過(guò)在新添加的Pass中添加一個(gè)基本的顏色來(lái)解決此問(wèn)題:
half4 finalColor = half4(0, 0, 0, albedo.a);
finalColor.rgb += (albedo.rgb * _MainColor.rgb) * _LightColor0.rgb;
return finalColor;
3 高光方向
為確保頭發(fā)的高光走向?yàn)檠刂l(fā)根到發(fā)尖郁副,需要設(shè)置模型的軸向?yàn)閅軸朝上(和Unity一致)
同時(shí)UV方向也要和模型方向一致