本文是OpenGL ES 2.0源码分析的第一篇,关于设置OpenGL ES版本,从源码角度去追溯设置版本到底做了哪些事情。
我们知道使用OpenGL ES 2.0的时候,第一步我们总是要先设置使用的版本:
mGLSurfaceView.setEGLContextClientVersion(2);
mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mGLSurfaceView.setRenderer(new TexRenderer(this));
mGLSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
那么mGLSurfaceView.setEGLContextClientVersion(2);到底做了什么?
public void setEGLContextClientVersion(int version) {
// 检查GLThread是否被初始化,如果已经被初始化就抛出异常
checkRenderThreadState();
// 给Version字段赋值
mEGLContextClientVersion = version;
}
就是一个很简单的赋值,既然有了赋值,我们就去找一下这个字段是在什么时候被使用的。
/**
* EGL上下文工厂接口,提供两个接口,一个是创建上下文,一个是销毁上下文
*/
public interface EGLContextFactory {
EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig);
void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context);
}
private class DefaultContextFactory implements EGLContextFactory {
private int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig config) {
// 使用到了mEGLContextClientVersion,如果不设置默认为0
int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION,
mEGLContextClientVersion, EGL10.EGL_NONE };
// 其实最后就是通过调用egl里面的eglCreateContext去创建上下文
return egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT,
mEGLContextClientVersion != 0 ? attrib_list : null);
}
public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {
// 就是去销毁上下文,如果销毁失败抛出异常
if (!egl.eglDestroyContext(display, context)) {
EglHelper.throwEglException("eglDestroyContex", egl.eglGetError());
}
}
}
从上面的代码我们可以看出,其实最终用到版本信息的就是在我们创建EGLContext的时候。
总结:
其实设置版本信息,主要的作用就是用于创建EGLContext,至于EGLContext是什么,我们会在后面的文章谈到。还有一点比较重要的就是设置版本信息一定要在GLThread还未被初始化之前,否则会抛出异常。