glDepthMask(GL_FALSE)
我有时会在渲染帧期间禁用深度缓冲区写入。这在某些 GPU(如摩托罗拉 Droid 的 PowerVR)上工作得非常好,但在带有 Adreno GPU 的 HTC EVO 上,我最终会发现帧缓冲区完全是垃圾(我看到我在某处渲染的网格的痕迹,但是整个屏幕大多是垃圾)。
如果我一直强制 glDepthMask 为真,那么一切正常。
我需要在部分 alpha 渲染期间关闭 glDepthMask。关闭深度写入会导致帧缓冲区被破坏的原因是什么?
glDepthMask(GL_FALSE)
我有时会在渲染帧期间禁用深度缓冲区写入。这在某些 GPU(如摩托罗拉 Droid 的 PowerVR)上工作得非常好,但在带有 Adreno GPU 的 HTC EVO 上,我最终会发现帧缓冲区完全是垃圾(我看到我在某处渲染的网格的痕迹,但是整个屏幕大多是垃圾)。
如果我一直强制 glDepthMask 为真,那么一切正常。
我需要在部分 alpha 渲染期间关闭 glDepthMask。关闭深度写入会导致帧缓冲区被破坏的原因是什么?
问题是glDepthMask
调用时必须为真glClearDepth
。这显然只适用于 Adreno GPU,不适用于 PowerVR GPU。
不确定这是否会有所帮助,但我想知道您是否仍需要清除深度缓冲区——尤其是在禁用 glDepthMask 之前。我相信 glDepthMask 只启用/禁用写入,而不是深度测试。也许 GL 实现仍在测试来自先前渲染通道的旧深度缓冲区信息,因此仅绘制到屏幕的一部分。然后它看起来很垃圾。一些实现可能会清除深度缓冲区,而另一些可能不会?如果这个建议完全没有达到目标,请忽略。
无论如何,希望在一些小的方面有所帮助。
iPhone4/iOS 模拟器。如果我没有在 glClear 之前将 glDepthMask 设置为 true,我的渲染就会被丢弃。我花了两天时间解决这个问题,将帧缓冲区转储到磁盘,调查整个帧的踪迹,进入代码......这是唯一有效的方法。
没关系。我真笨。我正在执行深度掩码 = false 的 glClear(COLOR | DEPTH),所以深度缓冲区根本没有被清除。我的第一个回复是由一整天的调试引起的:/