【问题标题】:about opengles and texture on android关于 android 上的 opengles 和纹理
【发布时间】:2014-07-25 10:37:20
【问题描述】:

我们知道,在 OpenGL ES 中,android 上的 Renderer 类有 3 个 function:onDrawFrame, onSurfaceChanged, onSurfaceCreated. 我们可以在 onSurfaceCreatedonDrawFrame 中加载纹理。 我想知道我可以在 “Renderer” 之前加载纹理。可能我有一个名为“Map”的类,我可以在 “Map”中加载图像纹理 在“GLSurfaceView”创建之前。或者我可以在函数 "onSurfaceCreated""onDrawFrame" 之前加载图像纹理。

如果有人知道,请帮助我。

谢谢!!

【问题讨论】:

    标签: java android textures opengl-es-2.0


    【解决方案1】:

    不容易。但是(几乎)一切皆有可能。

    这里要理解的关键概念是 OpenGL 调用在当前上下文上运行。在进行任何 OpenGL 调用之前,您需要创建一个上下文,并使其成为当前的。当前的上下文适用于线程,因此不同的线程可以具有不同的当前上下文。我认为它没有明确定义如果您尝试在没有当前上下文的情况下进行 OpenGL 调用会发生什么,但它肯定没有任何用处。最可能的结果是什么都没有,或者崩溃。

    GLSurfaceView 为您处理设置上下文的所有复杂性。它创建一个独立于主 (UI) 线程运行的渲染线程,创建一个上下文,并使该上下文在渲染​​线程中处于当前状态。一旦你的 GLSurfaceView.Renderer 实现上的方法被调用,你就已经有了一个当前的上下文,你就可以进行 OpenGL 调用了。

    现在,如果您想在所有 GLSurfaceView 魔法发生之前进行 OpenGL 调用,您必须自己做很多事情。您可以调用EGL14 类的方法来创建您自己的上下文,并使其成为最新的。这有点痛苦,但不是很困难。我手头没有完整的代码,但你应该可以找到示例,或者从文档中找出答案。您将使用eglChooseConfig()eglCreateContext()eglMakeCurrent() 之类的方法,可能还会使用更多方法。

    完成后,您可以调用 OpenGL 来创建纹理等。但不幸的是,这还不是全部。

    一旦您的GLSurfaceView 生效,它将像往常一样创建自己的上下文。不同的 OpenGL 上下文可以共享资源(如纹理),但默认情况下它们不这样做。由于GLSurfaceView 对您已经创建的上下文一无所知,因此它不会与您的上下文共享资源。

    要启用资源共享,您必须通过GLSurfaceView 干预上下文的创建。您可以使用setEGLContextFactory 方法执行此操作。这允许您为GLSurfaceView 连接您自己的上下文创建,您现在可以在其中创建一个与您之前创建的上下文共享资源的上下文,并用于您的纹理加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多