我可以使用深度/模板缓冲区解决此 OpenGL 问题吗

Can I solve this OpenGL problem with the depth/stencil buffers

提问人:BENG 提问时间:9/2/2023 最后编辑:BENG 更新时间:9/2/2023 访问量:52

问:

我正在尝试将带有点和边的网格渲染为黑线和点,类似于 blender 等建模引擎。我有 3 个单独的绘制例程来绘制点、线和面(每个面都是一个或多个具有共享法线的三角形)。当我关闭深度测试时,我显然会得到每一行的渲染。在这里,我缩小了分辨率,以便我们可以看到像素。

depth test off

当我打开深度测试时,线的某些像素的 z 值比它所附着的三角形的边缘更远。因此,线条片段被人脸片段重写。我得到了这种虚线状的效果。

depth test on

我正在尝试编写一个绘制例程,用于渲染仅在相机前面的整行边缘。我可以使用模板或深度缓冲区吗?我最初考虑使用模板缓冲区来计算边缘片段前面有多少人脸片段。如果它是 0 或 1,则绘制线片段。但这仍然允许线条碎片完全位于面后面,而不仅仅是在角落。这也不考虑与相机凹陷的两张脸。

编辑:我了解到这种方法称为隐藏线删除。我目前正在研究是否有办法仅使用模板和深度缓冲区来做到这一点。

opengl 3d 渲染 深度缓冲区 stencil-buffer

评论


答:

1赞 Erdal Küçük 9/2/2023 #1

你面临的问题叫做:Z-fighting

缓解此问题的解决方法是通过 z 缓冲区分辨率(近平面和远平面之间的距离 - 距离越大,分辨率越低)或通过多边形偏移

阅读 wiki 文章(缓解部分),并跟进有关 LearnOpenGl - 深度测试和 OpenGl Wiki - 深度缓冲区精度的文章,以了解有关该主题的更多信息。

通常,多边形偏移量在大多数情况下都会起作用。