OpenGL 3/4 core profile зареждане

OpenGL и SDL и многоплатформено програмиране на игри.
skaslev
New User
New User
Мнения: 15
Регистриран: 26 юни 2006 16:19

OpenGL 3/4 core profile зареждане

Мнение от skaslev » 30 мар 2010 09:51

Написах едно Python скриптче, което генерира нужния код за зареждане на OpenGL3/4 core profile функциите. Скрипта можете да намерите на http://github.com/skaslev/gl3w .

Доскоро ползвах glew за зареждане на OpenGL extension-и. Проблема с glew е, че е доста голям и зарежда всички extension-и познати на човечеството, докато на мен ми трябваха само OpenGL 3 core profile функциите.

Ако пуснете скрипта (трябва ви Python 2.6), той ще свали GL3/gl3.h и ще изгенерира от него GL3/gl3w.h и gl3w.c, които можете да включите към проекта си. Трябва да се сложи #include <GL3/gl3w.h> преди всички други OpenGL-свързани заглавни файлове и да се извика gl3wInit() след кода който създава OpenGL контекст.

Тествал съм gl3w само под winodws засега, но би трябвало да работи и под Linux. Дали може някой линуксаджия с OpenGL 3 видео драйвер да пробва?

Потребителски аватар
Kerberos
Power User
Power User
Мнения: 234
Регистриран: 24 фев 2005 16:08
Местоположение: София
Контакти:

Re: OpenGL 3/4 core profile зареждане

Мнение от Kerberos » 30 мар 2010 12:17

Обикновено когато АTI или Nvidia направят подобрения в линукския драйвер, това се отразява и в OpenGL хедърите (да речем добавяне на функции за 3/4). Даже скоро забелязах, че при мен версията на OpenGL автомагично се е качила на 3.2 ... Иначе и а мен не ми харесва Glew. Решението ти е интересно все пак - всеки OpenGL програмист в даден момент се сблъсква с екстенжъните и намирането на адресите на нужните му функции ... като се разровя в стария си код и намирам нещо като:

Код: Избери всички

#ifndef GET_GL_PROC_ADDRESS
    #ifdef OS_WINDOWS
        #define GET_GL_PROC_ADDRESS wglGetProcAddress
    #else
        #define GET_GL_PROC_ADDRESS(f) glXGetProcAddressARB((const GLubyte*)f);
    #endif
#endif

#ifndef GET_GL_PROC
    #define GET_GL_PROC(ProcType, Proc) \
        GL_##Proc = (ProcType) GET_GL_PROC_ADDRESS ("gl"#Proc);   \
        printf("        %s %s\n", "gl"#Proc, GL_##Proc ? "  found" : "  not found");

#endif

    ...

    GET_GL_PROC(PFNGLGENBUFFERSARBPROC,                 GenBuffersARB);
    GET_GL_PROC(PFNGLBINDBUFFERARBPROC,                 BindBufferARB);
    GET_GL_PROC(PFNGLBUFFERDATAARBPROC,                 BufferDataARB);
    GET_GL_PROC(PFNGLDELETEBUFFERSARBPROC,              DeleteBuffersARB);
    GET_GL_PROC(PFNGLMAPBUFFERARBPROC,                  MapBufferARB);
    GET_GL_PROC(PFNGLUNMAPBUFFERARBPROC,                UnmapBufferARB);

    ....
Мисля, че си работеше перфектно на Win/Lin. Сещам се даже, че нарочно промених имената на функциите от gl* na GL_ и по този начин се спасих от некви ужасни проблеми в компилирането/линкването на двете платформи с различни компилатори и с различни хедъри и библиотеки.

skaslev
New User
New User
Мнения: 15
Регистриран: 26 юни 2006 16:19

Re: OpenGL 3/4 core profile зареждане

Мнение от skaslev » 30 мар 2010 12:32

gl3w също ползва wgl/glXGetProcAddress.

Разликата е в това, че имената на OpenGL функциите, които да зареди ги парсва директно от GL3/gl3.h. Така, когато излезе поредната версия на OpenGL и Khronos update-нат GL3/gl3.h, gl3w_gen.py автоматично ще изгенерира кода за зареждане на новите функции.

Потребителски аватар
Kerberos
Power User
Power User
Мнения: 234
Регистриран: 24 фев 2005 16:08
Местоположение: София
Контакти:

Re: OpenGL 3/4 core profile зареждане

Мнение от Kerberos » 31 мар 2010 14:58

Работи на Линукс. Добавих main, която вика gl3wInit(). Също така и едно просто принтване на адресите на функциите.
gcc -Iinclude src/gl3w.c -L/usr/lib -lGL -o gl3

skaslev
New User
New User
Мнения: 15
Регистриран: 26 юни 2006 16:19

Re: OpenGL 3/4 core profile зареждане

Мнение от skaslev » 11 апр 2010 16:57

@Kerberos Мерси =-)

Добавих малко документатция към страничката на проекта: http://github.com/skaslev/gl3w

Отговори