渲染到纹理和同步

时间:2013-02-26 05:45:42

标签: android opengl-es

我有一个跨平台的代码库(iOS和Android),它使用标准的渲染到纹理设置。每个帧(初始化后),发生以下序列:

  1. 具有纹理颜色附件的帧缓冲区的glBindFramebuffer
  2. 渲染一些东西
  3. *
  4. 默认帧缓冲区的glBindFramebuffer(Android上为0,iOS上通常为2)
  5. 作为第一个帧缓冲区的颜色附件的纹理的glBindTexture
  6. 使用绑定纹理渲染
  7. 在iOS和一些Android设备(包括模拟器)上,这可以正常工作并且符合预期。在其他设备上(目前位于运行4.0.4的三星Galaxy Note前面),使用纹理的第二阶段渲染看起来“跳跃”。其他动画在与“跳跃”位相同的屏幕上继续以60 fps运行;我的结论是,在第二个渲染过程中,目标纹理的变化并不总是可见。

    为了测试这个理论,我在上面标有*的步骤中插入一个glFinish()。现在,在所有设备上,这都具有正确的行为。有趣的是,glFlush()并没有解决问题。但glFinish()价格昂贵,我还没有看到任何证明这应该是必要的文档。

    所以,这是我的问题:完成渲染到纹理以确保最近绘制的纹理在以后的渲染过程中可用时,我该怎么做?

1 个答案:

答案 0 :(得分:3)

您描述的代码应该没问题。

只要您使用单个上下文,而不选择任何放宽同步行为的扩展(例如EXT_map_buffer_range),那么每个命令都必须执行,就像它执行完全一样在API中指定的顺序,以及在API使用中,您在读取纹理之前将其呈现给纹理。

鉴于此,您可能在这些设备上遇到驱动程序错误。你能列出哪些设备遇到了这个问题吗?您可能会找到常见的硬件或驱动程序。