【GAD翻译馆】对法线贴图做Mipmap

发表于2017-12-07
评论2 5k浏览

翻译: 张乾光(星际迷航)  审校:崔国军(飞扬971)


摘要

对单位长度的法线进行平均或是插值所得到的结果的长度会小于一个单位长度,除非足迹中的所有法线恰好相同。大部分算法只是简单的做一个归一化操作,但是这篇文章会探讨如何缩短可以用来作为法线变化的一个衡量,来消除由于反射高光的走样所带来的诸如闪烁等常见问题。

1,分别是带有锯齿(左边)和没有锯齿(右边)的效果。

这是一个开销非常低的实现方案,简单地用2D纹理查找来代替一个幂函数。这个技术的其他应用,比如像是免费的光泽度贴图,也会被讨论。

评估法线的变化

很显然,缩短后的法线不会封装所有关于法线如何在足迹内变化的信息。

长度为的均值法线可以用两组法线来表示一个高度各向异性的分布,分别距离平均值有30度,指向相反的方向。或者分布可以是完全各向同性的,而法线是在一个圆锥体内排列的。

一个好的中间区域是假设角偏差的分布为α的高斯分布,α带有一个标准偏差。图1显示了作为标准偏差函数的平均法线值的长度:

 

作为标准差的函数(用红色表示)以及一个近似(用绿色表示)。

我们从中可以看到,高斯分布不会产生一个很短的平均法线,而在实际情况中,在极端情况下可以观察到任意短的平均法线。因此,我们使用下面的近似(倒数的三阶泰勒近似),得到一个效果更理想的渐近行为(如图2中的绿色所示):

所以如果给定一个对法线贴图足迹内的法线平均后的法线,我们可以估计出标准差,使用上述公式来评估法线的贡献。

消除镜面高光带来的走样

利用这种信息的一种方法是消除凹凸贴图表面上镜面高光的走样现象,而这种走样通常是非常令人反感的。这个问题已经用一些负担更小的技术处理掉了,比如像是[Fournier 92][Shilling 97]。传统上,镜面高光是使用归一化后的平均法线来计算的,比如像是blinn-phong1中使用的这样:


其中H为半角向量,而S是光泽度分量[ Blinn 77 ]

然而,在理想情况下,您希望在法线贴图的足迹中对每个法线的幂函数进行相加,就像是下面这样:

由于幂函数不能进行线性组合,所以公式(2)中的近似会随着法线之间方差的增大而变差。

 通过将来自光泽分量s的钟形曲线与来自法线的高斯分布的钟形曲线相组合,可以获得更好的近似。

直接对这两个函数进行卷积将会扩大支持的范围,包含了整个球体(这是一个相当难看的表达式)。相反,我们用一个新的幂函数来近似组合函数。

组合的钟形曲线的光泽分量s'是通过在平面上用高斯分布近似两条曲线而得到的。 为了用高斯分布逼近幂函数,我们使用如下的公式:

从图3中的径向图可以看出,这种近似的效果是相当好的,尤其是随着增长的变化相应的变化很好:

 

针对S = 1(宽)和S = 40(窄波瓣)的余弦图(红色)和高斯(绿色)效果。

众所周知,对平面上的两个高斯分布用一个标准偏差σ进行卷积,可以得到另外一个具有更大的标准偏差的高斯分布,可以推导出。使用公式(4)两次,我们可以得到:

为了方便起见,我们引入一个“Toksvig因子,将原始的光泽分量s按比例缩小:

为了遵循能量守恒的限制,加宽的高亮的强度也需要相应的缩小,所以使用:


我们为镜面高光分量找到以下的表达式:

这只是带有一个较低指数和一个比例因子的Blinn-Phong表达式。 如果平均法线的长度很小(法线变化很大),那么Toksvig因子将接近于0。这使得镜面高光的光线变得更宽和更暗淡,会使得表面看起来更加的暗淡。 相反,如果平均法线的长度接近1(足迹内的法线几乎一致),也接近1,那么表面不变。

实现

在硬件中,传统的镜面幂运算通常是使用一维纹理的表格查找(每个分量一个表格)。

在伪代码中,这看起来大致如下:

要消除走样,请用以下代码进行替换:

二维表纹理包含(8)中用表示的表达式:

请注意,对应的行与1D表格纹理相同,而对应的行是常量

另外请注意,永远不能大于,所以整张纹理有三分之一的地方将永远不会被访问。最后注意,高光的亮度对平均法线长度的误差是相当敏感的。图4显示了高光的相对强度与平均法线的长度之间的关系。

4s1(红色)和s40(蓝色)时候的相对效果。

相对强度的导数,也就是对误差的敏感性可以用这样一个公式计算:

对于,表达式表为,这表明镜面高光指数高的情况下需要高精度的法线贴图。

或者,当信号噪声比下降的时候N接近1,这个效果可以被淘汰。这也可以在2D表格纹理中进行编码。举个简单的例子来说,如果使用8位有符号分量表示法线,则中的误差为,相对强度误差为(10)中表达式的0.0068倍。 在这个误差超过某个阈值的区域中,公式(9)中的表达式被替换为::

9)中的表达式是反走样的,而传统公式还是有走样情况的。

免费的光泽度贴图

需要注意的一点是,应用这种技术的时候,可以自由地改变表面上的光泽度分量:在基本法线贴图的一个区域中放置比单位法线短的法线会使该区域显得更加暗淡。使用公式(6)可以看出,当基准法线图中的法线按以下公式进行缩放的时候,s的光泽度必须小于最大光泽度:

来自插值法线的反走样镜面高光

利用缩短效应所带来的变化也可以应用于内插(即非法线映射的)后的法线,它会显示相关的走样瑕疵。这种技术涉及创建一个类似于归一化立方体贴图的立方体贴图(每个方向映射的是该方向上的单位法线),但是在没有归一化的情况下进行mipmap处理。 在这个立方体贴图中查找进行插值处理的法线会产生一个根据原始法线的变化率而缩短的法线。这个缩短的法线和上面一样使用,当法线变化很大的时候,会使得镜面高光变得更加宽泛和暗淡。

环境贴图

当使用环境贴图的时候,可以应用另一个变化(如Cass Everitt所建议的那样)。 当射线在法线贴图的修改过的表面发生反射的时候,足迹内法线的标准差将传播到反射中去,从而模糊反射的图像。这个效果可以通过计算环境地图的lod作为函数来进行建模。

参考文献

[Fournier92] A. Fournier, Filtering Normal Maps and Creating Multiple Surfaces,Technical Report TR-92-41, Department of Computer Science, University ofBritish Columbia, Vancouver, British Columbia, 1992

 [Shilling97] A. Schilling, Towards Real-Time Photorealistic Rendering: Challenges andSolutions, Proceedings of the 1997 SIGGRAPH /Eurographics Workshop on GraphicsHardware, pages 7-15, 1997

 [Blinn77] James F. Blinn, Models of Light Reflection for Computer SynthesizedPictures, Proceedings of the 4th Annual Conference on Computer Graphics andInteractive Techniques, p. 192-198, July 20-22, 1977, San Jose, California

 [Dominé03] Sébastien Dominé, Canonical Shaders for Optimal Performance, AustralianGame Developers Conference 2003

 

【版权声明】

原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引