概述
保守光栅化是指将至少由渲染基元部分覆盖的所有像素光栅化,同时也意味着会调用像素着色器。正常行为是采样,而启用保守光栅化时不使用采样。
保守光栅化分为两种类型:
- 高估保守光栅化(overestimated CR, OCR):当像素和三角形重叠就算做三角形片段,如下图a;
- 低估保守光栅化(underestimated CR, UCR):当像素被三角形完全覆盖才算作三角形片段,如下图b。

保守光栅化主要用于碰撞检测、遮挡剔除、阴影加速的可见性测试和图块渲染。
主要API接口
可以通过glEnable(), glDisable() CONSERVATIVE_RASTERIZATION_NV开启和关闭保守光栅化。
void SubpixelPrecisionBiasNV(uint xbits, uint ybits)用来修改窗口坐标对齐精度。
可用于实现“合并”到低分辨率渲染目标,例如确定需要填充稀疏纹理的哪些图块。应用程序可以构建一个帧缓冲区,其中稀疏纹理中每个图块有一个像素,并调整子像素位数,以便对齐到与渲染到稀疏纹理时相同的有效网格。然后三角形应该(至少)覆盖低分辨率帧缓冲区中的相同像素,就像它们覆盖稀疏纹理中的图块一样。
void ConservativeRasterParameteri/fNV(enum pname, int param);
- CONSERVATIVE_RASTER_DILATE_NV:当使用保守光栅化来对几何图形进行分箱时,在相邻图元之间提供可编程的重叠区域。常规光栅化将具有共享边缘的三角形唯一的分箱为像素。保守光栅化沿共享边缘有一个像素重叠。使用半像素光栅化扩张,此重叠区域增加到两个像素。
- CONSERVATIVE_RASTER_MODE_NV:保守光栅化的模式
- CONSERVATIVE_RASTER_MODE_POST_SNAP_NV:生成的片段在捕捉到子像素网格后,相对于图元而言是保守的。
- CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV:则为三角形生成的片段将相对于无限精度的三角形而言是保守的。由于非退化三角形可能会因顶点捕捉而退化,因此此模式将为零面积三角形生成片段,否则当模式为 CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 时,这些三角形将被剔除。此模式还可以为距离三角形无限精度边界半个子像素距离内的像素生成片段。
mesa实现

在mesa的main层设置状态到gl_context结构体,然后在state tracker层设置状态到pipe_rasterizer_state结构体。在driver层并没有实现保守光栅化。
参考:
- Chapter 42. Conservative Rasterization | NVIDIA Developer
- Direct3D 12 保守光栅化 – Win32 apps | Microsoft Learn
- 19.10 渲染大场景 – 知乎 (zhihu.com)
- registry.khronos.org/OpenGL/extensions/NV/NV_conservative_raster.txt
- registry.khronos.org/OpenGL/extensions/NV/NV_conservative_raster_dilate.txt
- registry.khronos.org/OpenGL/extensions/NV/NV_conservative_raster_pre_snap_triangles.txt