GLSurfaceView с контекстом OpenGL ES 3.1

Я работаю на Android с OpenGL. Я знаю, как использовать GLSurfaceView и его пользовательские производные классы для создания контекста OpenGL ES 2.0 с методом GLSurfaceView:

setEGLContextClientVersion(2); 

и контекст OpenGL ES 3.0:

setEGLContextClientVersion(3); 

Как я могу создать контекст для OpenGL ES 3.1?

1 ответ

Решение

Вы не можете явно запросить 3.1 при создании контекста. Насколько я понимаю, 3.1 не обрабатывается как тип контекста отдельно от 3.0. По сути, контекст, поддерживающий 3.1, - это просто контекст 3.0, который также поддерживает дополнительные функции 3.1.

Это означает, что вы все еще можете использовать:

setEGLContextClientVersion(3);

Если вы хотите проверить / проверить, какая версия поддерживается контекстом, вы можете запросить ее, как только у вас будет запущен контекст:

int[] vers = new int[2];
GLES30.glGetIntegerv(GLES30.GL_MAJOR_VERSION, vers, 0);
GLES30.glGetIntegerv(GLES30.GL_MINOR_VERSION, vers, 1);
if (vers[0] > 3 || (vers[0] == 3 && vers[1] >= 1)) {
    // We have at least ES 3.1.
}

Фон

Последняя версия EGL, которая является 1.5 [*], на самом деле имеет атрибуты создания контекста, которые позволяют указывать как основную, так и вспомогательную версию (атрибуты EGL_CONTEXT_MAJOR_VERSION а также EGL_CONTEXT_MINOR_VERSION). Версии до 1.4 включительно имеют только EGL_CONTEXT_CLIENT_VERSIONпоэтому у них нет механизма для указания вспомогательной версии при создании контекста.

Последняя выпущенная версия Android, а именно 5.1.1 [*], все еще поддерживает только EGL 1.4. Так что это не только вопрос GLSurfaceView не предоставляя интерфейс. Нижние собственные уровни также не поддерживают указание вспомогательной версии. Поэтому добавление поддержки 3.1 в контексты 3.0 - это действительно единственный вариант.

[*] В то время этот ответ был написан.

Другие вопросы по тегам