三维渲染中顺序无关的半透明混合(OIT)(二——Stencil Route)
1、A-Buffer算法。
在谈到Stencil Route之前,需要先讨论A-Buffer算法。A-Buffer是一种图形学(渲染方向)上的用于可见面分析(Visble Surface Detection)的技术,是Z-Buffer的衍生方法。
Z-Buffer是用于剔除 不透明 物体的算法。假设某个像素有A B C三个不透明物体重叠,A在最上面,B在中间,C在最底下,那么Z-Buffer的结果就是A,意味着B、C都被A遮蔽了,因此可以针对该像素点剔除。[ref:A-Buffer简介 - 鸟临窗语报天晴 - 博客园]
A-Buffer算法需要比Z-Buffer更多的内存。其中Z—Buffer仅需为每个像素位置一个基本的深度值即可。而A-Buffer为每个像素提供了可多达16个链式(chain)的数据,
在上图中表示的一个半透明对象的A—Buffer存储策略,其中depth<0表示其存在多个半透明的面,每个节点存储下一个面的深度信息。【A-Buffer Method - GeeksforGeeks】
2、抗锯齿
注意这个深度信息还可以存储某个投影点在该像素的所占面积,这可以用于实现狂锯齿效果。所谓抗锯齿,就是某个像素的颜色是相邻颜色的混合,而不是只取对应像素的。在线面的边角它们是不能完全占有这个像素的。比如下图中第6号点。
比如MSAA的抗锯齿算法,它采用的是周边8个像素并进行采样,
3、Stencil Route算法
Stencil Route是一种深度模版的路由,可以采用多种手段进行实现,一般采用A_Buffer算法实现深度存储和计算。
相比于上次说的Depth Peeling,有两个不同的分析结果,第一个是在 【stencil_routed_a-Buffer_sigg07.ppt】中,其提到ABuffer算法的效率会低,情况如下图。另外一份报告Stencil Route的效率可能比Depth Peeling快,以为相比于多次渲染,排序效率更高。
最后A-Buffer算法可能不是DX或者OpenGL自带的,而是需要自己实现的算法。