Совместимость с OpenGL, соглашения об именах и ARB против EXT

14

Я думал, что сформировал общее понимание того, как работают соглашения об именах OpenGL и расширения, пока не наткнулся на случай, который смутил меня.


Вот мое понимание до сих пор:

Нет суффикса - например glGenBuffers(). Эта функция является частью основного профиля. На вики-странице сказано, что это было добавлено в основной профиль, начиная с версии 1.5.

ARB - например glGenBuffersARB(). Эта функция является частью стандартизированного GL_ARB_vertex_buffer_objectрасширения. Спецификации данного расширения четко заявляет GenBuffersARB()в разделе «Новые процедуры и функции». Раздел «Зависимости» говорит мне, что я могу получить к нему доступ из контекста 1.4+, если оборудование поддерживает расширение.

EXT - это расширения и функции, специфичные для конкретного поставщика, которые могут поддерживать только некоторые поставщики. Буферный объект Vertex, похоже, не имеет расширения EXT в реестре.


Вот где мое понимание нарушается:

glGenFramebuffersКак показывает вики , ядро ​​было добавлено в 3.0.

Теперь я хочу получить доступ к возможностям кадрового буфера в более низкой версии профиля ядра, чем 3.0. Поэтому я хочу использовать его как расширение. Реестр спецификаций говорит мне, что есть два доступных расширения - ARB и EXT .

Вопрос 1 - Если расширение ARB существует, почему существует расширение EXT? Разве вы не всегда выбираете стандартизированный вариант по сравнению с конкретным поставщиком?

Взгляд на спецификацию ARB в разделе «Новые процедуры и функции» говорит мне, что расширение определяет GenRenderbuffers()функцию. На этот раз нет суффикса ARB. У GLEW вообще нет прототипа функции glGenRenderbuffersARB(). Weird.

Спецификация EXT, однако, имеет GenRenderbuffersEXT()функцию в разделе новых функций, и GLEW также имеет glGenRenderbuffersEXT().

Вопрос 2 - Почему нет суффикса ARB, если есть суффикс EXT? Как это работает для ARB, если имена функций ARB и основной функции совпадают?

Вопрос 3 - Я в конечном счете хочу функции Framebuffer из профиля 1.4. Какое расширение и какой набор функций я должен использовать, чтобы получить максимальное покрытие совместимости оборудования?

ApoorvaJ
источник

Ответы:

9

Вопрос 1 - Обычно версия EXT на первом месте в виде сотрудничества между двумя или более поставщиками. Расширения ARB требуют большего обсуждения среди членов Khronos с правом голоса и могут иметь изменения по сравнению с версией EXT до получения одобрения. Смотрите расширение GL_ARB_direct_state_access, которое имеет много изменений по сравнению с GL_EXT_direct_state_access.

Вопрос 2 - В разделе «Проблемы» расширения GL_ARB_framebuffer_object указывается, почему функции не имеют суффиксов ARB:

(8) Почему новые токены и точки входа в этом расширении не имеют суффиксов, как другие расширения ARB?

   RESOLVED: Unlike most ARB extensions, this is a strict subset of
   functionality already approved in OpenGL 3.0. This extension
   exists only to support that functionality on older hardware that
   cannot implement a full OpenGL 3.0 driver. Since there are no
   possible behavior changes between the ARB extension and core
   features, source code compatibility is improved by not using
   suffixes on the extension.

Вопрос 3 - Если вы хотите использовать объекты кадрового буфера в контексте, где версия GL меньше 3.0, вам нужно взглянуть на строку расширения:

  1. Если GL_ARB_framebuffer_object поддерживается, используйте функции не ARB.
  2. Если поддерживается только GL_EXT_framebuffer_object, используйте функции EXT.
  3. Если ни одно из расширений не поддерживается, вам необходимо вернуться к экранному рендерингу на уровне ОС, например, pbuffers.
Джейсон Аллен
источник