2011-11-11 68 views
2

對於我正在開發的OpenGL Android項目,我需要ES 2.0,但我需要控制渲染緩衝區/表面,這些渲染緩衝區/表面我習慣使用EGL來實現。因爲我找不出任何方法使用GLSurfaceView渲染到離線緩衝區,然後從不顯示緩衝區。即使我使用GLSurfaceView.EGLContextFactory,我也無法想到如果沒有EGL 1.2函數/常量(不包括在Android的EGL包中)(例如EGL_CONTEXT_CLIENT_VERSION),我無法完成此任務。如何在EGL或GLSurfaceView中設置OpenGL版本?

因此,第一個顯而易見的問題是:是否有辦法或者1)使用EGL和ES 2.0,儘管遺漏了EGL_CONTEXT_CLIENT_VERSION和eglBindAPI()? 2)是否有一些新的API用於設置在GLSurfaceView的回調surfaceCreated(EGLConfig)被調用之前使用的渲染上下文?

回答

11

如果您可以使用默認的EGLContextFactory和EGLConfigChooser,您可以使用GLSurfaceView的setEGLContextClientVersion()方法。否則,如果您正在編寫自己的EGLContextFactoryEGLConfigChooser,只需自己定義常量即可。在配置選擇器,定義

private static final int EGL_OPENGL_ES2_BIT = 4; 

然後與其他屬性傳遞以此爲EGL_RENDERABLE_TYPE到eglChooseConfig的價值,一起你的願望:

int attribs[] = { 
    EGL10.EGL_RED_SIZE, mRedSize, 
    EGL10.EGL_GREEN_SIZE, mGreenSize, 
    EGL10.EGL_BLUE_SIZE, mBlueSize, 
    EGL10.EGL_ALPHA_SIZE, mAlphaSize, 
    EGL10.EGL_DEPTH_SIZE, mDepthSize, 
    EGL10.EGL_SAMPLE_BUFFERS, mSampleBuffers, 
    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
    EGL10.EGL_NONE 
}; 

對於上下文工廠,定義

private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; 

並在創建上下文時使用它:

public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) 
{ 
    int[] attrib_list = { 
    EGL_CONTEXT_CLIENT_VERSION, 2, 
    EGL10.EGL_NONE 
    }; 

    EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); 

    return context; 
} 

當你寫這些時,分別將它們傳遞給setEGLContextFactorysetEGLConfigChooser