Normal map已经在实时应用中被广泛使用了,但长期以来一直有个缺陷:无法很好地做mipmap。所以在一定的视角和距离下,会出现明显的aliasing现象。在非实时渲染中,因为sampling rate很高,对于一个pixel,积分发生在计算完shading之后,也就是
[latex]spec = \sum {\left (\frac {N_{i} \cdot H}{|N_{i}|} \right )^\alpha}[/latex]
而实时渲染的sampling rate极其有限,一般只有1,积分是在建立mipmap的时候对normal做的,shading用的是积分后的normal:
[latex]spec = \left (\frac {(\sum {N_{i}}) \cdot H}{|\sum {N_{i}}|} \right )^\alpha[/latex]
很显然这两个不等价,造成了aliasing。
LEAN Mapping
I3D 2010的LEAN Mapping ...
上次实现的是Per-pixel Linked Lists方法,能做到高效地在单pass内剥离多层物体,但内存消耗不可控,而且性能和每个pixel的fragment list长度很有关系。HPG 2011上intel有个改进的方法,称为Adaptive Transparency(AT),号称能在可控的内存内做到稳定的性能和高质量的OIT。于是我打算实现一下这个方法。
方法描述
AT首先从alpha blending的方程本身下手。Alpha blending需要一个迭代的过程:
[latex]C_{n} = \alpha_{n} C_{n}+(1-\alpha_{n}) C_{n-1}[/latex]
透明渲染需要按照顺序,也就是因为这个迭代所致。AT引入了一个可见性函数
[latex]vis(z) = \prod_{0<z_{i}<z}(1-\alpha_{i})[/latex]
于是alpha blending方程就能重构 ...
2009年AMD在发布HD 5800的时候也发布了一个Order Independent Transparency(OIT)的demo,但只有介绍,没有多少可以参考的东西。GDC 2010上的OIT and GI using DX11 linked lists才给出了比较完整的算法细节。虽说这几年也有不少新的OIT算法出现,但作为具有标杆意义的OIT算法,Per-Pixel Linked Lists还是值得实现到KlayGE的开发版本中,以做对比。
算法
顾名思义,Per-Pixel Linked Lists的意思就是每个pixel上一个链表,存放属于该pixel的所有fragment。这种不均匀的数据结构对GPU来说是很要命的。
在Per-Pixel Linked Lists中,链表需要两个额外的buffer,一个称为fragments buffer,需要是屏幕尺寸的N倍,负责存放所有的fragment ...