原文链接 by David Neubelt and Matt Pettineo, Ready at Dawn Studios
介绍-Introduction
《教团:1886》是PlayStation 4上一款即将来临的第三人称动作冒险游戏。当我们第一次开始项目的前期制作时,电影化(filmic)这个词我们经常用于描述我们想要实现的游戏视觉效果的电影质感。像影视光照,肮脏的街道和高精度细节的角色被认为是创建一个令人信服的19世纪伦敦的写照的关键元素。
在项目非常早的时期,我们就明确了利用基于物理的着色模型将是实现我们想要的游戏表现的关键组成部分。Cook-Torrance之类的微表面双向散射分布函数(BRDF),在我们的材质中被采用做常规的镜面反射BRDF,并且在整个渲染管线中执行能量守恒。我们为皮肤,头发,纤维,以及各向异性材质实现了数个供选择的BRDFs。
我们也意识到,拥有一个健壮的材质管线对于允许艺术家高效的创建数百个材质来填充我们的游戏世界是必要的。为了实现这个目的,我们为我们的材质利用了一个基于继承的资源格式,允许我们来创建一个标准的材质模板库,可以被修改以创建核心材质类型的不同特性的变化。我们同样实现了一个离线的材质组合管线,为材质自动生成参数映射,参数由一堆材质资源和混合映射定义。处理离线组合之外,我们为材质实现了一个执行期分层部分,允许任意的材质在像素着色器中合并。
为了对我们的角色和道具快速添加高质量细节材质,我们制作了一个3D纺织品扫描器。扫描器捕获了高分辨率的反射率和法线贴图,并且从中我们可以获得其他的贴图。我们在我们的材质中使用一个细节图层整合贴图到我们的材质管线中,为了覆盖高频的法线和反射率变化。
最后,当在像素着色器中直接执行我们的镜面反射BRDF时,我们研究并实现了一个技术来减少锯齿。我们的技术基于论文Frequency Domain Normal Map Filtering Han et al. [2007a] ,是用频域以及用于法线贴图mip级别计算的法线分布函数(NDF)对BRDF进行卷积。
核心着色模型-Core Shading Model
微表面镜面反射双向反射分布函数-Microfacet Specular BRDF
由于稳健性和相对于专用着色模型的质量,以及下一代控制台硬件更强大的GPUs的采用有可能加速了这一趋势,基于物理的微表面BRDFs在实时渲染领域快速成为现状。因为《教团:1886》是在PlayStation 4上发布,目标硬件巨大的计算量,我们觉得基于物理的BRDFs是自然的选择。我们默认的镜面反射BRDF采用Cook-Torrance的微表面BDRDF的形式Cook and Torrance [1982] :
这里l是光照方向,v是观察方向,h是半角向量,n是法线,F是菲涅尔项,G是几何体项,D是法线分布函数(NDF)。对于D项我们使用Walter et al. [2007] 发表的GGX分布,并且对于G项我们使用同一论文推导的匹配Smith遮蔽项:
这里m是有效的微表面法线方向,α是粗糙度参数。在实际中,BRDF可以通过以下调整被简化:
与Lazarov [2011] 类似,我们之后可以进行以下的替换,引入V,可见性项:
当n·v小于或等于0的时候,为了让几何体项在物理上真实可信Walter et al. [2007] ,例如典型的几何体项必须构造成G(n,l)=0。这个约束意味着确保光不能从观察者看不到的表面反射出去。满足这个要求需要修改几何体项:
实际应用中我们发现,当使用法线贴图的时候,n·v<0的像素经常出现。如果使用置换映射渲染,这些表面在光栅化之后被遮挡,但是如果使用常规的法线映射技术,这些表面保持可见并且必须被着色。然而这可能使得像素产生之前描述的G项的着色结果,由于在n·v=0处不连续,这样做会产生视觉瑕疵。相反,我们仅仅对这些像素进行着色,没有他们是否是正向的条件。这使得掠射角镜面反射向面对远离观察者的那一边衰减,产生了一个无瑕疵的结果。
图1:左图展示了当n·v<=0时,由于使用条件强制几何体项为0的瑕疵。有图展示了没有条件限制的相同场景。
各向异性镜面反射双向反射分布函数-Anisotropic Specular BRDF
为了处理各向异性材质,我们使用下面的替代:
这里αt是沿着切线方向的粗糙度,αb是沿着次法线方向的粗糙度。
相反的我们并没有暴露两个粗糙度的参数,我们的材质模型利用了一个单独的粗糙度参数α以及一个各向异性参数来描述两个粗糙度值之间的关系
使用来自Burley [2012] 的数学替代,我们得到用于着色的优化形式:
漫反射双向反射分布函数-Diffuse BRDF
对于漫反射部分,我们使用简化的Lambertain漫反射模型。为了确保能量守恒,漫反射项使用Shirley [1991] 镜面反射部分的菲涅尔项的倒数来平衡:
这里Cdiff是材质的漫反射反射率。应该注意到,这种平衡漫反射项的方式违反了亥姆霍兹互反律,可能会在某些渲染技术中造成问题,如果要求互反律,Shirley et al. [1997] 一个可替代的平衡方案,以额外的计算消耗为代价满足了互反律。
皮肤的漫反射双向反射分布函数-Diffuse BRDF for Skin
为了模拟存在于皮肤的次表面散射效果,我们使用了Penner and Borshukov [2011] 的预积分皮肤着色技术。这个技术利用Lambertain漫反射双向反射分布函数,对一个环上的不同点用半径r积分的预积分一张皮肤扩散分布R(x)来近似了次表面散射效果:
这里θ是环上的给定点与入射的光照方向l的夹角。当测定一个有曲率的表面的漫反射率等于一个给定的半径r的时候,预积分的结果可以之后被用于标准clamp余弦转换函数的替代。通过对一个特定范围的r执行积分,包含这样的转换函数的一个数组组成了一张2D的查找表(LUT)。为了便利性,贴图的索引是cos(θ)而不是θ,以避免昂贵的反三角函数。这造成对于精确光源不重要的计算:
这里Li是光源的强度。尽管这个方法适合在像素着色器中直接计算的光源,我们的引擎依然采用了环境光探针来存储一个光照环境作为三阶的球谐。首先,这些光照探针使用一个简单的Lambertain漫反射双向反射分布函数计算,这导致了我们的皮肤在没有强烈的直接光照的环境中产生生硬的,不自然的表现,见图2。
图2:图像展示了只被漫反射球谐探针(无镜面反射)照亮的皮肤材质。左图展示了使用标准Lambertain余弦瓣的球谐光照环境的卷积。右图展示了我们的解决方案,使用皮肤漫反射扩散的预积分生成的瓣卷积的光照环境。
为了提高这些区域的着色质量,我们为采用拥有球谐光照环境的预积分散射实现了一个解决方案。从Ramamoorthi et al.[2001] 回忆起使用球谐,表面入射辐照度E由于光照环境L可以被表示为一个频域卷积:
这里Al表示转换函数,在辐照度的情形下是clamp的余弦函数。这个推导利用了clamp的余弦项是放射状对称的事实,这使得带状谐调在表现转换函数的使用,和为光照环境从全局空间到一个局部表面法线的坐标空间转换的简化的旋转一样。因为我们的皮肤散射转换函数也是放射状对称的,我们可以为这些函数计算带状谐调系数Dl(r),并用它来代替clamp的余弦项。这些系数的计算通过对照达到要求的顺序的球谐偏差函数Yl,m,对转换函数D(θ,r)积分实现的,在我们的案例这是3:
因为我们没有一个D(θ,,r)的分析表征,我们使用蒙特卡洛积分估算积分的结果。这个积分对我们支持的曲率范围执行,提供了一张1D的查找表Dl(r),可以在运行时使用表面曲率被索引。用法线n和曲率r对表面计算漫反射率可以之后像在Ramamoorthi et al. [2001]证明的那样执行:
布料着色-Cloth Shading
对于布料,我们的艺术家一开始尝试使用我们常规的微表面双向反射分布函数来制作高质量的材质,但是不能得到令人信服的结果。问题的一部分是微表面模型使用了一个潜在的假设,那就是表面使用随机的v形凹槽构成,表现的像是完美的菲涅尔镜面。然而,在放大的摄像机镜头下仔细观察我们的纺织品库,发现布料符合微纤维模型打破了假设。使用我们已经收藏的纺织品库,例如图4和图5,我们判断布料需要少量的属性:
图3:简单的夹克布料的示例
·有较大平滑衰减的柔和的镜面反射瓣
·来自粗糙散射的对象边缘的绒毛,要么来自当光在对象后面的正向散射,要么来自当光线和观察方向相同时的反向散射。
·在正面角度的一个低但是值得注意的镜面反射贡献(光照,观察和法线是相同的)
·一些纺织品有两种色调的镜面反射颜色
对于纺织品,像黑色天鹅绒,最明显的特点应归于边缘光(正向及反向散射)。如果光照和观察者在一个方向上,由于反向散射和纺织品的结构,镜面反射对对象的边缘贡献最多。细小的纤维附着在表面上,所以他们试着站立起来。当光照和观察方向对齐时,以及当表面法线与光照或观察方向是90度时,光照将会反向散射。除此之外,如果光在对象的背后,纤维将会正向散射光线穿透,给出一个不错的边缘光效果。
我们注意到虽然布料纤维大多数想要在它的表面上站起来,但是依然有少量随机纤维方差。你也可以通过用你的手指梳理强制纤维在一个特定的方向。对于非掠射角随机方差捕获了足够的镜面反射,对于支持我们的模型十分重要。
尽管我们建模了粗糙散射和正向镜面反射,我们没有建模图5展示的瓣的不对称性。这个不对称性好像来自于纤维没有完全的直立,并且有一个在某一方向轻度倾斜的趋势。偏移分布函数可以实现这个效果,但是这不是我们追求的一个重要的质量,所以我们没有继续。
在考察了已有的解决方案之后,我们实现的天鹅绒分布基于 Ashikhmin和Premoze [2007]双向反射分布函数的Ashikhmin分布,因为它适合我们的需求,一点修改就满足我们的布料双向反射分布函数对天鹅绒之外的布料有用。
图4:左下图是和游戏发生的时期为同一时期的精确的服装样品。在左上,我们取了布料的样品,裁剪,分类并安装在我们样本书之一的一页上。最后,右边的扫描仪扫描样本并将它放进游戏中。
图5:包裹在圆桶上的两色天鹅绒,并且摄像机和光照面向相同的方向。注意镜面反射颜色向边缘更亮,因为粗糙的三和,和镜面反射的不对称性。
图6:在左图绿色的线条是GGX分布,当半角为0的时候有一个峰顶,天鹅绒分布的峰顶在半角90度的时候。中间列是一个使用GGX镜面反射的球,并且右列是使用天鹅绒分布的球。
对象边缘的绒毛可以用一个反相高斯模拟。分布在形式上与Beckmann分布密切相关。反相高斯分布实现了粗糙的散射光泽。为了获得正向的镜面反射,