【问题标题】:Depth-fighting solution using custom depth testing使用自定义深度测试的深度战斗解决方案
【发布时间】:2019-06-18 10:23:23
【问题描述】:

我的问题的核心是我在纯 OpenGL 中进行深度战斗时遇到了麻烦。 我有两个相同的几何形状,但一个比另一个简单。 这形成了一组完美共面的多边形,我想在更简单的几何图形之上显示复杂的几何图形。

不出所料,当我使用 OpenGL 深度缓冲区按顺序绘制两组三角形时,它会导致我陷入深度冲突。目前,我已使用glPolygonOffset 对其进行了修补,但此解决方案不适合我(我希望多边形完全共面)。

我的想法是在绘制第二组三角形时临时使用自定义深度测试。我想在第一组渲染期间保存片段的深度。接下来,我将使用glDepthFunc(GL_ALWAYS) 禁用深度缓冲区(但仍在其中写入)。在渲染第二组时,我会丢弃 z 大于我刚刚创建的内存的片段,但有一定的余量(我猜,至少是特定 z 处 Z 缓冲区精度的一倍)。然后我会将深度函数重置为GL_LEQUAL

其实,我只是想为深度测试强加一定的余量。

这是一种可能的方法吗? 问题是我不知道如何将信息(自定义深度缓冲区)从一个程序传递到另一个程序。

谢谢

PS:我还研究了帧缓冲区对象和延迟渲染,因为显然它允许通过“G 缓冲区”传递信息,但是一旦我写了:

unsigned int gBuffer;
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);

我的窗口变黑了……对不起,如果事情很明显,我还不熟悉 OpenGL

【问题讨论】:

  • 您的深度方法与使用glPolygonOffset 有何不同?最后,我不认为你想要什么是可能的,因为在绘制第二个对象时,你必须同时读取和写入深度缓冲区,这并不容易。
  • "glPolygonOffset 但此解决方案不适合我(我希望多边形完全共面)。" - glPolygonOffset 仅更改深度值,不更改'在投影到视口时不会产生任何失真。
  • @Kiord 因此,您必须将深度缓冲区保持在“主”对象之后。启用深度测试,但在主对象之后设置glDepthMask(GL_FALSE)并按分层顺序绘制。
  • @Rabbid76 LOL 我刚刚意识到我可以做到。谢谢 !问题解决了;)
  • @Rabbid76 谢谢!

标签: c++ opengl glsl zbuffer depth-testing


【解决方案1】:

正如 Rabbid76 所说,我可以使用 glDepthMask(GL_FALSE) 简单地禁用深度写入。 现在,我可以使用相同的偏移量绘制多层共面多边形。 解决了。​​

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 2016-04-01
    • 2017-08-13
    • 2016-05-08
    • 2020-11-28
    • 2021-04-23
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多