Почему все вызовы функций OpenGL имеют префикс «q» в исходном коде Doom 3?

42

Почему каждый вызов OpenGL имеет префикс "q" в исходном коде Doom 3? Являются ли они пользовательскими функциями или другой библиотекой, и если да, то зачем использовать это поверх OpenGL? Любой поиск в Google связан с модулем Qt OpenGL, который, я полагаю, не имеет к этому никакого отношения.

Бен
источник

Ответы:

62

Для справки - qgl.h DOOM3 в .

OpenGL - это странный маленький API. Вам часто приходится работать с указателями на функции либо потому, что в стандартной реализации отсутствуют новые функции, либо потому, что вы хотите работать с расширениями. Например, если вы хотите позвонить glCreateShader, но операционная система, в которой вы разрабатываете, не поставляется с достаточно новыми заголовками GL, вы должны использовать ее glGetProcAddress("CreateShader")для загрузки функции из драйвера пользователя. И тогда вам нужно где-то хранить указатель на эту функцию.

Даже если в вашей среде разработки есть определенная функция, машины пользователей могут этого не делать. И тогда определенная функция может иметь 2-3 формы (расширение поставщика, расширение ARB, базовая функция), поэтому вам, возможно, придется искать функцию под несколькими разными именами.

Многие библиотеки GL "загрузчика" (например, GLEW ) пытаются придерживаться соглашений GL. Они создают «фальшивые» функции с обычным glпрефиксом и пытаются волшебным образом заставить ваш код просто работать на любой ОС или драйвере, который поддерживает необходимые функции. По сути, вместо того , чтобы glFooбыть реальной функцией, это просто глобальный указатель функции и библиотеки загрузчика (во время инициализации или первого использования) поиск FooEXT, FooARBи Fooдо тех пор , пока не найдет реализацию , а затем присваивает , что глобальный указатель. Клиентский код выглядит так, как будто он просто вызывает обычную функцию, но он волшебным образом решается во время выполнения во время инициализации таким образом, чтобы иметь дело со всеми различными платформами и драйверами.

Другие библиотеки помещают функции в пространства имен или иным образом отличаются от нормы GL. Идентификатор написал свой собственный загрузчик, либо потому , что они не похожи на тех , которые существовали или - скорее - Quake просто предшествуют любую другую библиотеку, идентификатор мог бы использоваться ( qв qglвероятных стендах для Quake, который был первой ID Tech игрой использование GL).

Спецификация GL написана с такой возможностью. Спецификация написана без префиксов; Это реализация OpenGL, которая решает, какой префикс использовать ( glконечно, самый распространенный). Библиотеки загрузчиков, которые помещают функции в пространства имен или используют свои собственные префиксы, полностью допустимы.

Doom 3, основанный на движке Quake, является полностью типичным и оправданным при использовании библиотеки загрузчика для решения странностей GL на нескольких платформах и при выборе использования qglпрефикса.

Шон Миддледич
источник
+1, и спасибо за то, что я написал idплохо (вы совершенно правы в отношении заглавных букв), хотя en.wikipedia.org/wiki/Id_Tech все еще написан пробелом, во всех источниках, которые я смог найти.
vaxquis