如何在EGL或GLSurfaceView中设置OpenGL版本?

时间:2011-11-11 06:54:02

标签: android opengl-es opengl-es-2.0 egl

对于我正在研究的OpenGL Android项目,我需要ES 2.0,但我需要控制渲染缓冲区/表面,我习惯于使用EGL实现。因为我无法想出使用GLSurfaceView渲染到屏幕外缓冲区的任何方法,然后永远不会显示缓冲区。即使我使用GLSurfaceView.EGLContextFactory,如果没有Android EGL包中没有包含EGL 1.2函数/常量(例如EGL_CONTEXT_CLIENT_VERSION),我也无法想到任何方法。

所以第一个显而易见的问题是:有没有办法1)尽管省略了EGL_CONTEXT_CLIENT_VERSION和eglBindAPI(),使用EGL和ES 2.0? 2)是否有一些新的API用于设置GLSurfaceView的回调surfaceCreated(EGLConfig)被调用之前使用的渲染上下文?

1 个答案:

答案 0 :(得分: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