Что такое расширения OpenGL, и каковы преимущества / недостатки их использования? - PullRequest
13 голосов
/ 20 августа 2008

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

Ответы [ 3 ]

20 голосов
/ 20 августа 2008

Стандарт 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, чтобы упростить процесс.

6 голосов
/ 20 августа 2008

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

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

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

5 голосов
/ 23 августа 2008

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

  1. Расширение поставщика - только один поставщик предоставляет определенный тип функциональности.
    • Пример: NV_vertex_program
  2. Расширение Multivendor - несколько поставщиков собрались вместе и согласовали функциональность.
    • Пример: EXT_vertex_program
  3. ARB расширение - OpenGL Architecture Review Board благословил расширение. У вас есть разумное ожидание, что этот тип расширения будет существовать некоторое время.
    • Пример: 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 spec (шейдеры)

Более продвинутый:

  • ARB/EXT_framebuffer_object (рендеринг вне экрана)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...