我有一个使用标准渲染到纹理设置的跨平台代码库(iOS 和 Android)。每一帧(初始化后),都会发生以下序列:
- 带有纹理颜色附件的帧缓冲区的 glBindFramebuffer
- 渲染一些东西
- *
- 默认帧缓冲区的 glBindFramebuffer(Android 上为 0,iOS 上通常为 2)
- 作为第一个帧缓冲区的颜色附件的纹理的 glBindTexture
- 使用绑定纹理进行渲染
在 iOS 和一些 Android 设备(包括模拟器)上,这可以正常工作并且符合预期。在其他设备上(当前坐在运行 4.0.4 的三星 Galaxy Note 前面),使用纹理的第二阶段渲染看起来“跳跃”。其他动画在与“跳跃”位相同的屏幕上继续以 60 fps 运行;我的结论是,在第二次渲染过程中,目标纹理的变化并不总是可见的。
为了测试这个理论,我在上面标有 * 的步骤中插入了一个 glFinish()。现在,在所有设备上,这具有正确的行为。有趣的是, glFlush() 并不能解决问题。但是 glFinish() 很昂贵,而且我还没有看到任何文件表明这应该是必要的。
所以,这是我的问题:当完成对纹理的渲染后,我必须做什么以确保最近绘制的纹理在以后的渲染过程中可用?