软光栅化遮挡剔除
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并行
- 遮挡物/被遮挡物大小阈值