Opengl -如何永远更新一个场景



对于每个传入的tweet,我被要求在世界地图(opengl场景)上放置一个点(对应于tweet位置)。像这样的东西。我试着学习OpenGL。我哭了。随着时间的推移,OpenGL开始像我的朋友一样。他即将成为我最好的朋友。现在,我在Android上使用GLSurfaceView,并假设我可以简单地一个接一个地绘制点,一个接一个地绘制点,而无需调用glCear()。这样,我只需要保持当前的推文坐标在内存中。告诉自己,你是个天才。我像其他人一样受苦,他们解释了这里,这里和这里的痛苦。现在来了一个大师,他教我基本的,告诉我,孩子,你必须叫glClear无论如何。

我不能继续在内存中添加/存储所有点的坐标并调用glDrawArrarys,因为这必须在移动设备上一直运行。现在的选项是

  1. 绘制n点。之后,尝试"渲染到纹理",并使用该纹理作为下一个n点的下一个绘图的背景。
  2. 在Mali sdk中使用EGL保存样本中的EGL_BUFFER_PRESERVED。需要NDK,因为Android EGL14不能在Android API 17之前使用。Khronos EGL11尚未在Android上实现。我的新朋友最亲近的人告诉我,他根本不喜欢这样。

我还有其他选择吗?还是我解决错了问题?我想知道什么是OpenGL的方法来永远更新一个场景。

我相信并非所有设备都支持EGL_BUFFER_PRESERVED。因此,即使你可以使用API级别17,那也可能不是你的解决方案。

你可以使用FBO对纹理进行主要渲染。在你完成设置FBO之后,当你初始化整个事物时,你会清除纹理一次。然后,每次你得到一个新的点,你把它绘制到纹理,然后把纹理复制到主帧缓冲区。

大致来说,在启动时有以下步骤:

  1. 创建纹理,并设置所需的格式/大小,参数等
  2. 创建FBO,并设置纹理为颜色附件
  3. 准备渲染到FBO,调用glViewport()
  4. 呼叫glClear() .

每次添加一个点:

  1. 将新点传递到Renderer实现中,并触发重绘。
  2. onDrawFrame()中,绑定FBO进行渲染。
  3. 渲染点
  4. 为渲染绑定默认的framebuffer。
  5. 为简单的纹理绑定着色程序
  6. 为采样绑定纹理。
  7. 绘制屏幕填充四边形

现在来了一个大师,他教我基本的,告诉我,孩子,你必须调用glClear无论什么。

知道什么时候该改变甚至打破这个规则是很重要的。或者如何克服它。主要问题是主帧缓冲区损坏的可能性,这也是为什么您应该从头开始每个帧的原因。主帧缓冲区并不真正"属于"OpenGL,它只是从操作系统借给它。操作系统可以对它做任何它想做的事。

现在有一个简单的方法来解决这个问题:绘制到一个framebuffer中,后面是一个您可以完全控制的图像存储。在OpenGL(-ES)中,这将是一个framebuffer对象。

最新更新