2013-11-10 4 views
2

По какой-то причине я возился с ручной загрузкой OpenGL.Какова точка запроса расширений OpenGL, прежде чем пытаться их загрузить?

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

Мой вопрос: Какую цель выполняет промежуточная процедура запроса? Возможно ли, чтобы функция была неподдерживаемой, но для *GetProcAddress для возврата указателя не NULL?

ответ

4

Строка расширения - это правильный способ реализации GL, чтобы рассказать вам о том, какие расширения он поддерживает. Указание указателей на функции, которые не подразумеваются присутствием строки расширения, - это неопределенное поведение в отношении GL.

На практике ситуация может возникнуть. Для разных бэкендов часто используется одна и та же клиентская DL-клиентская DL-карта, как в случае с mesa. Тот факт, что эта функция отсутствует, не означает, что она реализована для всех внутренних драйверов.

+0

Итак, давайте посмотрим, правильно ли я понимаю: указатели на функции специфичны для клиентской библиотеки OpenGL. Однако фактическое поведение поддерживается контекстом GL, который является отдельным объектом из клиентской библиотеки. Цель строки расширения - объявить, какая из точек входа в клиентской библиотеке действительна для контекста. – Michael

+2

@ Майкл: все эти внутренние детали очень специфичны для реализации. Спецификация просто гарантирует, что любая соответствующая реализация должна реализовать все основные функции Версии, которые она запрашивает supprt плюс все расширения, которые она перечисляет. – derhass

1

Какова цель промежуточного этапа запроса?

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

Возможно ли, чтобы функция была неподдерживаемой, но для * GetProcAddress для возврата указателя не-NULL?

Да, это возможно.

Смежные вопросы