fangcun:使用分层遮挡贴图进行可见性剔除(3.概述)zhuanlan.zhihu.com
分层遮挡贴图。图片中圈出的矩形对应同一块区域。
表示某一像素块的数据:
,为权重。求平均意味着
的值为0.5。通过小心地设置纹理坐标,使用双线性过滤,我们就可以将2Nx2N的遮挡贴图绘制在NxN的矩形上,完成下一层级的遮挡贴图构造。
fangcun:使用分层遮挡贴图进行可见性剔除(5.算法-1.使用遮挡贴图进行重叠测试)zhuanlan.zhihu.com
4.遮挡贴图
在本节,我们给出使用纹理贴图特性快速构造分层遮挡贴图的算法。然后对我们的可见性剔除算法用到的分层遮挡贴图的特性进行说明。
我们定义一块区域的透明度为:这块区域的不透明部分占整块区域的比例。遮挡贴图是一个存储了屏幕空间每块区域透明度的二维数组。
4.1 分层贴图
有了最高分辨率的遮挡贴图,我们可以使用算法构造剩下的遮挡贴图。下图给出了这一过程:
![72e69bc44462bc06db22861c16c02052.png](https://img-blog.csdnimg.cn/img_convert/72e69bc44462bc06db22861c16c02052.png)
这一构造算法首先将遮挡物渲染到一张图像上,作为最高分辨率的遮挡贴图。最高分辨率的遮挡贴图不需要完全和要渲染的场景图像匹配,使用较低分辨率的遮挡贴图作为构造使用的第0级遮挡贴图,可以加速分层遮挡贴图的构造,但会对剔除的精度造成一定影响。开启MSAA后渲染第0级遮挡贴图,可以提高剔除精度(这是因为MSAA会自动进行图像过滤)。
4.2 快速构建分层贴图
我们可以使用图像硬件的纹理贴图特性对2x2大小的像素块进行过滤生成下一层级的遮挡贴图。对2x2大小的像素块求平均实际上是双线性过滤的一个特例,双线性过滤可以用下面的公式表示,
![5c9fc2e0d906e6e858619b4b9c306171.png](https://img-blog.csdnimg.cn/img_convert/5c9fc2e0d906e6e858619b4b9c306171.png)
其中
图形硬件进行纹理贴图需要一定的设置时间,当遮挡贴图的分辨率较小时,可能设置时间比图形硬件进行过滤操作的时间还长,这时直接使用CPU完成遮挡贴图的构建效果更好。
4.3 遮挡贴图的优点
使用遮挡贴图加速可见性剔除具有许多优点:
- 对于遮挡物没有要求:遮挡贴图对于遮挡物的形状,大小没有要求,只要可以被渲染到图像即可(比如广告板也可以被作为遮挡物)。
- 可以进行层次化的重叠测试:层次化的结构允许我们更快地完成可见性剔除,避免进行不必要的运算。
- 可以进行透明度估算:较低分辨率的遮挡贴图的透明度值是由较高分辨率的遮挡贴图插值得到的。如果一个像素的较高层次的遮挡贴图的透明度值很小,那么显然,它所对应的较低层次的遮挡贴图的透明度值极有可能也非常小,只有很小的概率构成遮挡(这是因为我们的遮挡贴图构造使用平均值过滤,而不是最大或最小值)。这使得我们可以在合适的时候提前结束重叠测试。
较低分辨率的遮挡贴图如果具有较高的不透明度,我们几乎可以认为这一区域是不透明的。
fangcun:使用分层遮挡贴图进行可见性剔除(5.算法-1.使用遮挡贴图进行重叠测试)zhuanlan.zhihu.com