【问题标题】:How to set OpenGL version in either EGL or GLSurfaceView?如何在 EGL 或 GLSurfaceView 中设置 OpenGL 版本?
【发布时间】:2011-11-11 06:54:02
【问题描述】:

对于我正在处理的 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 用于设置渲染上下文?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2011-09-24
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多