Что такое расширения OpenGL и каковы преимущества / недостатки их использования?

Что касается этого вопроса об использовании расширений OpenGL , какова цель этих функций расширения? Зачем мне их использовать? Кроме того, есть ли какие-либо компромиссы или подводные камни, связанные с их использованием?

Ответов (3)

Решение

Стандарт 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.

Расширения, как правило, позволяют поставщикам видеокарт добавлять новые функции в OpenGL, не дожидаясь следующей версии спецификации OpenGL. Существуют разные типы расширений:

  1. Расширение поставщика - только один поставщик предоставляет определенный тип функциональности.
    • Пример: NV_vertex_program
  2. Расширение для нескольких поставщиков - несколько поставщиков объединились и согласовали функциональность.
    • Пример: EXT_vertex_program
  3. Расширение ARB - Совет по обзору архитектуры OpenGL одобрил расширение. У вас есть разумные основания полагать, что этот тип расширения будет существовать какое-то время.
    • Пример: ARB_vertex_program

Расширениям не обязательно выполнять все эти шаги. Иногда расширение всегда реализуется только одним поставщиком, прежде чем аппаратное обеспечение изменится и от расширения не откажутся. В других случаях расширение может дойти до статуса ARB, прежде чем все решат, что есть лучший способ. (Этот ARB_vertex_program подход, например, был отложен в пользу подхода с использованием высокоуровневого языка шейдеров, 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 плавно смешивает старое с новым, поэтому это может быть очень важно, если вы хотите оставаться на быстром пути и избегать устаревших, а иногда и реализованных программными путями.)

Что бы вы ни делали, убедитесь, что у вас есть соответствующие проверки расширений, которые вы решите использовать, и резервные варианты, где это необходимо. Даже если ваша карта может иметь данное расширение, нет гарантии, что расширение будет присутствовать на карте другого поставщика или даже в другой операционной системе с той же картой.

Расширения OpenGL - это новые функции, добавленные в спецификацию OpenGL , они добавлены органом стандартов OpenGL и различными поставщиками видеокарт. Они представляются программисту как вызовы новых функций или переменные. Каждая новая версия спецификации OpenGL поставляется с новыми функциями и (обычно) включает все предыдущие функции и расширения.

Настоящая проблема с расширениями OpenGL существует только в Windows. Microsoft не поддерживает никаких расширений, выпущенных после OpenGL v1.1 . Производители видеокарт преодолевают это, поставляя свою собственную версию этой функциональности через файлы заголовков и библиотеки. Однако использование этого может быть немного болезненным, как показывает вопрос, с которым вы связались. Но эта проблема в основном исчезла с популярностью GLEW , который заботится о том, чтобы упаковать все это в простой в использовании пакет.

Если вы используете самое последнее расширение OpenGL, имейте в виду, что оно может не поддерживаться на старом графическом оборудовании. Кроме этого, у использования этих расширений нет других недостатков. Большинство расширений, которые становятся стандартными, чертовски полезны, и очень мало логики, чтобы их не использовать.