【问题标题】:opengl - how to keep updating a scene foreveropengl - 如何永远更新场景
【发布时间】:2014-08-06 22:14:44
【问题描述】:

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

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

  1. 绘制n 点。之后,尝试“渲染到纹理”之类的操作,并将该纹理用作下一张 n 点的下一张绘图的背景。
  2. 使用 EGL_BUFFER_PRESERVED,如 Mali sdk 的 EGL Preserve 示例中一样。需要 NDK,因为在 Android API 17 之前无法使用 Android EGL14。Khronos EGL11 尚未在 Android 中实现。我的新朋友最亲近的人说,他一点也不喜欢这样。

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

【问题讨论】:

    标签: android opengl-es glsurfaceview


    【解决方案1】:

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

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

    大致上,您在启动时有以下步骤:

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

    那么每次加一个点:

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

    【讨论】:

    • 感谢详细列表和 EGL_BUFFER_PRESERVED 部分。 TextureView 类会在步骤 4 到 7 中提供帮助吗?我的意思是跳过第二个着色器部分。
    • 我自己没用过TextureView。从文档来看,它听起来可以这样使用,所以它当然值得一试。
    • TextureView 与 SurfaceView 与 GLSurfaceView 应该无关紧要——它们都只是为 EGL 提供了一个目的地。
    • @fadden:按照我的理解TextureView,不会保存一份数据吗?使用我提出的解决方案,您渲染到纹理,然后将其复制到由GLSurfaceView 创建的表面。看来TextureView 可以直接渲染到视图表面?
    • TextureView 是 SurfaceTexture(a/k/a GL 消费者)加上一些渲染代码。渲染到 SurfaceTexture 并没有真正的帮助,因为当你调用 eglSwapBuffers() 时你仍然会看到双缓冲行为——如果你不调用它,你的 SurfaceTexture 纹理将不会更新。正如您所描述的,OP 作为 FBO 真正想要的是什么。 (参见source.android.com/devices/graphics/architecture.html
    【解决方案2】:

    现在来了一位大师,他教了我基础知识并告诉我,孩子,无论如何你都必须调用 glClear。

    知道何时弯曲甚至打破这条规则很重要。 或者如何克服它。 主要问题,即您应该从头开始每一帧的原因,是主帧缓冲区损坏的可能性。主帧缓冲区并不真正“属于”OpenGL,它只是从操作系统借给它的。操作系统可以对它做任何事情。

    现在有一个简单的方法可以解决这个问题:绘制到一个帧缓冲区,由一个您可以完全控制的图像存储支持。在 OpenGL(-ES) 中,这将是一个帧缓冲区对象。

    【讨论】:

    • 谢谢。不知道帧缓冲区不属于 OpenGL。
    • @Kiran:特别是主帧缓冲区,您与glBindFramebuffer(0) 绑定。这个特殊的帧缓冲区由操作系统的图形系统(X11、GDI、EGL 等)管理。到目前为止,您还可以使用图形系统的绘图方法在该帧缓冲区上进行绘制(对于双缓冲像素格式并不能可靠地工作,并且与深度缓冲区发生冲突)。但这是可以完成的。 BTDT。
    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多