Użyj tej funkcji, aby otrzymać funkcję OpenGL wg nazwy.
Składnia
void* SDL_GL_GetProcAddress(const char* proc)
|
Parametry funkcji
| proc |
nazwa funkcji OpenGL. |
Wartość zwracana
Zwraca wskaźnik do nazwanej funkcji OpenGL. Zwrócony wskaźnik
powinien zostać zrzutowany na właściwą sygnaturę funkcji.
Przykładowy kod
typedef void (APIENTRY * GL_ActiveTextureARB_Func)(unsigned int);
GL_ActiveTextureARB_Func glActiveTextureARB_ptr = 0;
/* Pobierz wskaźnik funkcji */
glActiveTextureARB_ptr=(GL_ActiveTextureARB_Func) SDL_GL_GetProcAddress("glActiveTextureARB");
/* Do ciebie należy upewnienie się, że jest to właściwa funkcja do wywołania! */
glActiveTextureARB_ptr(GL_TEXTURE0_ARB);
|
Uwagi
Jeśli biblioteka GL jest ładowania w czasie pracy aplikacji za pomocą
SDL_GL_LoadLibrary(), to wszystkie funkcje GL muszą zostać pobrane w ten sposób.
Zwykle stosuje się to do pobierania wskaźników funkcji do rozszerzeń OpenGL.
Jest kilka dziwactw przy wyszukiwaniu funkcji OpenGL, które wymagają dodatkowej
uwagi ze strony aplikacji. Jednakże, jeśli kodujesz ostrożnie, możesz poradzić
sobie z tymi dziwactwami bez tworzenia kodu zależnego od platformy:
- W Windows wskaźniki funkcji są specyficzne dla bieżącego kontekstu GL;
oznacza to, iż musisz wcześniej utworzyć pewien kontekst GL i uczynić go
bieżącym przed wywołaniem SDL_GL_GetProcAddress(). Jeśli tworzysz swój
kontekst lub tworzysz drugi kontekst, powinieneś założyć, że żaden z
istniejących wskaźników funkcji nie będzie ważny do użytku z nim. Jest to
(obecnie) ograniczenie specyficzne dla Windows, a w
praktyce mnóstwo sterowników nie cierpi na to ograniczenie, lecz w ten
sposób wg dokumentacji pracuje wgl API i powinieneś spodziewać się
awarii aplikacji, jeśli nie będziesz tego respektować. Przechowuj kopię
wskaźników funkcji, które pojawiają się w ciągu czasu pracy kontekstu.
- W X11 wskaźniki funkcji zwrócone przez tę funkcję są ważne z każdym
kontekstem i można je otrzymać nawet zanim jakikolwiek kontekst zostanie w
ogóle utworzony. Oznacza to, że przynajmniej dla jakiś typowych
implementacji OpenGL, jeśli pobierasz funkcję, która nie istnieje, otrzymasz
w wyniku wskaźnik o wartości różnej od NULL, z którego nie będzie
bezpiecznie korzystać przy wywołaniu. Zawsze musisz się upewnić, że dana
funkcja jest faktycznie dostępna dla danego kontekstu GL przed jej
wywołaniem przez sprawdzenie istnienia odpowiedniego rozszerzenia za pomocą
SDL_GL_ExtensionSupported() lub przez weryfikację, iż używana przez ciebie
wersja OpenGL oferuje tę funkcję w swoim podstawowym zestawie funkcji.
- Niektóre sterowniki OpenGL na wszystkich platformach zwrócą NULL, jeśli
funkcja nie jest wspierana, lecz nie możesz liczyć na takie zachowanie.
Sprawdzaj używane przez siebie rozszerzenia, a jeśli i tak otrzymasz
NULL, to zrób tak, jakby dane rozszerzenie nie było dostępne. Jest to
prawdopodobnie błąd w sterowniku, lecz powinieneś i tak zapobiegawczo
stosować ten scenariusz w kodowaniu.
- Nie zakładaj używania X11 tylko dlatego, iż twoja aplikacja pracuje w
Linuxie/Unixie. Serwery ekranu następnej generacji tylko czekają na
zastąpienie X11 i mogą, lecz nie muszą, obiecać to samo odnośnie wskaźników
funkcji.
- Wskaźniki funkcji muszą być zadeklarowane jako APIENTRY, jak w
przykładowym kodzie. Zapewni to odpowiednią konwencję wywołania na
platformach, gdzie ma to znaczenie (Win32), a w
konsekwencji unikając korupcji stosu.
Powiązane funkcje
SDL_GL_ExtensionSupported
SDL_GL_LoadLibrary
SDL_GL_UnloadLibrary