android - 渲染到纹理和同步

标签 android opengl-es

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

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

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

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

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

最佳答案

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

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

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

关于android - 渲染到纹理和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15082228/

相关文章:

android - Card.io Android SDK 如何在手动输入屏幕上更改标题文本和颜色

java - 在 snackbar 操作中,如何确保从数据库中永久删除软删除记录是安全的?

android - 关闭我的应用程序后未调用 BroadcastReceiver

android - 从 realm.io 读取并添加到 ListView

ios - 在 iOS 上创建 ttf 文件

opengl-es - OpenGL ES 中 glNormal3f 的目的是什么?

Nougat 7 不支持 Android 相机裁剪

java - 在 Android 上的单独线程上获取 GL10 实例

opengl-es - 自从将 SKShader 添加到 Sprite 后,如何计算当前时间?

algorithm - 帮助在 OpenGL ES 中绘制球体