Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek
Uaktualniono: 31.07.2022

©2022 mgr Jerzy Wałaszek
I LO w Tarnowie

Interfejs SDL2:

SDL_GL_GetProcAddress

SPIS TREŚCI

Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.

SDL_GL_GetProcAddress

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

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2022 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.