Принятие OpenGL ES 3.0

 OpenGL ES 3.0 является надмножеством спецификации OpenGL ES 2.0, так принятие его в Вашем приложении просто. Можно продолжать использовать код OpenGL ES 2.0, в то время как использование в своих интересах более высокого ресурса ограничивает доступный контекстам OpenGL ES 3.0 на совместимых устройствах, и добавьте поддержку OpenGL ES специфичные для 3.0 функции, где это целесообразно для проекта приложения.

Контрольный список для принятия OpenGL ES 3.0

Использовать OpenGL ES 3.0 в Вашем приложении:

  1. Создайте OpenGL контекст ES (как описано в Конфигурировании OpenGL Контексты ES) и укажите версию API, постоянную для OpenGL ES 3.0:

    EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];

    Если Вы планируете сделать свое приложение доступным для устройств, не поддерживающих OpenGL ES 3.0, выполняющих процедуру в Перечислении 2-1 для отступания к OpenGL ES 2.0 при необходимости.

  2. Включайте или импортируйте заголовки OpenGL ES 3.0 API в исходных файлах, использующих OpenGL ES 3.0 API:

    #import <OpenGLES/ES3/gl.h>
    #import <OpenGLES/ES3/glext.h>
  3. Код обновления, использующий расширения OpenGL ES 2.0, включенные в или измененный спецификациями OpenGL ES 3.0, как описано в Обновлении Дополнительного Кода ниже.

  4. (Дополнительный). Можно использовать те же программы программы построения теней и в OpenGL ES 2.0 и в 3.0. Однако, если Вы принимаете решение портировать программы построения теней на GLSL ES 3.0 для использования новых функций, посмотрите протесты в Принятии OpenGL ES, Заштриховывающий Версию языка 3.0.

  5. Протестируйте свое приложение на OpenGL 3.0 совместимых устройства ES, чтобы проверить, что это ведет себя правильно.

Обновление дополнительного кода

 OpenGL ES 3.0 является надмножеством спецификации OpenGL ES 2.0, таким образом, приложения, использующие только базовые функции OpenGL ES 2.0, могут использоваться в контексте OpenGL ES 3.0 без изменений. Однако некоторые приложения также используют расширения OpenGL ES 2.0. Функции, предоставленные этими расширениями, также доступны в OpenGL ES 3.0, но использование их в контексте OpenGL ES 3.0 может потребовать, по крайней мере, незначительных изменений кода.

Удалите дополнительные суффиксы

 Упомянутые ниже расширения OpenGL ES 2.0 определяют APIs, включенный в базовую спецификацию OpenGL ES 3.0. Для использования этих функций в контексте OpenGL ES 3.0 просто удалите дополнительные суффиксы из функции и постоянных имен. Например, имя glMapBufferRangeEXT функция становится glMapBufferRange, и DEPTH_COMPONENT24_OES постоянный (используемый в internalformat параметр glRenderbufferStorage функция), становится DEPTH_COMPONENT24.

Измените использование расширения APIs

Некоторые функции, определенные расширениями OpenGL ES 2.0, находятся в базовой спецификации OpenGL ES 3.0, но с изменениями в их определениях API. Для использования этих функций в контексте OpenGL ES 3.0 делайте изменения описанными ниже.

Работа с форматами текстур

OES_depth_texture, OES_packed_depth_stencil, OES_texture_float, OES_texture_half_float, EXT_texture_rg, и EXT_sRGB расширения определяют константы для использования в internalformat и type параметры glTexImage семья функций. Функциональность, определенная этими расширениями, доступна в ядре OpenGL ES 3.0 API, но с некоторыми протестами:

  • glTexImage функции не поддерживают internalformat константы без явных размеров. Использование явно измерило константы вместо этого:

    // Replace this OpenGL ES 2.0 code:
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_HALF_FLOAT_OES, data);
    // With this OpenGL ES 3.0 code:
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_HALF_FLOAT, data);
  •  OpenGL ES 3.0 не определяет плавание или полупускает в ход форматы для LUMINANCE или LUMINANCE_ALPHA данные. Используйте соответствие RED или RG форматы вместо этого.

  • Вектор, возвращенный сэмплерами текстуры глубины и глубины/шаблона больше, не повторяет значение глубины в своих первых трех компонентах в OpenGL ES 3.0. Используйте только первое (.r) компонент в программе построения теней кодирует, это выбирает такие текстуры.

  • Формат sRGB только допустим, когда используется для internalformat параметр в OpenGL ES 3.0. Используйте GL_RGB или GL_RGBA для параметра формата для текстур sRGB.

