Unity中的头发渲染 (Hair Shading)

Scheuermann 的方法

用Thorsten Scheuermann的方法来做头发:
在GDC2004上的幻灯片Hair Rendering and Shading,
Practical Real-Time Hair Rendering and Shading

1
2
3
4
5
inline float3 ShiftTangent(float3 T, float3 N, float shift)
{
float3 shiftedT = T + shift * N;
return normalize(shiftedT);
}
1
2
3
4
5
6
7
8
inline float StrandSpecular(float3 T, float3 V, float3 L, float exponent)
{
float3 H = normalize(L + V);
float dotTH = dot(T, H);
float sinTH = sqrt(1.0 - dotTH * dotTH);
float dirAtten = smoothstep(-1.0, 0.0, dot(T, H));
return dirAtten * pow(sinTH, exponent);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
inline float3 HairLighting(float3 tangent, float3 normal,
float3 lightVec, float3 viewVec, float spec, float specShift, float specMask)
{
// shift tangents
half3 T = -normalize(cross(normal, tangent));

float shiftTex = specShift - 0.5;
float3 t1 = ShiftTangent(T, normal, _PrimaryShift + shiftTex);
float3 t2 = ShiftTangent(T, normal, _SecondaryShift + shiftTex);

// specular lighting
float3 specular = _SpecColor1 * StrandSpecular(t1, viewVec, lightVec, _SpecMultiplier1);

// add 2nd specular term, modulated with noise texture
specular += _SpecColor2 * specMask * StrandSpecular(t2, viewVec, lightVec, _SpecMultiplier2);

return specular * spec;
}

在这种做法下头发UV需要沿着Shift贴图的方向(一般是上下)来摆放,如果不想必须如此,则可以用守望先锋的做法。

守望先锋的头发 (Overwatch Hair Shading)

在这篇Technical Study: Overwatch(关于守望先锋的学习帖)中说道,D.VA 的头发有这样一张”奇怪的贴图”:

经过试验,这张贴图应该是记录了Tangent的。
因为有这张贴图,守望的头发UV就可以随意摆放而不受限制了。

然而似乎用一个uv1也可以解决……还需要再学习

分享