对于我正在研究的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)被调用之前使用的渲染上下文?
答案 0 :(得分:11)
如果您可以使用默认的EGLContextFactory和EGLConfigChooser,则可以使用GLSurfaceView的setEGLContextClientVersion()方法。
否则,如果您正在编写自己的EGLContextFactory和EGLConfigChooser,请自行定义常量。在配置选择器中,定义
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;
}
编写完成后,请分别将其传递给setEGLContextFactory和setEGLConfigChooser。