游戏角色渲染(一)——基于PBR的头发渲染

2020-12-27   3,475 次阅读


一. 各向异性和各向同性概念

一个BRDF函数$fr$,如果它绕法线旋转之后形式不变,则称该BRDF是各项同性(isotropic) 的。否则,则称该BRDF为各向异性(anisotropic) 的。即,给定任意绕法线的旋转变换$R$,如果$fr$满足:

$$ fr = \frac{dL_o(w_o)}{dE(w_i)}=\frac{dL_o(Rw_o)}{dE(Rw_i)} $$

则$fr$为各项同性的。如果不满足,即存在一个$R$使得上式不成立,则$fr$为各项异性的。

二. 法线分布函数(Normal Distribution Function, NDF)的形状不变性(shape invariance)

各向异性与微面元的表面法线分布有着密切的联系。因此在推导各向异性BRDF的形式之前,我们需要对NDF进行更进一步的讨论。

在之前的讨论中,我们都是把NDF看成关于微面元法线方向h和表面法线方向n的函数。事实上,我们也可以从另一个角度看待NDF,即把其看成关于微面元斜率分布的函数。如下图所示,左侧的微面元对应的斜率分布函数如右图所示。图片来自Heitz 2014[1]。

img

拉伸微面元的效果相当于对斜率分布函数进行倒数拉伸,如下图所示。图片同样来自[1]。

img

假设我们将微面元看成高度场$h$,则斜率为$∇h$。设微面元$m$处法线为$(x_m,y_m,1)$,则可将斜率分布函数记作$P(x_m,y_m)$,那么法线分布函数可表示为:

$$ D(w_m)=\frac{P(x_m,y_m)}{cos^4θ_m} $$

现在我们考虑粗糙度参数$α$,则P写作$P(x_m,y_m,α)$。如果改变α的值相当于将$P$作拉伸而不改变$P$的形状,则称该NDF具有形状不变性。此时P可以写成如下形式:

$$ P(x_m,y_m,α) = \frac{1}{α^2}f(\frac{\sqrt{x_m^2 + y_m^2}}{α})=\frac{1}{α^2}f(\frac{tanθ_m}{α}) $$

可以推导出,对于任意大于0的实数$λ$,有:

$$ P(x_m,y_m,α)=\frac{1}{λ^2}P(\frac{x_m}{λ},\frac{y_m}{λ},\frac{α}{λ}) $$

即改变粗糙度仅相当于对P做放缩。

在之前介绍的BRDF中,Beckmann和GGX都具有形状不变性,而Blinn-Phong不具备。

三. 各向异性BRDF

如果斜率$P$不是依赖一个粗糙度参数$α$,而是$x$和$y$方向上的两个粗糙度参数$α_x$和$α_y$,即$P$可以写成如下形式:

$$ P(x_m,y_m,α_x,α_y)=\frac{1}{α_xα_y}f(\sqrt{\frac{x_m^2}{α_x^2}+\frac{y_m^2}{α_y^2}})=\frac{1}{α_xα_y}f(tanθ_m\sqrt{\frac{cos^2ϕ_m}{α_x^2}+\frac{sin^2ϕ_m}{α_y^2}}) $$

式中$ϕ_m$为球坐标系下$m$的经度。则有:

$$ P(x_m,y_m,α_x,α_y)=\frac{1}{λ_xλ_y}P(\frac{x_m}{λ_x},\frac{y_m}{λ_y},\frac{α_x}{λ_x},\frac{α_y}{λ_y}) $$

即$α_x$和$α_y$分别控制$x$和$y$两个方向上的伸缩量。此时,我们称该NDF具有各项异性下的形状不变性。

上述推导表明,如果一个各向同性的BRDF具有形状不变性,那么可以很容易地写出其各向异性的形式。而对于几何遮蔽函数$G$,推导表明其各向异性的形式和各向同性相同,唯一的区别在于粗糙度参数$α$现在计算如下:

$$ α =\sqrt{cos^2ϕ_oα_x^2 + sin^2ϕ_oα_y^2} $$

称为在出射方向$o$上的投影粗糙度

我们将我们在前面文章中讨论过的BRDF的各向异性形式摘录如下。

3.1 Beckmann
$$ D = \frac{1}{πα_xα_y({n}\cdot{h})^4}exp(\frac{({n}\cdot{h})^2-1}{({n}\cdot{h})^2}(\frac{cos^2ϕ_h}{α_x^2}+\frac{sin^2ϕ_h}{α_y^2})) $$

式中我们需要计算半角向量的经度$ϕ_h$。这需要确定切线的方向。设切线方向为$t$,副法线方向为$b$,那么我们可以按以下公式计算$cosϕ_h$和$sinϕ_h$:

$$ sinθ_h = \sqrt{1 - ({n}\cdot{h})^2} $$ $$ cosϕ_h=\frac{{t}\cdot{h}}{sinθ_h} $$ $$ sinϕ_h=\frac{{b}\cdot{h}}{sinθ_h} $$

代入后整理得到:

$$ D =\frac{1}{πα_xα_y({n}\cdot{h})^4}exp(-\frac{1}{({n}\cdot{h})^2}(\frac{({t}\cdot{h})^2}{α_x^2}+\frac{({b}\cdot{h})^2}{α_y^2})) $$
3.2 GGX
$$ D = \frac{1}{πα_xα_ycos^4θ_h(1 + tan^2θ_h(\frac{cos^2ϕ_h}{α_x^2} + \frac{sin^2ϕ_h}{α_y^2}))^2} $$

整理后可得:

$$ D = \frac{1}{πα_xα_y(\frac{({t}\cdot{h})^2}{α_x^2} + \frac{({b}\cdot{h})^2}{α_y^2} + ({n}\cdot{h})^2)^2} $$

