Android 深度纹理清除不工作

Android 深度纹理清除不工作,android,opengl-es-2.0,depth-buffer,render-to-texture,mali,Android,Opengl Es 2.0,Depth Buffer,Render To Texture,Mali,我正在OpenGLES2.0中实现阴影映射。我使用OES_depth_纹理扩展将深度渲染为类型为UNSIGNED_SHORT的depth_附件纹理。该解决方案适用于我的macbook,甚至适用于WebGL。但是在Android(Acer B1-721、Mali-400 MP、Android版本4.4.2)上,清除深度纹理存在问题。我还没有在其他设备上试过(这是我唯一的安卓系统) 大多数时候,深度纹理根本不清晰。有时(很少)它会清除一帧。当我挂起应用程序或屏幕变暗时,它也会将其清除 我知道Mali

我正在OpenGLES2.0中实现阴影映射。我使用OES_depth_纹理扩展将深度渲染为类型为UNSIGNED_SHORT的depth_附件纹理。该解决方案适用于我的macbook,甚至适用于WebGL。但是在Android(Acer B1-721、Mali-400 MP、Android版本4.4.2)上,清除深度纹理存在问题。我还没有在其他设备上试过(这是我唯一的安卓系统)

大多数时候,深度纹理根本不清晰。有时(很少)它会清除一帧。当我挂起应用程序或屏幕变暗时,它也会将其清除

我知道Mali-400 MP很旧,但它确实声称它支持OES_深度_纹理。不过,这听起来像是司机的问题。有没有人有类似的经历?有没有绕过这个问题的想法

编辑: 问题不仅仅在于深度纹理。在渲染到纹理时,我也遇到了类似的问题,即正常深度缓冲区。当我降低纹理大小时,效果会更好,但仍有一些闪烁。此外,减少顶点的数量也会减少闪烁。可能是内存带宽问题

编辑: 关于这个问题的一些讨论
不仅是清理工作不起作用。FBO深度缓冲区(纹理或渲染缓冲区,无所谓)上的所有操作在管道中的错误时间执行或丢弃。glFinish解决了这个问题,但在其他方面不是一个很好的解决方案。

在清除调用(glFlush())后是否尝试过刷新?有时这些东西只是帮助你,因为你声称它的行为有点随机。谢谢你的建议。我试过了,但是没有效果。好吧,一个glFinish真的成功了。但我不知道为什么需要它。我的理解是不应该显式地使用它。我没有考虑过这个命令,因为我从来没有真正需要它的情况。我很高兴它解决了您的问题,但这可能会带来另一个问题。这个调用可能会中断你的线程相当长的一段时间,如果我可以假设我们讨论的是Android上的主线程,那么产生崩溃是非常危险的。请尝试在单独的线程上执行此操作;确保您的上下文在该线程上设置为当前,并等待执行完成。我所说的等待是指在你的draw方法中有一些标志,如果正在执行该操作,则放弃所有其他openGL调用。很抱歉使用注释,但这还没有准备好回答。。。因此,在调用finish时,draw方法应该什么都不做,并且可能会被多次调用,直到finish命令执行完毕。一旦执行完毕,绘图方法应解锁并继续绘图。以防万一,我会在测试时添加一点睡眠,看看在删除帧时是否一切顺利(完成后移除睡眠)。如果一切都很好,请制定一个答案与代码,你没有包括,并提到我在评论中,所以我可以删除这些。谢谢。在清除呼叫(glFlush())后,您是否尝试过刷新?有时这些东西只是帮助你,因为你声称它的行为有点随机。谢谢你的建议。我试过了,但是没有效果。好吧,一个glFinish真的成功了。但我不知道为什么需要它。我的理解是不应该显式地使用它。我没有考虑过这个命令,因为我从来没有真正需要它的情况。我很高兴它解决了您的问题,但这可能会带来另一个问题。这个调用可能会中断你的线程相当长的一段时间,如果我可以假设我们讨论的是Android上的主线程,那么产生崩溃是非常危险的。请尝试在单独的线程上执行此操作;确保您的上下文在该线程上设置为当前,并等待执行完成。我所说的等待是指在你的draw方法中有一些标志,如果正在执行该操作,则放弃所有其他openGL调用。很抱歉使用注释,但这还没有准备好回答。。。因此,在调用finish时,draw方法应该什么都不做,并且可能会被多次调用,直到finish命令执行完毕。一旦执行完毕,绘图方法应解锁并继续绘图。以防万一,我会在测试时添加一点睡眠,看看在删除帧时是否一切顺利(完成后移除睡眠)。如果一切都很好,请制定一个答案与代码,你没有包括,并提到我在评论中,所以我可以删除这些。非常感谢。