glDepthMask(GL_FALSE)会破坏某些GPU上的帧缓冲区

时间:2011-03-01 23:41:05

标签: android opengl-es opengl-es-2.0 depth-buffer

我有时会在渲染帧期间通过glDepthMask(GL_FALSE)禁用深度缓冲区写入。这在某些GPU(如摩托罗拉Droid的PowerVR)上完全正常,但在HTC EVO和Adreno GPU上,我最终得到的帧缓冲区是完全垃圾(我看到了我在某处渲染的网格痕迹,但是整个屏幕大部分被删除了。)

如果我一直强制glDepthMask为真,那么一切正常。

我需要在alpha渲染的部分期间关闭glDepthMask。通过关闭深度写入会导致帧缓冲区被破坏的原因是什么?

3 个答案:

答案 0 :(得分:6)

问题是调用glDepthMaskglClearDepth必须为真。这显然仅适用于Adreno GPU,而不适用于PowerVR GPU。

答案 1 :(得分:1)

不确定这是否有帮助,但我想知道你是否还需要清除深度缓冲区 - 尤其是在禁用glDepthMask之前。我相信glDepthMask只启用/禁用写入,而不是深度测试。也许GL实现仍在测试来自先前渲染过程的旧深度缓冲区信息,因此仅绘制到屏幕的一部分。然后它看起来被破坏了。有些实现可能会清除深度缓冲区,其他可能不会?如果这个建议完全错过了商标,请不要理会。

无论如何,希望在某种程度上有所帮助。

答案 2 :(得分:0)

iPhone4 / iOS模拟器。如果我没有在glClear之前将glDepthMask设置为true,那么我的渲染会被删除。我花了两天时间解决这个问题,将帧缓冲区转储到磁盘上,调查整个帧的跟踪,踩到代码...... 这是唯一有效的方法。

没关系。我真笨。我正在执行glClear(COLOR | DEPTH),深度掩码= false,因此深度缓冲区根本没有被清除。 我的第一个回复是由一整天的调试引起的:/