Far Land Leo Zeng

Normal Mapping

最近看UE分享的[Temporal AA]1 时卡在SpecularAA上,引出下面这些。

Specular Aliasing

原因是采样率, 非实时渲染中,因为采样率很高,对于一个pixel,积分发生在计算完成之后, 实时渲染的采样率极其有限,一般只有1,积分发生在建立mipmap的时:

$$spec = \sum {\left (\frac {N_{i} \cdot H}{|N_{i}|} \right )^s} \xrightarrow{Mipmap} \left (\frac {(\sum {N_{i}}) \cdot H}{|\sum {N_{i}}|} \right )^s$$

很显然这两个不等价,造成了Specular Aliasing。

normalmapping_aliasing

有知乎大神从TA的角度解释了一通2,但我更关注由此引出的mipmap问题。

LEAN Mapping

LEAN Mapping(包括进一步发展的CLEAN Mapping)3的出现就是为了解决这个问题。

normalmapping_lean

给出一张图,公式就不贴了,全是矩阵运算, 大意是,构建时协方差之类都保存下来,用以运行时候复原分布。

Good 还原度好,各向异性。

Bad LEAN需要5个通道(CLEAN需要4个通道),其中有些通道要求16-bit, Tangent Space, Blinn-Phong需要改成Beckmann。

本文重点不是这,不展开了,具体可以看这篇综述[Rock-Solid Shading]4

Mipmapping Normal Maps

来自Toksvig 2005,Mipmapping normal maps5

如果一个区域内的normal什么方向都有,那么平均normal就会很短,方差就较大,所以需要降低高光。

首先,在生成mipmap时候生成一个平均normal长度Na, 作者统计后决定,按下面关系将方差 $\sigma$ 信息编码进NaLength中:

$$ |N_{a}| = \frac{1}{1+\sigma^{2}} \Leftrightarrow \sigma^{2} = \frac{1-|N_{a}|}{|N_{a}|} $$

再引入一个近似,令$\sigma_{s} = s^{-\frac{1}{2}}$:

$$\cos ^{s} {\alpha} \approx e^{-\frac{a^2}{2} s} = e^{-\frac{a^2}{2 \sigma_{s}^2}}$$

可以看到,的确近似(cos:红色,s=1:绿色外圈,s=40:绿色叶状):

normalmapping_e

于是成功将次方项转为高斯函数。 再加个高斯核给它施加影响(相当于做一次模糊),由于高斯函数卷积特性也就是对方差项做个加法,论文中是用自己的方差带入计算,得到新高光项 s':

$$ \sigma_{{s}'} ^2 = \sigma ^2 + \sigma_{s} ^2 \Rightarrow {s}'= \frac{1}{1+s \sigma^2} s $$

作者用自己的大名定义了一个系数,“Toksvig factor”:

$$f_{t} = \frac{1}{1+s\sigma^2} = \frac{|N_{a}|}{|N_{a}| + s (1-|N_{a}|)}$$

修改之后的specular变成了:

$$spec = \frac{1+f_{t} s}{1 + s}\left (\frac{N_{a}\cdot H}{| N_{a}|} \right )^{f_{t} s}$$

由于,半球积分不为1:

$$\int_{hemi} \cos^{s} \alpha d \alpha = \frac{ 2\pi}{s+1}$$

需要保能量:

$$spec = \frac{1+f_{t} s}{2\pi}\left (\frac{N_{a}\cdot H}{| N_{a}|} \right )^{f_{t} s}$$

然而直接除并不对,Wild West开发人员提供了一种解法6

$$spec = \frac{f_{t} s+2}{8}\left (\frac{N_{a}\cdot H}{| N_{a}|} \right )^{f_{t} s}$$

同时他们也给出了实现方法。

高大上的模糊过程 :)

其他

Leanmap 较为重度,但还原性较好。 Mipmapping Normal Maps 简单粗糙够用。 Wild West6最后给出了两者结合的方向,以后再研究了。

此外,龚大的做法是在建立normal map的mipmap时,不但对生成的平均normal做normalize,而且把它的长度存到另一张texture,称为NaLength map。在渲染的时候,读取NaLength的内容,计算出ft,这样对原有流程改动很小7


  1. High Quality Temporal Supersampling ↩︎

  2. SpecularAA?楚留香的“粗糙度+=法线长度”是为了什么? ↩︎

  3. Lean Mapping ↩︎

  4. Rock-Solid Shading ↩︎

  5. Mipmapping Normal Maps ↩︎

  6. Specular Showdown in the Wild West ↩︎

  7. 超越lean-mapping ↩︎

If you liked reading this, you could subscribe by email.


Far Land Leo Zeng
Previously Variance Depth Map May 18, 2018
Up next 渲染中的球谐函数及Deringing February 12, 2019
© 2021 Leo. 粤ICP备19014316号-1