UE4中相关代码如下:

// Anisotropic GGX
// [Burley 2012, "Physically-Based Shading at Disney"]
float D_GGXaniso( float RoughnessX, float RoughnessY, float NoH, float3 H, float3 X, float3 Y )
{
    float ax = RoughnessX * RoughnessX;
    float ay = RoughnessY * RoughnessY;
    float XoH = dot( X, H );
    float YoH = dot( Y, H );
    float d = XoH*XoH / (ax*ax) + YoH*YoH / (ay*ay) + NoH*NoH;
    return 1 / ( PI * ax*ay * d*d );
}

由于Blinn-phong不具备形状不变性,因此没有对应的各向异性形式。

四. 其他非物理的各向异性BRDF

4.1 各向异性Blinn-phong

虽然Blinn-phong不具备形状不变性,无法据此推导出各向异性形式,不过,Unity Community Wiki给出了一个Blinn-phong的各向异性shader,代码如下:

struct SurfaceOutputAniso {
                 fixed3 Albedo;
                 fixed3 Normal;
                 fixed4 AnisoDir;
                 fixed3 Emission;
                 half Specular;
                 fixed Gloss;
                 fixed Alpha;
};
 
float _AnisoOffset, _Cutoff;
inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten)
{
    fixed3 h = normalize(normalize(lightDir) + normalize(viewDir));
    float NdotL = saturate(dot(s.Normal, lightDir));
 
    fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h);
    float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180)));
 
    float spec = saturate(dot(s.Normal, h));
    spec = saturate(pow(lerp(spec, aniso, s.AnisoDir.a), s.Gloss * 128) * s.Specular);
 
    fixed4 c;
    c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + (_LightColor0.rgb * spec)) * (atten * 2);
    c.a = 1;
    clip(s.Alpha - _Cutoff);
    return c;
}

其主要思路是使用扰动过的法线来计算高光:

fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h); 

这一思路在2006年Siggraph Course上Hoffman等人也提到过[2],不过他们是直接使用切线来代替法线进行高光计算。而sin等项可以使得高光呈现环状:

float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180)));
4.1 Ashikhmin-Shirley BRDF[3]

公式如下:

$$ f_{sepc} = \frac{\sqrt{(n_u + 1)(n_v+1)}}{8π}\frac{(cosθ_h)^{n_ucos^2ϕ_h+n_vsin^2ϕ_h}}{({h}\cdot{v})max(cosθ_i,cosθ_v)}F({h}\cdot{v}) $$

式中$n_u$,$n_v$分别是切线和副法线方向上的光泽度值,$F$是Schilick-Fresnel项。该BRDF尝试为Blinn-Phong提供一个有一定物理依据的各向异性形式。通过调节$n_u$和$n_v$的值可以控制高光的形状,如下图所示。下路来自论文[3]。

img

五. 实现基于物理的各向异性BRDF的头发表面材质

基于BRDF各向异性的理论和游戏天涯明月刀的渲染分析,还原天涯明月刀的头发渲染。

面片头发均是采用了半透的U型安然效果,为了保证半透明的正确性,目前主流的方式是2的Pass绘制:

  1. 首先,开启深度写入和深度测试,并且渲染的时候开启AlphaTest这时候Shader只需要读取最基本的颜色纹理,用来做AlphaTest。

  2. 然后,第二个Pass是头发效果的主要着色过程,有如下几个要点:

    • 在Tangent方向上做扰动偏移模拟头发的高光区的随机范围。

      $$ T_{shift} = normalize(N_{original} * Shift + T_{original}) $$ $$ B_{shift} = cross(N_{original}⋅T_{shift}) $$

      其中$N$是Normal,$T$是Tangent,$B$是Binormal,$Shift$是扰动系数。

      天涯明月刀手游的扰动系数是一张扰动图中的值(范围在0~1)然后减去0.5(此时范围在-0.5~0.5)然后在乘以缩放因子$Factor$。

      $$ Shift = (ShiftTexture - 0.5) * Factor $$

      下图是天涯明月刀的扰动参数纹理:

      image

    • 使用的是GGX的各项异性公式变体:

      $$ D = \frac{1}{RoughnessB * RoughnessT * (\frac{TOX^2}{(1-0.9*Factor)^2 * RoughnessT}+\frac{BOX^2}{\frac{RoughnessT}{(1-0.9*Factor)^2}} + NOX^2)^2} $$

      其中$RoughnessT$为该表面在Tangent方向上的粗糙程度,$RoughnessB$为该表面在Binormal方向上的粗糙程度,Factor是一个调节参数可以调节头发高光光带的形状。$X$可为半角向量$H$【$H=normalize(L+V)$】,视向量$V$,偏移视向量$V_{shift}$【天涯明月刀中为:$V_{shift}=normalize(V * 0.382 + Vector3(0.000000, 0.618000, 0.000000))$】。

    • 最终分别以分别以$H$、$V$、$V_{shift}$($V$的偏移)三个参数分三次计算高光和漫反射并叠加,丰富高光。最终效果如图:

      image

参考文献:

[1]:Heitz, Eric. "Understanding the masking-shadowing function in microfacet-based BRDFs." (2014).
[2]:Hoffman, Naty, J. Kautz, and D. Baker. "Physically based reflectance for games." *International Conference on Computer Graphics and Interactive Techniques: ACM SIGGRAPH 2006 Courses*. Vol. 2006. 2006.
[3]:Ashikhmin, Michael, and Peter Shirley. "An anisotropic phong BRDF model." Journal of graphics tools 5.2 (2000): 25-32.

参考文章:

【1】: PBR理论体系整理(二):各向异性
【2】: 记·天刀手游角色渲染分析

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议