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

3
对于我正在进行的OpenGL Android项目,我需要ES 2.0,但我需要通过使用EGL实现对呈现缓冲区/表面的控制。因为我找不到任何方法来使用GLSurfaceView渲染到离屏缓冲区,然后永远不显示该缓冲区。即使我使用GLSurfaceView.EGLContextFactory,我也想不出任何方法在不使用Android EGL包中未包含的EGL 1.2函数/常量(例如EGL_CONTEXT_CLIENT_VERSION)的情况下完成此操作。
因此,第一个明显的问题是:有没有办法使用EGL与ES 2.0,尽管省略了EGL_CONTEXT_CLIENT_VERSION和eglBindAPI()?第二个问题是:是否有一些新的API可用于在调用GLSurfaceView的回调surfaceCreated(EGLConfig)之前设置所使用的呈现上下文?
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接