8

我有一个使用标准渲染到纹理设置的跨平台代码库(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() 很昂贵,而且我还没有看到任何文件表明这应该是必要的。

所以,这是我的问题:当完成对纹理的渲染后,我必须做什么以确保最近绘制的纹理在以后的渲染过程中可用?

4

1 回答 1

5

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

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

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

于 2013-03-04T03:43:29.037 回答