首页 > 解决方案 > 在绘制网格表面和多边形边缘时如何避免 OpenGL 中的 z-fighting?

问题描述

考虑下图:

在此处输入图像描述

它具有可视化的网格表面和多边形边缘。更重要的是,即使边缘和面在绘制它们的位置上应该具有相同的 z 坐标并导致z-fighting,在此图像中,只要多边形边缘没有被 (不相邻的)多边形,并且没有可见的 z-fighting。这如何在 OpenGL 中实现?

标签: opengl

解决方案


我通常只在要渲染到的帧缓冲区上启用一些 MSAA,然后执行以下操作:

glDepthFunc(GL_LESS);
drawShadededMesh();

glDepthFunc(GL_LEQUAL);
drawWireMesh();

在大多数情况下,这通常效果很好。如果做不到这一点(如评论中所述),您可以尝试使用 glPolygonOffset。

glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1.0, 1.0); ///< may need adjustment for your use case
glDepthFunc(GL_LESS);
drawShadededMesh();
glDisable(GL_POLYGON_OFFSET_FILL);

glDepthFunc(GL_LEQUAL);
drawWireMesh();

推荐阅读