Drodzy, dziś mam zamiar przedstawić Wam podstawy OpenGL – biblioteki, która wykorzystywana jest do tworzenia konentu multimedialnego – gier, prezentacji a także od połowy zeszłej dekady do tworzenia efektów pulpitu w środowisku Linux (Beryl, Compiz, KDE Desktop Effects). Biblioteka ta w chwili, gdy opanujemy jej podstawy staje się doskonałym narzędziem do tworzenia gier i animacji nie tylko pod Linuxem.

 

Tutorial Video

 

Biblioteki Open Source

OpenGL w środowisku Linux dostarczany jest z kilku źródeł. Podstawowym jest MESA, która dostępna jest dla X11 od pierwszych wersji wypuszczonych na rynek w 1993 roku.

MESA w obecnej wersji (10.0 na chwilę pisania wpisu) obsługuje API w wersji 3.3 oraz GLSL (OpenGL Shader Language) w wersji 3.30. Początki mojej zabawy z OpenGL dotyczą właśnie MESA ze względu na wczesne próby OpenGL-a wykonywane na urządzeniach Intela (Intel GMA965). MESA obsługuje większość kart dostępnych na rynku zapewniając wsparcie OpenGL. Poza wsparciem X11, MESA umożliwia wykorzystanie OpenGL także za pomocą buffora ramki (framebuffer) z poziomu konsoli pracującej w tym trybie.

Biblioteki własnościowe

Poza implementacją OpenGL, jaką jest MESA wykorzystać możemy sterowniki dostarczone przez ATI oraz NVidia. Ze względu na posiadany sprzęt w tutorialu bazował będę właśnie na własnościowych sterownikach NVidia, jednak sam kod aplikacji pracującej w OpenGL nie będzie się różnił niczym w przeciwieństwie do sterowników ATI czy omówionej wcześniej MESA. W aplikacji istotne są jedynie wersje OpenGL oraz GLSL obsługiwane sprzętowo przez kartę lub w trybie programowego renderowania na procesorze (CPU) – sprzęt z punktu widzenia programisty nie jest tak bardzo istotny, w przeciwieństwie do punktu widzenia użytkownika.

Jakie biblioteki mam zainstalowane?

Aby sprawdzić dostępne zainstalowane biblioteki w Gentoo możemy wykorzystać polecenie eselect:

$ eselect opengl list

Wyjście aplikacji powinno wyglądać podobnie:

OpenGL eselect nvidia mesa x11 tutorial gentoo linux

Powyższy przykład oznacza, że mamy do dyspozycji dwie implementacje OpenGL – jedną własnościową od Nvidia [1], drugą otwartą od MESA [2]. Gwiazdka oznacza, która wybrana jest jako domyślna i skonfigurowana w systemie.

Jeśli przy żadnej z wymienionych nie widzicie gwiazdki, wystarczy, że wykonacie polecenie jako super użytkownik (root):

# eselect opengl set 1

Jako domyślna zostanie ustawiona biblioteka, która wyświetlana jest pod numerem [1] a dowiązania symboliczne do odpowiednich bibliotek oraz plików nagłówkowych zostaną przygotowane przez eselect automatycznie.

OpenGL eselect nvidia mesa x11 tutorial gentoo linux

Jeśli nie posiadacie bibliotek OpenGL do kart NVidia lub ATI, możecie skorzystać z poleceń:

Nvidia

# emerge nvidia-drivers

ATI

# emerge ati-drivers

Polecenia zainstalują Wam sterowniki własnościowe!

 

Jak sprawdzić, czy OpenGL działa?

Dawno, dawno temu, gdy X11 nie posiadał jeszcze możliwości autokonfiguracji, w środowisku Linux zdarzało się, że mimo wielu prób instalacji MESA, DRI (Direct Render Interface) oraz sterownika karty graficznej zestaw nie współgrał ze sobą. Otrzymywaliśmy wówczas informację o renderowaniu niebezpośrednim (Indirect Rendering). Oznacza to, że renderowanie odbywa się w trybie programowym a nie sprzętowym, wykorzystując główny procesor (CPU) a nie jednostkę obliczeniową karty (GPU).

Dla pewności warto jest sprawdzić, czy OpenGL, który macie zainstalowany – nie zależnie od metody i rodzaju sterownika (MESA, NVidia lub ATI) wykorzystuje renderowanie bezpośrednie (za pomocą karty graficznej a nie CPU).

Do tego celu wykorzystać możecie pakiet mesa-progs oraz oprogramowanie glxinfo.

Instalujemy mesa-progs

# emerge mesa-progs

