Warum wird allen OpenGL-Funktionsaufrufen im Doom 3-Quellcode das Präfix "q" vorangestellt?


42

Warum wird jedem OpenGL-Aufruf im Doom 3-Quellcode ein "q" vorangestellt? Handelt es sich um benutzerdefinierte Funktionen oder eine andere Bibliothek, und wenn ja, warum sollten Sie diese über OpenGL verwenden? Jede Google-Suche wartet mit dem Qt OpenGL-Modul auf, von dem ich annehme, dass es nichts damit zu tun hat.

Antworten:


62

Als Referenz - Doom3 ist qgl.h .

OpenGL ist eine seltsame kleine API. Sie müssen häufig mit Funktionszeigern arbeiten, weil in der Standardimplementierung neue Funktionen fehlen oder Sie mit Erweiterungen arbeiten möchten. Wenn Sie beispielsweise anrufen möchten glCreateShader, das Betriebssystem, auf dem Sie entwickeln, jedoch nicht über genügend neue GL-Header verfügt, müssen Sie diese verwenden glGetProcAddress("CreateShader"), um die Funktion aus dem Treiber des Benutzers zu laden. Und dann müssen Sie diesen Funktionszeiger irgendwo speichern.

Auch wenn Ihre Entwicklungsumgebung eine bestimmte Funktion hat, ist dies auf den Computern der Benutzer möglicherweise nicht der Fall. Und dann kann eine bestimmte Funktion in 2-3 Formen vorliegen (Herstellererweiterung, ARB-Erweiterung, Kernfunktion), und Sie müssen möglicherweise nach einer Funktion unter mehreren verschiedenen Namen suchen.

Viele GL "Loader" -Bibliotheken (wie GLEW ) versuchen, sich an die GL-Konventionen zu halten. Sie erstellen "gefälschte" Funktionen mit dem üblichen glPräfix und versuchen auf magische Weise, dass Ihr Code auf jedem Betriebssystem oder Treiber funktioniert, der die erforderlichen Funktionen unterstützt. Im Wesentlichen statt glFooeine tatsächliche Funktion ist, es ist nur ein globaler Funktionszeiger und die Ladebibliothek (bei der Initialisierung oder die ersten Gebrauch) sucht FooEXT, FooARBund Foobis es eine Implementierung findet und dann zuordnet , dass auf den globalen Zeiger. Der Client-Code sieht so aus, als würde er nur eine reguläre Funktion aufrufen, wird jedoch zur Laufzeit während der Initialisierung auf magische Weise so aufgelöst, dass die verschiedenen Plattformen und Treiber berücksichtigt werden.

Andere Bibliotheken setzen die Funktionen in Namespaces oder weichen auf andere Weise ein wenig von der GL-Norm ab. id schrieb ihre eigenen Loader, sei es, weil sie nicht wie die, die oder existierte - wahrscheinlicher - Quake früher nur eine andere Bibliothek , dass id verwendet haben könnte (die qin qglwahrscheinlich steht für Quake, die die erste id Tech Spiel nützte GL).

Die GL-Spezifikation ist mit dieser Möglichkeit geschrieben. Die Spezifikation wird ohne Präfixe geschrieben. Es ist die Implementierung von OpenGL, die über das zu verwendende Präfix entscheidet ( glnatürlich das übliche). Loader-Bibliotheken, die die Funktionen in Namespaces ablegen oder ihre eigenen Präfixe verwenden, sind vollständig gültig.

Doom 3, das auf der Quake-Engine basiert, ist völlig typisch und gerechtfertigt, wenn eine Loader-Bibliothek verwendet wird, um die Besonderheiten von GL auf mehreren Plattformen zu bewältigen, und wenn das qglPräfix verwendet wird.


+1 und ein großes Lob für das Aufspüren, das ich idschlecht geschrieben habe (Sie haben völlig Recht mit der Großschreibung), obwohl en.wikipedia.org/wiki/Id_Tech in allen Quellen, die ich finden konnte, immer noch mit Leerzeichen geschrieben ist.
Vaxquis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.