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 - это действительно единственный вариант.
[*] В то время этот ответ был написан.