Также замените вызовы к glTexImage функции с вызовами к соответствию glTexStorage функции. Функции хранения текстуры доступны в как базовый API в OpenGL ES 3.0, и через EXT_texture_storage расширение в OpenGL ES 1.1 и 2.0. Эти функции предлагают дополнительную выгоду: использование a glTexStorage функция полностью указывает неизменный объект текстуры в одном вызове; это сразу выполняет все проверки непротиворечивости и выделения памяти, гарантируя, что объект текстуры никогда не может быть неполным вследствие недостающих уровней множественного отображения или противоречивых поверхностей карты куба.

Отображение буферных объектов в клиентскую память

OES_mapbuffer расширение определяет glMapBuffer функция для отображения всего хранения данных буферного объекта в клиентскую память. OpenGL ES 3.0 вместо этого определяет glMapBufferRange функция, обеспечивающая дополнительную функциональность: это позволяет отображать подмножество хранения данных буферного объекта и включает опции для асинхронного отображения. glMapBufferRange функция также доступна в OpenGL ES 1.1 и 2,0 контекстах посредством расширения EXT_map_buffer_range.

Отбрасывание кадровых буферов

glInvalidateFramebuffer функция в OpenGL ES 3.0 заменяет glDiscardFramebufferEXT функция, предоставленная EXT_discard_framebuffer расширение. Параметры и поведение обеих функций идентичны.

Используя мультивыборку

 OpenGL ES 3.0 включает все функции APPLE_framebuffer_multisample расширение, за исключением glResolveMultisampleFramebufferAPPLE функция. Вместо этого glBlitFramebuffer функция обеспечивает это и другие другие опции копирования кадрового буфера. Для разрешения буфера мультивыборки установите чтение и нарисуйте кадровые буферы (как в Использовании Мультивыборки для Улучшения Качества изображения) и затем используйте glBlitFramebuffer скопировать весь кадровый буфер чтения в весь кадровый буфер получения:

glBlitFramebuffer(0,0,w,h, 0,0,w,h, GL_COLOR_BUFFER_BIT, GL_NEAREST);

Продолжайте Используя большинство других расширений OpenGL ES 3.0

Несколько главных особенностей аппаратного обеспечения машинной графики устройства на iOS не являются частью базовой спецификации OpenGL ES 3.0, но остаются доступными как расширения OpenGL ES 3.0. Для использования этих функций продолжайте проверять на дополнительную поддержку с помощью процедур, описанных в Проверке OpenGL Возможности ES. (См. также Ссылку Совместимости устройства на iOS для определения, какие функции доступны на который устройства.)

Большая часть кода, записанного для расширений OpenGL ES 2.0, также присутствующих как расширения OpenGL ES 3.0, будет работать в контексте OpenGL ES 3.0 без изменений. Однако дополнительные протесты применяются к расширениям, изменяющим вершину и язык программы построения теней фрагмента — для подробных данных, видящим следующий раздел.

Принятие OpenGL ES, Заштриховывающий Версию языка 3.0

 OpenGL ES 3.0 включает новую версию OpenGL Язык Штриховки ES (GLSL ES). Контексты OpenGL ES 3.0 могут использовать программы программы построения теней, записанные или в версии 1.0 или в версии 3.0 ES GLSL, но программах построения теней версии 3.0 (отмеченный с a #version 300 es директива в исходном коде шейдера), требуются, чтобы получать доступ к определенным новым функциям, таким как универсальные блоки, 32-разрядные целые числа и дополнительные целочисленные операции.

Некоторые соглашения языка изменились между версией 1.0 и 3.0 ES GLSL. Эти изменения делают исходный код шейдера более переносимым между OpenGL ES 3.0 и настольным OpenGL ES 3.3 или позже, но они также требуют незначительных изменений к существующему исходному коду шейдера при портировании на GLSL ES 3.0:

Для полного обзора GLSL ES 3.0 посмотрите OpenGL Язык Штриховки ES 3.0 Спецификации, доступные от OpenGL ES Реестр API.