Dlaczego wszystkie wywołania funkcji OpenGL są poprzedzone „q” w kodzie źródłowym Doom 3?

42

Dlaczego każde wywołanie OpenGL jest poprzedzone literą „q” w kodzie źródłowym Doom 3? Czy są to funkcje niestandardowe czy inna biblioteka, a jeśli tak, to po co korzystać z nich w OpenGL? Każda wyszukiwarka Google zawiera moduł Qt OpenGL, który, jak zakładam, nie ma z tym nic wspólnego.

Ben
źródło

Odpowiedzi:

62

Dla odniesienia - qgl.h Doom3 .

OpenGL to dziwny mały API. Często musisz pracować ze wskaźnikami funkcji, ponieważ w standardowej implementacji brakuje nowej funkcjonalności lub dlatego, że chcesz pracować z rozszerzeniami. Na przykład, jeśli chcesz zadzwonić glCreateShader, ale system operacyjny, na którym pracujesz, nie jest wyposażony w wystarczającą liczbę nowych nagłówków GL, musisz go użyć glGetProcAddress("CreateShader"), aby załadować funkcję ze sterownika użytkownika. A potem musisz gdzieś zapisać ten wskaźnik funkcji.

Nawet jeśli środowisko programistyczne ma określoną funkcję, komputery użytkowników mogą nie. A potem pewna funkcja może występować w 2-3 formach (rozszerzenie dostawcy, rozszerzenie ARB, funkcja podstawowa), więc może być konieczne wyszukiwanie funkcji pod kilkoma różnymi nazwami.

Wiele bibliotek „ładujących” GL (takich jak GLEW ) próbuje trzymać się konwencji GL. Tworzą „fałszywe” funkcje ze zwykłym glprefiksem i starają się magicznie sprawić, że Twój kod działa tylko na dowolnym systemie operacyjnym lub sterowniku, który obsługuje niezbędne funkcje. Zasadniczo, zamiast glFoobycia rzeczywista funkcja, to tylko globalny wskaźnik funkcji i biblioteka ładowarka (podczas inicjalizacji lub pierwszego użycia) wyszukiwania FooEXT, FooARBi Foodopóki nie znajdzie implementację, a następnie przypisuje że do globalnego wskaźnika. Kod klienta wygląda tak, jakby po prostu wywoływał zwykłą funkcję, ale magicznie wszystko zostaje rozwiązane w czasie wykonywania podczas inicjowania w sposób, który obsługuje wszystkie platformy i sterowniki.

Inne biblioteki umieszczają funkcje w przestrzeniach nazw lub w inny sposób różnią się nieco od normy GL. id napisał własną ładowarkę, albo dlatego, że nie lubią tych, które istniały lub - częściej - Quake tylko wyprzedza wszelkie inne biblioteki, która mogła wykorzystać id (the qw qglprawdopodobnych podpórek Quake, która była pierwsza gra id Tech do użytku GL).

Specyfikacja GL jest napisana z taką możliwością. Specyfikacja jest napisana bez prefiksów; to implementacja OpenGL decyduje o tym, którego prefiksu użyć ( gloczywiście jest to typowy). Biblioteki modułu ładującego, które umieszczają funkcje w przestrzeniach nazw lub używają własnych prefiksów, są całkowicie poprawne.

Doom 3, oparty na silniku Quake, jest całkowicie typowy i uzasadniony w używaniu biblioteki modułu ładującego do radzenia sobie z osobliwościami GL na wielu platformach oraz w wyborze użycia qglprefiksu.

Sean Middleditch
źródło
+1 i pochwały za zauważanie, że idźle napisałem (masz całkowitą rację co do wielkich liter), chociaż en.wikipedia.org/wiki/Id_Tech jest nadal pisany spacją, we wszystkich źródłach, jakie mogłem znaleźć.
vaxquis