Что такое расширения OpenGL, и каковы преимущества/компромиссы их использования?
В связи с этим вопросом на Использование расширений OpenGL, какова цель этих функций расширения? Почему я хочу использовать их? Кроме того, существуют ли какие-либо компромиссы или gotchas, связанные с их использованием?
Ответы
Ответ 1
Стандарт OpenGL позволяет отдельным поставщикам предоставлять дополнительные функции через расширения при создании новой технологии. Расширения могут вводить новые функции и новые константы и могут ослабить или удалить ограничения на существующие функции OpenGL.
У каждого производителя есть алфавитная аббревиатура, которая используется для обозначения их новых функций и констант. Например, аббревиатура NVIDIA (NV) используется для определения их проприетарной функции glCombinerParameterfvNV() и их константы GL_NORMAL_MAP_NV.
Может случиться так, что более одного поставщика согласны реализовать ту же расширенную функциональность. В этом случае используется аббревиатура EXT. Возможно, также, что Совет по обзору архитектуры "благословляет" расширение. Затем он становится известным как стандартное расширение, и используется аббревиатура ARB. Первым расширением ARB была GL_ARB_multitexture, введенная в версии 1.2.1. Следуя официальному пути продвижения по службе, мультитекстурирование больше не является опциональным расширением ARB, но является частью API ядра OpenGL с версии 1.3.
Прежде чем использовать расширение, программа должна сначала определить его доступность, а затем получить указатели на любые новые функции, которые определяет расширение. Механизм для этого является специфичным для платформы, и для упрощения процесса существуют библиотеки, такие как GLEW и GLEE.
Ответ 2
Расширения OpenGL - это новые функции, добавленные в спецификацию OpenGL, они добавляются стандартным телом OpenGL и различными производителями видеокарты. Они подвергаются программисту как новые вызовы функций или переменные. Каждая новая версия спецификации OpenGL поставляется с более новыми функциями и (обычно) включает все предыдущие функциональные возможности и расширения.
Реальная проблема с расширениями OpenGL существует только в Windows. Microsoft не поддерживает никаких расширений, выпущенных после OpenGL v1.1. Производители видеокарты преодолевают это, отправляя свою собственную версию этой функции через файлы заголовков и библиотеки. Однако использование этого может быть немного болезненным, поскольку вопрос, который вы связали с шоу. Но эта проблема в основном ушла с популярностью GLEW, которая заботится об упаковке всего этого в простой в использовании пакет.
Если вы используете последнее расширение OpenGL, имейте в виду, что он может не поддерживаться на более раннем графическом оборудовании. Помимо этого, нет другого недостатка в использовании этих расширений. Большинство расширений, которые становятся стандартными, довольно полезны и очень мало логики, чтобы их не использовать.
Ответ 3
Расширения - это, в общем, способ для поставщиков видеокарты добавлять новые функции в OpenGL, не дожидаясь следующего пересмотра спецификации OpenGL. Существуют разные типы расширений:
- Расширение поставщика - только один поставщик предоставляет определенный тип функциональности.
- Пример:
NV_vertex_program
- Расширение Multivendor - несколько продавцов собрались вместе и договорились о функциональности.
- Пример:
EXT_vertex_program
- Расширение ARB - панель обзора архитектуры OpenGL благословила расширение. У вас есть разумное ожидание, что этот тип расширения будет существовать некоторое время.
- Пример:
ARB_vertex_program
Расширения не должны проходить все эти шаги. Иногда расширение только когда-либо реализуется одним поставщиком, прежде чем конструкции оборудования идут по-другому, и расширение заброшено. В других случаях расширение может сделать его до статуса ARB, прежде чем все решают там лучший способ. (Например, подход ARB_vertex_program
был отложен в пользу подхода верхнего уровня tading на уровне верхнего уровня ARB_vertex_shader
, когда пришло время качать шейдеры в основную спецификацию OpenGL.) Даже расширения ARB не длится вечно; Я бы не писал что-то сегодня, требующее, например, ARB_matrix_palette
.
Все, что было сказано, очень полезно постоянно обновлять расширения, в частности последние расширения ARB и EXT. Раньше было правдой, что некоторые "быстрые пути" через аппаратное обеспечение были доступны только через расширения. Аналогичным образом, если вы хотите знать, что все функциональные возможности аппаратного обеспечения могут сделать, нет лучшего места для поиска, чем в расширении поставщика.
Если вы только начинаете работать в OpenGL, я рекомендую изучить:
-
ARB_vertex_buffer_object
(вершины)
-
ARB_vertex_shader
/ARB_fragment_shader
/ARB_shader_objects
/спецификация GLSL (шейдеры)
Дополнительные возможности:
-
ARB/EXT_framebuffer_object
(отображение вне экрана)
Это все функциональность, которая была перевернута в ядро, но может быть хорошо видеть ее изолированно, чтобы вы могли лучше понять, где лежат ее границы. (Ядро OpenGL spec плавно смешивает старое с новым, поэтому это может быть очень важно, если вы хотите оставаться на быстром пути и избегать старого, а иногда и внедряться в программные пути.)
Независимо от того, что вы делаете, убедитесь, что у вас есть соответствующие проверки для расширений, которые вы решили использовать, и резервные копии там, где это необходимо. Даже если ваша карта может иметь данное расширение, нет гарантии, что расширение будет присутствовать на другой карточке поставщика или даже в другой операционной системе с той же картой.