opengl - 如何永远更新场景

时间:2014-08-06 03:20:50

标签: android opengl-es glsurfaceview

对于每个传入的推文,我被要求在世界地图(opengl场景)上放置一个点(对应于推文位置)。像this这样的东西。我试着学习OpenGL。我哭了。随着时间的推移,OpenGL开始感觉像我的朋友。他正在成为我最好的朋友。现在,我在Android上使用GLSurfaceView并假设我可以简单地逐个绘制点,一个接一个地调用glCear()。这样我只需将当前的tweet坐标保存在内存中。告诉自己,你是个天才。我和其他人一样受苦,他们已经解释了痛苦hereherehere。现在有一位大师,taught我的基本知识并告诉我,孩子,无论怎样,你都要打电话给glClear

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

  1. 绘制n分。之后,尝试一些诸如“渲染到纹理”之类的东西,并将该纹理用作下一个绘制下一个n点的背景。
  2. 在Mali sdk的EGL Preserve示例中使用EGL_BUFFER_PRESERVED。在Android API 17之前无法使用NDK作为Android EGL14 .Khronos EGL11尚未在Android中实现。最接近我的新朋友的人说,他根本不喜欢这样。
  3. 我还有其他选择,还是我解决了错误的问题?我想知道什么是OpenGL永远更新场景的方法。

2 个答案:

答案 0 :(得分:2)

我认为所有设备都不支持EGL_BUFFER_PRESERVED。因此,即使您可以使用API​​级别17,也可能不是您的解决方案。

您可以使用FBO对纹理进行主渲染。在完成FBO设置之后,在初始化整个事物时,您将清除该纹理一次。然后,每次获得新点时,将其绘制到纹理,然后将纹理复制到主帧缓冲区。

粗略地说,您在启动时有以下步骤:

  1. 创建纹理,并使用所需的格式/大小,参数等进行设置。
  2. 创建FBO,并将纹理设置为颜色附件。
  3. 准备渲染到FBO,调用glViewport()
  4. 致电glClear()
  5. 然后每次添加一个点:

    1. 将新点传递到Renderer实施中,然后触发重绘。
    2. onDrawFrame()中,绑定FBO进行渲染。
    3. 渲染点。
    4. 绑定默认帧缓冲区以进行渲染。
    5. 用于简单纹理的绑定着色器程序。
    6. 绑定纹理以进行采样。
    7. 画屏填充四。

答案 1 :(得分:1)

  

现在有一位大师,他教我基本知识并告诉我,小子,无论如何你都要打电话给glClear。

了解什么,什么时候弯曲,甚至打破这个规则都很重要。 或者如何克服它。主要问题,你应该从一个干净的平板开始每一帧的原因是主帧缓冲区损坏的可能性。主框架缓冲区并非真正属于"对于OpenGL,它只是从操作系统借给它的。无论它想要什么,操作系统都可以做到。

现在有一个简单的方法:画一个帧缓冲区,由你完全控制的图像存储支持。在OpenGL(-ES)中,它将是一个帧缓冲对象。