Android glDepthMask(GL_FALSE)在某些GPU上刷新帧缓冲区

Android glDepthMask(GL_FALSE)在某些GPU上刷新帧缓冲区,android,opengl-es,opengl-es-2.0,depth-buffer,Android,Opengl Es,Opengl Es 2.0,Depth Buffer,在渲染帧期间,我有时会通过glDepthMask(GL\u FALSE)禁用深度缓冲区写入。这在某些GPU(如摩托罗拉Droid的PowerVR)上运行得非常好,但在使用Adreno GPU的HTC EVO上,我最终发现帧缓冲区完全是垃圾(我在某处看到渲染的网格痕迹,但整个屏幕大部分都是垃圾) 如果我强迫glDepthMask始终为真,那么一切都会很好 我需要glDepthMask在alpha渲染期间关闭。关闭深度写入是什么导致帧缓冲区被破坏的?不确定这是否有帮助,但我想知道您是否仍然需要清除深

在渲染帧期间,我有时会通过
glDepthMask(GL\u FALSE)
禁用深度缓冲区写入。这在某些GPU(如摩托罗拉Droid的PowerVR)上运行得非常好,但在使用Adreno GPU的HTC EVO上,我最终发现帧缓冲区完全是垃圾(我在某处看到渲染的网格痕迹,但整个屏幕大部分都是垃圾)

如果我强迫glDepthMask始终为真,那么一切都会很好


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

不确定这是否有帮助,但我想知道您是否仍然需要清除深度缓冲区-尤其是在禁用glDepthMask之前。我相信glDepthMask只启用/禁用写操作,而不是深度测试。可能GL实现仍在测试来自上一个渲染过程的旧深度缓冲区信息,因此仅绘制部分屏幕。然后它看起来像垃圾。一些实现可能会清除深度缓冲区,而另一些可能不会?如果这个建议完全没有切中要害的话,我觉得可以不予理睬


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

问题是调用
glClearDepth
时,
glDepthMask
需要为true。这显然只适用于Adreno GPU,而不适用于PowerVR GPU。

iPhone4/iOS模拟器。如果在glClear之前未将glDepthMask设置为true,则会导致渲染失败。我花了两天的时间来解决这个问题,将帧缓冲区转储到磁盘,调查整个帧的跟踪,逐步编写代码。。。 这是唯一有效的办法

别客气。我很笨。我正在执行一个glClear(COLOR | DEPTH),DEPTH mask=false,因此深度缓冲区根本没有被清除。
我的第一个回复是因为一整天的调试://

那么你的问题是什么?嗯。。。为什么当我禁用glDepthMask时帧缓冲区被破坏了?我们也遇到了同样的情况,我们可以使用的每个Adreno GPU(Nexus One、HTC Inclusible 2和XPeria Play)。我们的解决方案是在每一帧的开头做一个glClear(GL\u DEPTH\u BUFFER\u位)。有趣的是我们甚至没有深度缓冲!安卓是如此可爱…
glClear(0)似乎帮了我的忙。是的,我正在渲染帧之前清除它。我将所有设置为1.0,开始渲染启用深度写入的不透明对象,然后执行禁用深度写入的alpha混合对象。深度测试几乎一直在进行,我也遇到了同样的问题;但我从未真正调用glClearDepth()。相反,我只是在每帧结束时确保glDepthMask是真的,并且场景不再被破坏。这似乎是Android或GPU驱动程序中的一个bug;对我来说,它发生在3个不同的Android设备上。