抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

软光栅化遮挡剔除

DrawCall和着色十分昂贵,于是我们希望可以剔除掉那些看不见的物体,以提高性能。而简单的视锥剔除并不能剃干净场景的物体,于是需要遮挡剔除。

这篇文章是一个CPU端的遮挡剔除,需要离线制作Occlusion Mesh,但不依赖各种GPU Driven的技术

Intel认为,CPU端使用GPU生成的Depth buffer做剔除,如果你不提前开一个Depth Only Pass画深度,那就要用上一帧的深度,一般而言,根据连续性,用上一帧的深度也没什么问题。但实际上CPU和GPU的Tick频率可能不同,两者间可能会差好几帧,于是用复用上一帧的深度不靠谱。

那什么靠谱呢?在CPU端用软光栅画一个Depth buffer,保证一定是当帧剔除。

软光栅生成深度图

Tile Base的软光栅

若三角形横跨多个Tile,则在每个Tile组中都加入这个三角形

Tile间互相独立,并行软光栅

对于三角形内的像素,通过重心公式插值出深度

如果软光栅得到的深度比深度缓冲更接近观察者,写深度

剔除

1. 近裁剪平面裁剪

若近裁剪平面设为1,顶点的齐次坐标为w,若$0 < w < 1$,则裁剪通过

2. 视锥剔除

3. 深度测试

若一个物体、AABB有像素可见,那么整体都可见

如一个物体、AABB完全被遮挡,那就继续检测这个物体所有的像素,直到发现这个物体所有像素均被遮挡

优化

  • Tile Base
  • 视锥剔除
  • SSE intrinsics
  • TBB并行
  • 遮挡物/被遮挡物大小阈值

参考

Intel Software Occlusion Culling

评论