【发布时间】:2018-04-05 12:10:04
【问题描述】:
我正在 OpenGL 中实现深度预通。在 Intel HD Graphics 5500 上,此代码可以正常工作,但在 Nvidia GeForce GTX 980 上却不行(下图显示了由此产生的 z-fighting)。我正在使用以下代码生成图像。 (所有与问题无关的都省略了。)
// ----------------------------------------------------------------------------
// Depth Prepass
// ----------------------------------------------------------------------------
glEnable(GL_DEPTH_TEST);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);
glUseProgam(program1); // The problem turned out to be here!
renderModel(...);
// ----------------------------------------------------------------------------
// Scene Rendering
// ----------------------------------------------------------------------------
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glDepthMask(GL_FALSE);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glUseProgam(program2); // The problem turned out to be here!
renderModel(...);
glDepthFunc 似乎没有更改为GL_LEQUAL。但是,当我在 RenderDoc 中逐步执行 GL 调用时,glDepthFunc 已正确设置。
这听起来像是驱动程序错误还是您有什么建议我可能做错了什么?当这是一个驱动程序错误时,我如何才能实现深度预通?
【问题讨论】:
-
为什么用
glDepthMask(GL_FALSE)禁用深度写入? -
你为深度缓冲区分配了多少位?
-
问题中的代码还远远不够,可能出错的地方太多了。例如,您是否在与两个通道相关的所有着色器中正确地将
gl_Position输出限定为invariant? -
@Rabbid76 我想到了
glPolygonOffset,但由于代码在英特尔上运行,我认为肯定有其他问题,并想先探索一下。但是,我实施了您的解决方案(解决方法)并且它完成了工作。 -
@Ripi2 如果你问为什么:我禁用深度写入是因为主渲染通道不需要渲染深度,因为它已经由预通道完成。如果你问为什么
glDepthMask(GL_FASLE):我想这是通常的方式。
标签: opengl rendering depth-testing