【发布时间】: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