Sprawdzamy Direct Rendering za pomocą glxinfo.

# glxinfo | grep „direct rendering”

Otrzymamy zapewne komunikat:

OpenGL eselect nvidia mesa x11 tutorial gentoo linux

„direct rendering: Yes” oznacza, że renderowanie odbywa się za pomocą karty graficznej w trybie sprzętowym. W innym przypadku musimy zweryfikować, czy wszystkie sterowniki są zainstalowane poprawnie w systemie.

Sprawdzamy wersję OpenGL i GLSL

Zanim rozpoczniemy pracę, sprawdźmy jakie wersje OpenGL oraz GLSL obsługuje nasza karta graficzna. Na tej podstawie możemy wnioskować w procesie tworzenia aplikacji, które rozszerzenia OpenGL są dla nas dostępne. Do tego celu wykorzystujemy wcześniej omówiony pakiet mesa-progs i polecenie glxinfo.

# glxinfo | grep „OpenGL”

Wyjście aplikacji w moim przypadku wygląda następująco:

OpenGL eselect nvidia mesa x11 tutorial gentoo linux

W tłumaczeniu dosłownym wyrzuconych na ekran danych widzimy, że do dyspozycji mamy OpenGL w wersji 4.4.0 oraz GLSL w wersji 4.40. Featuresy dostępne dla mnie są więc większe niż w przypadku obecnie najnowszej open sourceowej wersji MESA (MESA 10.0 to OpenGL API 3.3 oraz GLSL 3.30).

Jak odnaleźć się w wersjach by dotrzeć do użytkownika

Jeśli kupowaliście kiedyś gry dla Windows – a zakładam, że na pewno tak było – na tylnej stronie opakowania wypisane są zwykle wymagania systemowe produktu, który trzymaliście w ręku. Znajdowała się tam wersja DirectX – „Karta graficzna obsługująca DirectX 9.0c”. Wersję OpenGL można porównywać pod tym względem z DirectX. Dlaczego? Otóż jeśli nasza „gra”, którą piszemy, będzie wykorzystywać możliwości OpenGL 4.4, oznacza to że posiadacze „starszych” kart graficznych nie dostrzegą wszystkich efektów, które dla nich przygotowaliśmy lub co gorsze – do emulacji tych efektów zostanie wykorzystany główny procesor komputera zwalniając funkcjonowanie gry często w znaczącym stopniu (spadek FPS).

Postarajcie się bazować na najnowszej, stabilnej wersji MESA jako źródle „features”, które wykorzystacie w produkcji. Jeśli najnowsza MESA posiada wersję OpenGL 3.3, oznacza to, że powinniście bazować właśnie na rozszerzeniach OpenGL z pakietu 3.3 i starszych. Tworząc oprogramowanie z wykorzystaniem tej zasady nie odetniecie się od użytkowników starszych kart graficznych a tym samym Waszych potencjalnych klientów.

 

Pliki nagłówkowe

Wraz z wyborem OpenGL – czy to z pakietu MESA, NVidia czy ATI do naszego systemu „wgrywane” są biblioteki oraz pliki nagłówkowe stanowiące opis funkcji znajdujących się w tych bibliotekach. Pliki nagłówkowe OpenGL znajdują się w kilku katalogach:

/usr/include/GL/usr/include/GLES
/usr/include/GLES2
/usr/include/GLES3

OpenGL eselect nvidia mesa x11 tutorial gentoo linux

W zależności od zainstalowanego oprogramowania w waszym /usr/include możecie znaleźć wyłącznie katalog:

/usr/include/GL

Jest to prawidłowa sytuacja, ponieważ w tym katalogu znajdują się najistotniejsze pliki nagłówkowe, które wykorzystamy.

OpenGL eselect nvidia mesa x11 tutorial gentoo linux

Mamy do dyspozycji takie perełki wśród bibliotek obsługi OpenGL jak GLUT, FREEGLUT, GLX, GLXEXT czy GLEW.

Kompilacja

Aby skompilować aplikację, która wykorzystuje biblioteki OpenGL musimy wykorzystać dodatkowy parametr/flagę dla GCC, którą jest -lGL. Spowoduje to dołączenie wszystkich koniecznych (z pakietu podstawowych) bibliotek OpenGL do programu przez linker.

Przykład:

$ gcc mojprojektgl.c -lGL -o mojprojektgl

Stworzony zostanie program o nazwie „mojprojektgl” z dołączonymi dynamicznie bibliotekami OpenGL.

 

CDN.

 

Jeśli macie pytania do tej części tutorialu – zapraszam do komentowania poniżej :).

 

Pozdrawiam, M.M.