我有一个跨平台的代码库(iOS和
Android),它使用标准的渲染到纹理设置.每帧(初始化后),出现以下序列:
>带有纹理颜色附件的帧缓冲区的glBindFramebuffer
>渲染一些东西
> *
>默认帧缓冲区的glBindFramebuffer(Android上为0,iOS上通常为2)
> glBindTexture的纹理是第一个帧缓冲区的颜色附件
>使用绑定纹理渲染
在iOS和一些Android设备(包括模拟器)上,这可以正常工作并且符合预期.在其他设备上(目前位于运行4.0.4的三星Galaxy Note前面),使用纹理的第二阶段渲染看起来“跳跃”.其他动画在与“跳跃”位相同的屏幕上继续以60 fps运行;我的结论是目标纹理的变化在第二个渲染过程中并不总是可见的.
为了测试这个理论,我在上面标有*的步骤中插入一个glFinish().现在,在所有设备上,这都具有正确的行为.有趣的是,glFlush()并没有解决问题.但glFinish()价格昂贵,我还没有看到任何表明这应该是必要的文档.
所以,这是我的问题:在完成渲染到纹理以确保最近绘制的纹理在以后的渲染过程中可用时,我该怎么办?
解决方法
你描述的代码应该没问题.
只要您使用单个上下文,而不选择任何放宽同步行为的扩展(例如EXT_map_buffer_range),那么每个命令都必须执行,就好像它的执行顺序与API中指定的顺序完全相同,并且在您的API使用中,您在读取之前渲染到纹理.
鉴于此,您可能在这些设备上遇到驱动程序错误.你能列出哪些设备遇到了这个问题吗?您可能会找到常见的硬件或驱动程序.