SIGGRAPH 2020 Course: Samurai Shading in Ghost of Tsushima 知识点总结

SIGGRAPH 2020 Course: Samurai Shading in Ghost of Tsushima主要分享了《对马岛之魂》这款游戏中的一些图形学技术,包括

  • 渲染强各向异性的材质
  • 渲染强asperity scattering的材质
  • 提升皮肤渲染的准确性
  • 改进的detailed map

《对马岛之魂》的背景放在13世纪封建社会的日本,玩家操作一名日本武士,为了解放被蒙古入侵的对马岛的故事。整个游戏的渲染风格不是写实(photorealism),而是风格化的(stylized realism)。用到的渲染管线多数是延迟管线,少许前向管线,具体的划分如下。

  • 延迟管线
    • 兰伯特漫反射部分,包括透明材质和asperity scattering部分。
    • 各向同性的GGX高光
  • 前向管线
    • 各向异性的GGX高光(SGGX)
    • 各向异性的asperity scattering BRDF
    • 次表面散射等

本文的思维导图如下。
xmind

各向异性的高光(Anisotropic Specular)

《对马岛之魂》的各向异性高光算法改进自2015年的一篇paper——The SGGX Microflake Distribution。在介绍SGGx以及《对马岛之魂》的改进之前,我们先看一下Microflake theory是怎么一回事。

Microflake theory

学习过PBR的同学应该对Microfacet theory比较熟悉,Microfacet theory讲的是对于一个粗糙的表面,可以视为是由无数个绝对光滑的微小表面(微表面)构成的。每个微表面都遵循镜面反射定律,而在宏观上,利用NDF来描述整体的特性。

类似地,Microflake theory描述的是体素的物理模型,常用于毛发、针织物之类物体的volume rendering。Microflake theory假设,在一个体素内充斥着各种椭球体的flakes,每个flakes都有一定的朝向性,也是绝对光滑的。光线在穿过这个体素的时候,会与这些flakes发生作用。但是不同于Microfacet theory,Microflake theory没有解决如何从宏观上描述flakes的形态的问题。
microflake

The SGGX Microflake Distribution

为了完善Microflake theory,SGGX应运而出。SGGX希望解决的是,如何在宏观上描述flakes的行为(类似于Microfacet theory用NDF描述微表面的朝向性),使得Microflake theory可以支持LoD。

SGGX模型的关键点有两个

  1. 提出了用投影面积描述flakes的宏观行为,类似于Microfacet theory中的roughness参数。
  2. 提出了用椭球体(ellipsoid)来编码投影面积的想法。

下面具体说说这两个关键点的含义。

光线在体素内部与flakes的相互作用有两个环节,一个是光线与flakes相交,另一个是光线被flakes反射。类似于ray tracing算法中追踪光线的两个步骤(求交与交互)。在第一个环节,光线与flakes发生碰撞的概率可以认为与flakes在光线方向上的投影面积成正比,投影面积越大,意味着越容易碰到光线。如下图所示。
intersection
而在第二个过程,我们要研究的是光线如何被flakes反射。这时,flakes在光线的tangent方向(即normal的垂直方向)上的投影面积越大,光线被反射地越分散。此时flakes在光线tangent方向上的投影面积,就类似于Microfacet theory中的roughness这个参数了。
roughness
需要注意的是,这第二点其实并没有严格的数学推导,只是基于直觉的假设。

将Microflake理论中flakes的(包括在光线方向以及光线的tangent方向的)投影面积等效于Microfacet理论中的roughness,这是SGGX模型的第一个洞见。接下来的问题是,如何宏观上表示这一堆零散的Microflake,将它们的朝向或者说投影面积用类似于Microfacet理论中的NDF函数表示呢?

这就引出了SGGX理论的第二个洞见——椭球体模型。如下图所示。
ProjectedArea
将不知到如何分布的一堆Microflake整合为一个完整的椭球体,这一步直觉上是可行的,但是同样缺乏严格的理论论证,只是SGGX理论给出的一个假设。这一假设也是SGGX模型的误差来源之一。

所以,我们就不经任何严格推理地假设,一块体素中的所有Microflake刚好可以构成一个椭球体,并且这个椭球体在各个方向上的投影刚好等于所有Microflake的投影的总和。那么,相对于Microfacet理论用两个粗糙度系数 α x \alpha_x αx α y \alpha_y αy,描述椭球体需要一个3x3的矩阵。
SGGXmatrix
好在这个3x3的矩阵是个对称矩阵,只有6个独立的参数。

到目前为止,还有一个问题一直没有提到,那就是SGGX究竟为什么叫SGGX?
SGGX
SGGX的全称是Symmetric GGX。GGX是Microfacet理论的一个法向分布模型,它是定义在半球面上的法向分布,这对描述表面属性的Microfacet理论是很好理解的,但是对于描述体素的Microflake理论而言,半球面分布的GGX很明显是不够的。而SGGX则是将半球面上分布的GGX对称到整个球面上,这也是symmetric S的含义。

改进的SGGX模型

