Używanie rozszerzeń OpenGL w Windows

Chcę używać funkcji ujawnionych pod rozszerzeniami OpenGL. Jestem na Windows, Jak to zrobić?

 16
Author: Ashwin Nanjappa, 2008-08-18

4 answers

Łatwe rozwiązanie : Użyj GLEW. Zobacz jak tutaj .

Rozwiązanie twarde : Jeśli masz naprawdę silny powód , aby nie używać GLEW, oto jak osiągnąć to samo bez niego:

Zidentyfikuj rozszerzenie OpenGL i interfejsy API rozszerzeń, których chcesz użyć. Rozszerzenia OpenGL są wymienione w OpenGL Extension Registry .

Przykład: chcę skorzystać z możliwości rozszerzenia EXT_framebuffer_object. Na API, których chcę używać z tego rozszerzenia to:

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

Sprawdź, czy Twoja karta graficzna obsługuje rozszerzenie, którego chcesz użyć. Jeśli tak, to Twoja praca jest prawie skończona! Pobierz i zainstaluj najnowsze sterowniki i zestawy SDK dla karty graficznej.

Przykład: karta graficzna w moim komputerze to NVIDIA 6600 GT . Dlatego odwiedzam stronę NVIDIA OpenGL Extension Specifications i stwierdzam, że rozszerzenie EXT_framebuffer_object jest obsługiwane. I następnie pobierz najnowszy NVIDIA OpenGL SDK i zainstaluj go.

Twój producent karty graficznej zapewnia glext.h plik nagłówka (lub podobnie nazwany plik nagłówka) ze wszystkimi deklaracjami potrzebnymi do używania obsługiwanych rozszerzeń OpenGL. (Należy pamiętać, że nie wszystkie rozszerzenia mogą być obsługiwane.) Albo umieść ten plik nagłówka gdzieś, gdzie kompilator może go odebrać, albo dołącz jego katalog do listy dołączonych katalogów kompilatora.

Dodaj #include <glext.h> wiersz w swoim kod, aby dołączyć plik nagłówka do kodu.

Otwórz glext.h, znajdź API, którego chcesz użyć i pobierz odpowiadającą mu deklarację brzydko wyglądającą.

Przykład: poszukuję powyższych interfejsów API bufora ramki i znajduję odpowiadające im brzydko wyglądające deklaracje:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

Wszystko to oznacza, że plik nagłówkowy ma deklarację API w 2 formularzach. Jednym z nich jest wgl-like ugly function pointer declaration. Drugi to zdrowy rozsądek deklaracja funkcji.

Dla każdego interfejsu API rozszerzenia, którego chcesz użyć, Dodaj w swoim kodzie deklaracje nazwy funkcji jako typ brzydko wyglądającego łańcucha.

Przykład:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;

Choć wygląda to brzydko, wszystko, co robimy, to deklarowanie wskaźników funkcji typu odpowiadającego API rozszerzeń.

Zainicjalizuj te wskaźniki funkcyjne za pomocą ich prawowitych funkcji. Funkcje te są ujawniane przez bibliotekę lub sterownik. Musimy użyć wglGetProcAddress() funkcja do tego celu.

Przykład:

glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");

Nie zapomnij sprawdzić wskaźników funkcji dla NULL. Jeśli przez przypadek wglGetProcAddress() nie mógł znaleźć funkcji rozszerzenia, zainicjowałby wskaźnik znakiem NULL.

Przykład:

if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
    || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
    // Extension functions not loaded!
    exit(1);
}
Koniec z nami! Możesz teraz używać tych wskaźników funkcji tak, jakby istniały wywołania funkcji.

Przykład:

glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);

Bibliografia: wychodząc poza OpenGL 1.1 Dla Windows Dave Astle - artykuł jest trochę przestarzały, ale zawiera wszystkie informacje potrzebne do zrozumienia, dlaczego ta żałosna sytuacja istnieje na Windows i jak ją obejść.

 20
Author: Ashwin Nanjappa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:01:23

'bardzo silnym powodem', aby nie używać GLEW może być to, że biblioteka nie jest obsługiwana przez kompilator/IDE. Np.: Borland C++ Builder.

W takim przypadku możesz przebudować bibliotekę ze źródła. Jeśli to działa, świetnie, w przeciwnym razie ręczne ładowanie rozszerzenia nie jest tak złe,jak się wydaje.

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-19 12:01:59

@ Kronikarz:z pozoru GLEW wydaje się być drogą przyszłości. NVIDIA już wysyła go wraz z jego OpenGL SDK. A jego ostatnie wydanie było w 2007 roku w porównaniu do GLEE, które było w 2006 roku.

Ale użycie obu bibliotek wygląda dla mnie prawie tak samo. (GLEW ma init () , który musi być wywołany przed czymkolwiek innym.) Więc nie musisz się przełączać, chyba że znajdziesz jakieś rozszerzenie, które nie jest obsługiwane w GLEE.

 0
Author: Ashwin Nanjappa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-20 03:01:42

GL3W jest skryptem domeny publicznej, który tworzy bibliotekę, która ładuje tylko podstawowe funkcje dla OpenGL 3/4. Można go znaleźć na GitHubie pod adresem:

Https://github.com/skaslev/gl3w

GL3W wymaga Pythona 2.6 do generowania bibliotek i nagłówków dla OpenGL.

 0
Author: Steve Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-26 04:13:25