在 OpenGL 中,是否可以只绘制未被遮挡的三角形的边?

In OpenGL, is it possible to draw the edges of the unoccluded triangles only?

我有一个网格要用 OpenGL 渲染。我想要的是渲染它的边缘,但只渲染那些未被遮挡的面孔。但是,我意识到这是不可能的 only:

glEnable(GL_DEPTH_TEST);    // Enable depth test
glDepthFunc(GL_LEQUAL);     // Accept fragment if it closer to the camera than the former one
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

由于边缘之间没有深度信息,所以被遮挡的三角形的边缘仍然被渲染。

一种解决方法是先用背景色(在我的例子中是白色)绘制 GL_FILL 的三角形,然后分别绘制边。但是这样做会导致类似于 z-fighting 现象的伪影,即某些边缘看起来比其他边缘更薄甚至消失,如下所示

左边是我有的,右边是我想要的(在MeshLab中查看)。由于这种情况下三角形的深度测试似乎是不可避免的,所以我想我也在问:

如何在没有 z 冲突伪像的情况下在三角形上绘制边?

请注意,人脸剔除 没有用,因为它只能消除面向后方的人脸,但不能处理遮挡。

为第一遍设置多边形偏移 glPolygonOffset:

glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1, 1);

为第 2 遍禁用多边形偏移:

glDisable(GL_POLYGON_OFFSET_FILL);

多边形填充偏移以最小量操纵片段的深度。这导致第一遍中片段的深度略大于第二遍中相同片段的深度。这就是你摆脱深层冲突的方法。