关于android上的opengles和纹理

时间:2014-07-25 10:37:20

标签: java android textures opengl-es-2.0

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

GLSurfaceView处理为您设置上下文的所有复杂性。它创建一个独立于主(UI)线程运行的呈现线程,创建上下文,并使该上下文在呈现线程中保持最新。一旦调用了GLSurfaceView.Renderer实现上的方法,就已经有了当前的上下文,并且您已准备好进行OpenGL调用。

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

完成后,您可以进行OpenGL调用以创建纹理等。但不幸的是,这还不是整个故事。

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

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