Принятие 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 в Вашем приложении:
Создайте 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 при необходимости.
Включайте или импортируйте заголовки OpenGL ES 3.0 API в исходных файлах, использующих OpenGL ES 3.0 API:
#import <OpenGLES/ES3/gl.h>
#import <OpenGLES/ES3/glext.h>
Код обновления, использующий расширения OpenGL ES 2.0, включенные в или измененный спецификациями OpenGL ES 3.0, как описано в Обновлении Дополнительного Кода ниже.
(Дополнительный). Можно использовать те же программы программы построения теней и в OpenGL ES 2.0 и в 3.0. Однако, если Вы принимаете решение портировать программы построения теней на GLSL ES 3.0 для использования новых функций, посмотрите протесты в Принятии OpenGL ES, Заштриховывающий Версию языка 3.0.
Протестируйте свое приложение на 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, и через
расширение в OpenGL ES 1.1 и 2.0. Эти функции предлагают дополнительную выгоду: использование a EXT_texture_storage
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:
attribute
иvarying
спецификаторы заменяются в GLSL ES 3.0 ключевыми словамиin
иout
. В вершинном шейдере используйтеin
спецификатор для атрибутов вершины иout
спецификатор для переменных выводов. В программе построения теней фрагмента используйтеin
спецификатор для переменных вводов.GLSL ES 3.0 удаляет
gl_FragData
иgl_FragColor
встроенные выходные переменные фрагмента. Вместо этого Вы объявляете свои собственные выходные переменные фрагмента сout
спецификатор.Функции выборки текстуры были переименованы в GLSL ES 3.0 — все типы сэмплера используют то же имя функции текстуры. Например, можно использовать новое
texture
функция с любым asampler2D
илиsamplerCube
параметр (заменяющий texture2D и textureCube функционирует от GLSL ES 1.0).Функции добавили к GLSL ES 1.0
,EXT_shader_texture_lod
, иEXT_shadow_samplers
расширения являются частью базового GLSL спецификация ES. При портировании программ построения теней, использующих эти функции к GLSL ES 3.0, используйте соответствующие функции GLSL ES 3.0.OES_standard_derivatives
расширение работает по-другому. GLSL ES 3.0 удаляетEXT_shader_framebuffer_fetch
gl_FragData
иgl_FragColor
встроенные выходные переменные фрагмента в пользу требования, чтобы выводы фрагмента были объявлены в программе построения теней. Соответственно,gl_LastFragData
встроенная переменная не присутствует в программах построения теней GLSL ES 3.0 фрагмента. Вместо этого любые выходные переменные фрагмента Вы объявляете сinout
когда программа построения теней работает, спецификатор содержит предыдущие данные фрагмента. Для получения дополнительной информации посмотрите Данные Кадрового буфера Выборки для Программируемого Смешивания.
Для полного обзора GLSL ES 3.0 посмотрите OpenGL Язык Штриховки ES 3.0 Спецификации, доступные от OpenGL ES Реестр API.