一、OpenGL ES 2.0之版本设置源码分析

945 阅读1分钟

本文是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还未被初始化之前,否则会抛出异常。