【问题标题】:Are GL contexts "significant"?GL 上下文是否“重要”?
【发布时间】:2011-10-11 08:13:08
【问题描述】:

在 Android 中,渲染器会在 onSurfaceCreated、onSurfaceChanged 和 onDraw 中传递一个 GL10 对象。这个 GL10 的实际实例真的有什么特别的重要性吗,或者你可以实例化你想要的任何 GL10 实例吗?

我问的原因是我从不同来源收集到两条看似矛盾的信息:

  1. 我正在查看 gl2-android 的源代码,它是一组 ES 2.0 绑定。在示例 GL2Test.java 中,传递的 GL10 实例被完全忽略。渲染器只是简单地实例化一个 AndroidGL20 实例并使用它。

  2. 我一直在使用 Robert Green 的 OpenGL 动态壁纸代码。在他的介绍性博客文章中列出的许多 cmets 中,一些人指出,有时传递给 onSurfaceCreated 的 GL10 上下文会更改为不同的实例。如果发生这种情况,如果您不首先使用新实例重新加载纹理,则绘制将失败。所以解决方法是在 onSurfaceCreated 开始时进行测试,以确保它是同一个 GL10 实例并从那里决定是否重新加载。 (您不想每次都重新加载,因为每次屏幕旋转都会调用 onSurfaceCreated,这必须由动态壁纸支持。)

我要做的是设置 gl2-android 与动态壁纸一起使用。但我想确保我能以一种安全的方式使用它,避免上面第 2 点中描述的问题。

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    GL 上下文是保存当前 OpenGL 实例的所有信息的对象。每当您创建纹理、顶点缓冲区、表面、着色器或更改状态(混合模式、alpha 等)时​​,所有这些都存储在 context 中。销毁上下文最终会销毁在该上下文中创建的对象并重置 OpenGL 的状态,从这个意义上说,它们非常“重要”!

    OnSurfaceCreated 方法在第一次创建新上下文或销毁前一个上下文后(由于返回主屏幕、关闭显示或更改方向)被调用,这就是为什么在此之后,您将需要重新创建/上传所有资源,因为前一个资源已被销毁,并附有所有资源。

    【讨论】:

    • 感谢您的回答——这很有帮助。我只是想添加我从《Beginning Android Games》的作者那里得到的信息,这更具体到我正在寻找的信息。这对我很有效:
    • 传递给 onSurfaceCreated() 和 onDrawFrame() 的 GL10 的实际实例不包含任何特定于调用 onSurfaceCreated() 时分配的 GL 上下文的信息。您可以使用任何您喜欢的 GL10 实例在任何渲染线程中执行操作。只需使用 onSurfaceCreated() 作为您需要重新加载着色器和纹理等的信号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多