众所周知,在 OpenGL ES 中,android上的类Renderer
有3 function:onDrawFrame, onSurfaceChanged, onSurfaceCreated.
我们可以在 onSurfaceCreated 和 onDrawFrame 中加载纹理。
我想知道我可以在"渲染器" 之前加载纹理。可能,我有一个名为" Map"的类,我可以加载图像纹理在" GLSurfaceView"之前的" Map" 中创建。或者我可以在函数" onSurfaceCreated" 和" onDrawFrame" 之前加载图像纹理。
如果有人知道,请帮助我。
谢谢!
答案 0 :(得分:2)
不容易。但(几乎)一切皆有可能。
这里要理解的关键概念是OpenGL调用在当前上下文上运行。在进行任何OpenGL调用之前,您需要创建一个上下文,并使其成为当前的。当前上下文适用于线程,因此不同的线程可以具有不同的当前上下文。我认为没有明确定义如果你试图在没有当前上下文的情况下进行OpenGL调用会发生什么,但它肯定没有任何用处。最可能的结果是什么都没有,或者是崩溃。
GLSurfaceView
处理为您设置上下文的所有复杂性。它创建一个独立于主(UI)线程运行的呈现线程,创建上下文,并使该上下文在呈现线程中保持最新。一旦调用了GLSurfaceView.Renderer
实现上的方法,就已经有了当前的上下文,并且您已准备好进行OpenGL调用。
现在,如果你想在所有GLSurfaceView
魔法发生之前进行OpenGL调用,你必须自己做很多事情。您可以调用EGL14类的方法来创建自己的上下文,并使其成为当前的。这有点痛苦,但并不十分困难。我没有完整的代码,但您应该能够找到示例,或者从文档中找出它。您将使用eglChooseConfig()
,eglCreateContext()
,eglMakeCurrent()
等方法,并且可能会使用更多方法。
完成后,您可以进行OpenGL调用以创建纹理等。但不幸的是,这还不是整个故事。
一旦你的GLSurfaceView
复活,它将像往常一样创建自己的上下文。不同的OpenGL上下文可以共享资源(如纹理),但默认情况下它们不会这样做。由于GLSurfaceView
对您已创建的上下文一无所知,因此它不会与您的上下文共享资源。
要启用资源共享,您必须通过GLSurfaceView
干扰上下文的创建。您可以使用setEGLContextFactory
方法执行此操作。这允许您为GLSurfaceView
连接自己的上下文创建,您现在可以在其中创建一个上下文,该上下文与您之前创建的上下文共享资源,并用于纹理加载。