使用自定义深度测试的深度对抗解决方案
Depth-fighting solution using custom depth testing
我的问题的核心是我在纯 OpenGL 中遇到深度冲突问题。
我有两个相同的几何图形,但一个比另一个简单。
这形成了一组完美共面的多边形,我想在更简单的几何体之上显示复杂的几何体。
不出所料,当我使用 OpenGL 深度缓冲区依次绘制两组三角形时,它会导致我陷入深度冲突。目前,我已经使用 glPolygonOffset
对其进行了修补,但此解决方案不适合我(我希望多边形完全共面)。
我的想法是在绘制第二组三角形时临时使用自定义深度测试。我想在第一组渲染期间保存片段的深度。接下来,我将使用 glDepthFunc(GL_ALWAYS)
禁用深度缓冲区(但仍写入其中)。在渲染第二组时,我会丢弃 z 大于我刚刚创建的内存的片段,但有一定的余量(我猜至少是特定 z 处 Z 缓冲区精度的一倍)。然后我将深度函数重置为 GL_LEQUAL
.
其实我只是想给深度测试强加一些余量
这是一种可行的方法吗?
问题是我不知道如何将信息(自定义深度缓冲区)从一个程序传递到另一个程序。
谢谢
PS :我还研究了帧缓冲区对象和延迟渲染,因为显然它允许通过 'G-buffer' 传递信息,但是一旦我写:
unsigned int gBuffer;
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
我的 window 变黑了...对不起,如果事情很明显我还不熟悉 OpenGL
正如 Rabbid76 所说,我可以使用 glDepthMask(GL_FALSE)
简单地禁用深度写入。
现在,我可以使用相同的偏移量绘制多层共面多边形。
已解决。
我的问题的核心是我在纯 OpenGL 中遇到深度冲突问题。 我有两个相同的几何图形,但一个比另一个简单。 这形成了一组完美共面的多边形,我想在更简单的几何体之上显示复杂的几何体。
不出所料,当我使用 OpenGL 深度缓冲区依次绘制两组三角形时,它会导致我陷入深度冲突。目前,我已经使用 glPolygonOffset
对其进行了修补,但此解决方案不适合我(我希望多边形完全共面)。
我的想法是在绘制第二组三角形时临时使用自定义深度测试。我想在第一组渲染期间保存片段的深度。接下来,我将使用 glDepthFunc(GL_ALWAYS)
禁用深度缓冲区(但仍写入其中)。在渲染第二组时,我会丢弃 z 大于我刚刚创建的内存的片段,但有一定的余量(我猜至少是特定 z 处 Z 缓冲区精度的一倍)。然后我将深度函数重置为 GL_LEQUAL
.
其实我只是想给深度测试强加一些余量
这是一种可行的方法吗? 问题是我不知道如何将信息(自定义深度缓冲区)从一个程序传递到另一个程序。
谢谢
PS :我还研究了帧缓冲区对象和延迟渲染,因为显然它允许通过 'G-buffer' 传递信息,但是一旦我写:
unsigned int gBuffer;
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
我的 window 变黑了...对不起,如果事情很明显我还不熟悉 OpenGL
正如 Rabbid76 所说,我可以使用 glDepthMask(GL_FALSE)
简单地禁用深度写入。
现在,我可以使用相同的偏移量绘制多层共面多边形。
已解决。