Как установить версию OpenGL в EGL или GLSurfaceView? - PullRequest
2 голосов
/ 11 ноября 2011

Для проекта OpenGL Android, над которым я работаю, мне нужна ES 2.0, но мне нужен контроль буферов рендеринга / поверхностей, к которым я привык, используя EGL.Ибо я не могу найти какой-либо способ рендеринга во внеэкранный буфер, используя GLSurfaceView, и затем никогда не отображать буфер.Даже если я использую GLSurfaceView.EGLContextFactory, я не могу придумать, как это сделать без функций / констант EGL 1.2, не включенных в EGL-пакет Android (например, EGL_CONTEXT_CLIENT_VERSION).

Итак, первый очевидный вопрос: существует ли1) использовать EGL с ES 2.0, несмотря на отсутствие EGL_CONTEXT_CLIENT_VERSION и eglBindAPI ()?2) есть ли новый API для установки контекста рендеринга, используемый перед вызовом обратного вызова GLSurfaceView surfaceCreated (EGLConfig)?

1 Ответ

11 голосов
/ 11 ноября 2011

Если вы можете жить по умолчанию с EGLContextFactory и EGLConfigChooser, вы можете использовать setEGLContextClientVersion () метод GLSurfaceView.

В противном случае, если вы пишете свой собственный 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 ,соответственно.

...