对于我正在开发的opengl android项目,我需要es 2.0,但我需要控制渲染缓冲区/曲面,我习惯于使用egl来实现。因为我无法找到任何方法使用glsurfaceview渲染到屏幕外缓冲区,然后再也不显示缓冲区。即使我使用glsurfaceview.eglcontextfactory,如果没有未包含在android的egl包中的egl 1.2函数/常量(例如egl_context_client_version),我也无法想出任何方法来实现这一点。
因此,第一个明显的问题是:有没有一种方法可以1)将egl与es 2.0结合使用,尽管省略了egl_context_client_version和eglbindapi()?2)在调用glsurfaceview的回调surfacecreated(eglconfig)之前,是否有一些新的api用于设置所使用的呈现上下文?

最佳答案

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

关于android - 如何在EGL或GLSurfaceView中设置OpenGL版本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8090608/

10-13 03:06