Как установить версию OpenGL в EGL или GLSurfaceView?

#android #opengl-es #opengl-es-2.0 #egl

#Android #opengl-es #opengl-es-2.0 #egl

Вопрос:

Для проекта 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:

Если вы можете использовать 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 соответственно.