渲染到纹理和同步

add*_*aon 7 android opengl-es

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

  1. 具有纹理颜色附件的帧缓冲区的glBindFramebuffer
  2. 渲染一些东西
  3. *
  4. 默认帧缓冲区的glBindFramebuffer(Android上为0,iOS上通常为2)
  5. 作为第一个帧缓冲区的颜色附件的纹理的glBindTexture
  6. 使用绑定纹理渲染

在iOS和一些Android设备(包括模拟器)上,这可以正常工作并且符合预期.在其他设备上(目前位于运行4.0.4的三星Galaxy Note前面),使用纹理的第二阶段渲染看起来"跳跃".其他动画在与"跳跃"位相同的屏幕上继续以60 fps运行; 我的结论是目标纹理的变化在第二个渲染过程中并不总是可见的.

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

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

Fro*_*ast 5

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

只要您使用单个上下文,并且不选择任何放松同步行为的扩展(例如EXT_map_buffer_range),那么每个命令都必须看起来像按照 API 中指定的完全相同的顺序执行,并且在 API 使用中,您在读取纹理之前先渲染纹理。

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