SGGX模型用一个3x3的矩阵来描述椭球的形状,但是这个3x3的矩阵过于抽象,不太容易将这6个参数跟某个物理量(例如roughness之类的)对应起来,因此更实用的一个形式是将这个矩阵分解为特征向量与特征值相乘的形式:
SMatrix
方便起见,我们把这个矩阵称为 S e i g e n {\bf{S}}_{eigen} Seigen形式。三个特征向量对应椭球的三个轴,三个特征值对应沿着相应轴的投影面积的平方。这样描述还有一个好处,GGX可以看做是三个特征向量分别为 t ⃗ \vec{t} t b ⃗ \vec{b} b n ⃗ \vec{n} n 的特殊情况,此时对应的特征值分别为 α x 2 \alpha_x^2 αx2 α y 2 \alpha_y^2 αy2 1 1 1,前两个分别为粗糙度在tangent方向、bitangent方向的分量的平方。
GGXcase
但是凭空出现的这三个椭球的轴太诡异了,还不是我们需要的物理量。因此我们想把它搞成我们熟悉的轴,比如像GGX那样其中一个轴是法向。我们将SGGX的三个轴 ω ^ i \hat\omega_i ω^i稍作旋转,写成这个形式:
SMatrixNormal
我们把这个矩阵称为 S n o r m {\bf{S}}_{norm} Snorm形式。注意,这里的 t ⃗ \vec{t} t b ⃗ \vec{b} b n ⃗ \vec{n} n 向量并不是GGX里面用到的mesh的tangent空间,而是各向异性的tangent空间旋转对齐到normal后的tangent空间。各向异性的tangent空间不同于mesh的tangent空间的地方在于,后者由mesh定义,而前者可以由artist自行定义。这就使得各向异性不再受制于mesh走向,而可以自行决定偏置方向。而且,改写成这个形式以后,椭球体矩阵 S {\bf{S}} S只需要三个参数( S x x S_{xx} Sxx S x y S_{xy} Sxy S y y S_{yy} Syy)外加法向量。

使用SGGX模型

《对马岛之魂》引入SGGX的初衷,在于希望能够自主控制各向异性参数的tangent方向。默认情况下,各向异性参数的tangent方向是跟随mesh的,这就阻碍了美术的表现力。如果能将tangent方向与各向异性参数一起保存起来,美术效果就可以做的更好。再加上SGGX对LoD的良好支持,完美~

为了支持SGGX模型,并且设计相关材质,《对马岛之魂》自定义了一个Substance Designer node给artist使用。Artist需要指定材质的

  • Gloss UV,即在UV方向上的roughness系数
  • direction,即椭球体的朝向

然后,encode过程如下。

  1. 根据artist指定的normal和2x2各向异性GGX矩阵恢复SGGX矩阵的 S n o r m {\bf{S}}_{norm} Snorm形式
    encode1
  2. 这是获得的矩阵 S {\bf{S}} S是可以进行线性插值的,可以用于生成mipmap,获得新的差值后的矩阵 S ′ {\bf{S}}' S
  3. S ′ {\bf{S}}' S恢复成 S n o r m {\bf{S}}_{norm} Snorm形式,先迭代计算向量 n ′ {\bf{n}}' n,然后用 n ′ {\bf{n}}' n计算矩阵 M n ′ {\bf{M}}_{ {\bf{n}}'} Mn,最后计算 S x x ′ S_{xx}' Sxx S x y ′ S_{xy}' Sxy S y y ′ S_{yy}' Syy
    encode3
  4. 存储的时候将normal压缩存储在BC5的纹理中,2x2的各向异性矩阵的三个系数 S x x ′ S_{xx}' Sxx S x y ′ S_{xy}' Sxy S y y ′ S_{yy}' Syy以如下公式压缩存储在BC7纹理中。

[ S x x ′ , 1 2 S x y ′ S x x ′ S y y ′ + 1 2 , S y y ′ ] [\sqrt{S_{xx}'}, \frac{1}{2}\frac{S_{xy}'}{\sqrt{S_{xx}'S_{yy}'}} + \frac{1}{2}, \sqrt{S_{yy}'}] [Sxx ,21SxxSyy Sxy+21,Syy ]

这样一张额外的纹理就足以表达各向异性SGGX的参数了。相较于SGGX论文保存整个3x3矩阵的6个参数的方式节省了很多空间。
AnisoTexture
接下来是decode过程。假设各向异性纹理的三个通道分别为 T x T_x Tx T y T_y Ty T z T_z Tz

  1. 从纹理贴图中恢复 S x x ′ S_{xx}' Sxx S x y ′ S_{xy}' Sxy S y y ′ S_{yy}' Syy

S x x ′ = T x 2 S x y ′ = T x × ( T y × 2 − 1 ) × T z S y y ′ = T z 2 \begin{aligned} S_{xx}' & = T_x^2 \\ S_{xy}' & = T_x \times (T_y \times 2 - 1) \times T_z \\ S_{yy}' & = T_z^2 \\ \end{aligned} SxxSxySyy=Tx2=Tx×(Ty×21)×Tz=Tz2

  1. 求解2x2矩阵

( S x x ′ S x y ′ S x y ′ S x y ′ ) \begin{pmatrix} S_{xx}' & S_{xy}' \\ S_{xy}' & S_{xy}' \end{pmatrix} (SxxSxySxySxy)
的特征值 α t 2 \alpha_t^2 αt2 α b 2 \alpha_b^2 αb2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值