在 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);
多边形填充偏移以最小量操纵片段的深度。这导致第一遍中片段的深度略大于第二遍中相同片段的深度。这就是你摆脱深层冲突的方法。
我有一个网格要用 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);
多边形填充偏移以最小量操纵片段的深度。这导致第一遍中片段的深度略大于第二遍中相同片段的深度。这就是你摆脱深层冲突的方法。