3

对于我正在处理的 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) 在调用 GLSurfaceView 的回调 surfaceCreated(EGLConfig) 之前,是否有一些新的 API 用于设置渲染上下文?

4

1 回答 1

12

如果您可以使用默认的 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

于 2011-11-11T10:07:41.117 回答