Сумісність OpenGL, іменування конвенцій та ARB vs EXT


14

Я подумав, що сформував загальне розуміння того, як працюють угоди та розширення іменування OpenGL, поки я не натрапив на справу, яка мене бентежила.


Ось моє розуміння поки що:

Немає суфікса - напр glGenBuffers(). Ця функція є частиною основного профілю. Сторінка wiki повідомляє мені, що це було додано до основного профілю, починаючи з версії 1.5.

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

EXT - Це розширення, що стосуються конкретного постачальника, та функції, які можуть підтримувати лише деякі постачальники. Об'єкт буфера вершин, схоже, не має розширення EXT у реєстрі.


Ось де моє розуміння порушується:

glGenFramebuffers, як показує вікі , було додано до ядра в 3.0.

Тепер я хочу отримати доступ до функцій буфера кадру у нижчій версії основного профілю, ніж 3.0. Тому я хочу використовувати це як розширення. Реєстр специфікацій підказує мені, що є два доступних розширення - ARB та EXT .

Питання 1 - Якщо розширення ARB існує, чому існує розширення EXT? Чи не завжди ви вибирали б стандартизований, а не конкретний для постачальника?

Погляд на специфікацію ARB у розділі "Нові процедури та функції" говорить мені, що розширення визначає GenRenderbuffers()функцію. Цього разу немає суфікса ARB. GLEW взагалі не має прототипу функції glGenRenderbuffersARB(). Дивно.

Однак у специфікації EXT є GenRenderbuffersEXT()функція в новому розділі функцій, а також GLEW glGenRenderbuffersEXT().

Запитання 2 - Чому немає суфікса ARB, якщо є суфікс EXT? Як це працює для ARB, враховуючи, що назви функції ARB та основна функція однакові?

Питання 3 - Я в кінцевому рахунку хочу, щоб функції Framebuffer були з профілю 1.4. Яке розширення та який набір функцій потрібно використовувати, щоб отримати максимальне покриття сумісності обладнання?

Відповіді:


9

Питання 1 - Зазвичай EXT-версія виходить спочатку як співпраця двох або більше постачальників. Розширення ARB вимагають більшого обговорення серед членів, що голосують у Хроносі, і можуть змінити версію 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 - Якщо ви хочете використовувати об'єкти framebuffer у контексті, де версія GL менше 3,0, вам потрібно переглянути рядок розширення:

  1. Якщо GL_ARB_framebuffer_object підтримується, використовуйте не ARB функції.
  2. Якщо підтримується лише GL_EXT_framebuffer_object, використовуйте функції EXT.
  3. Якщо жодне розширення не підтримується, вам потрібно повернутися до екранного відображення на рівні ОС, як pbuffers.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.