Když jsem přibližně před půl rokem (podzim 2003) přecházel z MS Windows® na operační systém Linux, měl jsem relativně velké potíže se zprovozněním OpenGL. Nejedná se sice o nic složitého, nicméně pro tehdy nic nechápajícího Woqa uživatele (analogie na Frantu uživatele :-) to byl naprosto neřešitelný problém.
Nad tímto článkem budou s největší pravděpodobností všichni Linuxoví guru nechápavě kroutit hlavou (myšleno nad jeho smyslem ne složitostí obsahu), nicméně začátečníkům by se opravdu mohl hodit. Pokud budete mít po přečtení dojem, že byl naprosto pod vaši úroveň, velice se vám omlouvám, ale každý někde musí začít.
Všechno, co zde budu popisovat určitě platí pro Mandrake Linux 9.2, s jinými distribucemi nemám zkušenosti, ale mělo by to být stejné nebo alespoň podobné.
Tento problém je způsoben tím, že v systému není přítomen ovladač grafické karty (respektive je, ale pouze obecný) a OpenGL se kompletně emuluje na software. Abych předešel jízlivým poznámkám od uživatelů jiného operačního systému: Po instalaci M$ Windows XP® je situace naprosto stejná, nicméně příčina komplikací leží na trochu jiném místě.
V Linuxu celý problém spočívá v tom, že ovladač vytvořený výrobcem, je komerční software (nebo něco v tom smyslu), a proto by systém nemohl být zdarma. Samozřejmě, když si Linux koupíte, platíte nějakou částku, např. já jsem obětoval plných 361 Kč! V ceně byly 3 standardní CD Mandrake, 1 Bonus CD od českého distributora (všechny 4 lisované) a tištěný 136 stránkový manuál. Pokud by se vám přesto již zmíněných 361 Kč zdálo příliš mnoho, nic vám, kromě pomalého připojení k internetu, nebrání ve stáhnutí ISO obrazů CD z ftp://mandrake.redbox.cz/, pak to bude opravdu zadarmo. V případě dražších verzí systému, kde už má výrobce nějaký zisk, bývají ovladače na správném místě ihned po instalaci.
Abych trochu rýpl do M$ a prosím opravte mě, jestli se mýlím. Proč nejsou ve Windows XP ovladače s podporou OpenGL nainstalované, ani když je karta správně detekovaná? Nejsem si jistý, zda na software běží i DirectX (nevím, nepoužívám - ani Win ani DirectX), ale dá se předpokládat, že ne. Zkrátka OpenGL je konkurenční standard...
Jak tedy nainstalovat driver grafické karty? Nejdříve zajděte na web výrobce (ATI - http://www.ati.com/, NVIDIA - http://www.nvidia.com/) a stáhněte si je. Mimochodem, u Mandrake Linuxu je můžete najít na Bonus CD. Firma NVIDIA podporuje Linux už hodně dlouho, takže by zde neměly být větší problémy. Naproti tomu ATI se o Linux začala starat až od Radeonu 8500. Instalaci ovladačů karet těchto dvou výrobců popisuje např. Mandrake - Instalační manuál, který napsal pan Ivan Bíbr. Před vlastní instalací si také určitě přečtěte README dokument, který najdete u ovladačů. Některé věci se přece jen mohly změnit, budete mít jistotu.
Schematicky nastíním alespoň postup... NVIDIA má vlastní instalátor, který sám zařídí většinu potřebných věcí. Neměli byste ho spouštět z grafického režimu, ale výhradně z konzole. Systém X Window by měl být při této operaci vždy vypnutý. Osobně jsem zprovozňoval GeForce 2 a vše bylo bez nejmenších problémů. Po dokončení instalace je ještě nutné změnit hodnoty několika položek v konfiguračním souboru XFree (/etc/X11/XF86Config-4). Vše potřebné najdete v README souboru.
ATI, co vím, distribuuje ovladače v balíčcích RPM. Jak jsem již napsal výše, jedná se pouze o karty Radeon 8500 a novější, takže s mým Radeonem 7000 byl trochu problém. Naštěstí jeho drivery (a několika desítek dalších karet) v sobě obsahuje přímo XFree. Nevím, jak se zapínají obecně, ale s největší pravděpodobností se opět jedná o /etc/X11/XF86Config-4. Mandrake 9.2 má v závěru instalace "Souhrn", ve kterém lze změnit všechna dosavadní nastavení. Na stejném místě, kde se definuje rozlišení monitoru, barevná hloubka a podobně, najdete i položku "Grafická karta". Pokud změníte volbu ze standardního "Radeon" na "Radeon fglrx", instalátor se vás v dalším kroku zeptá, zda chcete použít softwarovou emulaci OpenGL nebo běh na hardwaru. Pokud máte Linux už nainstalovaný, lze ovladač změnit v Ovládací centrum -> Hardware -> Nastavení grafického serveru -> Grafická karta (nezkoušel jsem...).
Znám několik lidí, kteří programují OpenGL aplikace pod knihovnou SDL (viz články). Její největší výhodou je, že se výsledný program dá portovat na mnoho operačních systémů. V mém případě se jedná o vývoj v Linuxu a případný přenos do MS Windows, nicméně je možný i obrácený směr :-).
Jako vývojové prostředí preferuji textový KDE editor KWrite (takový "maličko" lepší Notepad) a kompilátor gcc popř. g++. Je samozřejmě možné používat i specializovaná vývojová prostředí, jako jsou například KDevelop nebo Anjuta, která si v ničem nezadají s Wokenním Visual C++. Abyste pochopili následný výklad, doporučuji přečíst si alespoň první díl série článků Programování pod Linuxem pro všechny, který vychází na http://www.root.cz/. Bez těchto znalostí se opravdu neobejdete.
Jestli je možné OpenGL program zkompilovat, lze nejlépe ověřit samotnou kompilací. Použijte třeba demonstrační příklad umístěný úplně dole na této stránce - kdysi jsem ho stáhl z internetu a používám ho právě na úvodní testy po nové instalaci systému.
Rozbalte archív (například Konquerorem) a po přesunu do adresáře projektu zadejte příkaz "make", který provádí kompilaci.
[woq@localhost Documents]$ cd Color
[woq@localhost Color]$ make
g++ -c Main.cpp `sdl-config --cflags`
/bin/sh: line 1: sdl-config: command not found
In file included from Main.cpp:15:
main.h:10:94: SDL.h: No such file or directory
In file included from Main.cpp:15:
main.h:35: error: syntax error before `*' token
main.h:59: error: `SDL_keysym' was not declared in this scope
main.h:59: error: `keysym' was not declared in this scope
main.h:59: error: variable or field `HandleKeyPressEvent' declared void
Main.cpp: In function `void MainLoop()':
Main.cpp:40: error: `SDL_Event' undeclared (first use this function)
Main.cpp:40: error: (Each undeclared identifier is reported only once for each function it appears in.)
Main.cpp:40: error: syntax error before `;' token
Main.cpp:44: error: `event' undeclared (first use this function)
Main.cpp:44: error: `SDL_PollEvent' undeclared (first use this function)
Main.cpp:48: error: `SDL_QUIT' undeclared (first use this function)
Main.cpp:52: error: `SDL_KEYDOWN' undeclared (first use this function)
Main.cpp:53: error: `HandleKeyPressEvent' cannot be used as a function
Main.cpp:56: error: `SDL_VIDEORESIZE' undeclared (first use this function)
Main.cpp:58: error: `MainWindow' undeclared (first use this function)
Main.cpp:58: error: `SDL_SetVideoMode' undeclared (first use this function)
Main.cpp:63: error: `SDL_GetError' undeclared (first use this function)
Main.cpp: In function `void RenderScene()':
Main.cpp:116: error: `SDL_GL_SwapBuffers' undeclared (first use this function)
make: *** [Main.o] Error 1
[woq@localhost Color]$
Pokud se vypíše něco v tomto stylu, není v systému nainstalovaná knihovna SDL. Postupujte podle následujícího obrázku. Mimochodem, nejsou na něm vidět ty správné balíčky, protože u mě je už vše funkční.
Znovu zkuste make. Jak je vidět z následujícího výpisu, kompilační fáze proběhla v pořádku, ale linker nemohl najít knihovnu libGL(U).so (nepřesně řečeno: něco jako opengl32.lib z Windows).
[woq@localhost Color]$ make
g++ -c Main.cpp `sdl-config --cflags`
g++ -c Init.cpp `sdl-config --cflags`
g++ -o Color Main.o Init.o `sdl-config --libs` -lGL -lGLU -lm
/usr//bin/ld: cannot find -lGL
collect2: ld returned 1 exit status
make: *** [Color] Error 1
[woq@localhost Color]$
Nevím proč nejsou knihovny potřebné pro OpenGL umístěny v adresáři /usr/lib, ale v jeho XFree verzi /usr/X11R6/lib, která však není uvedena v systémové proměnné s cestami ke knihovnám. Existuje několik způsobů řešení, z nichž je asi nejsnadnější vytvořit symbolické odkazy (zástupce) na potřebné soubory. Protože obyčejní uživatelé nemají přístupová práva na zápis do těchto adresářů, musíte se přihlásit jako superuživatel root.
[woq@localhost Color]$ su root
Password:
[root@localhost Color]# ln -s /usr/X11R6/lib/libGL.so /usr/lib/libGL.so
[root@localhost Color]# ln -s /usr/X11R6/lib/libGLU.so /usr/lib/libGLU.so
[root@localhost Color]# exit
exit
[woq@localhost Color]$
Nyní by mělo být vše v pořádku. Zapište make a po zkompilování spusťte vytvořený program.
[woq@localhost Color]$ make
g++ -c Main.cpp `sdl-config --cflags`
g++ -c Init.cpp `sdl-config --cflags`
g++ -o Color Main.o Init.o `sdl-config --libs` -lGL -lGLU -lm
[woq@localhost Color]$ Color
Hit the F1 key to Toggle between Fullscreen and windowed mode
Hit ESC to quit
[woq@localhost Color]$
A výsledek celého našeho snažení...
Pokud byste chtěli přilinkovat knihovny nutné pro OpenGL např. ve vývojovém prostředí KDevelop, klikněte v menu na položku Projekt a v ní na Options... Objeví se vám okno, ve kterém stačí na kartě Linker Options přidat potřebné knihovny (měly by stačit -lGL -lGLU -lSDL).
Pokud už nějakou dobu v Linuxu pracujete, jistě byl pro vás celý postup velice jednoduchý, ale pro lidi, kteří na něj přešli teprve včera, to byl s největší pravděpodobností absolutně neřešitelný problém. Pro mě tedy byl. Zprovoznění kompilace OpenGL programů přerostlo v chaotické pokusy a omyly, při kterých jsem si kompletně zlikvidoval systém závislostí softwarových balíčků. Po překonání této fáze jsem už "jen", kvůli jednomu RPM stáhnutému z internetu obsahujícímu GLU, který byl v konfliktu s jiným, musel odinstalovat a následně znovu nainstalovat pětinu celého software.
Hlavním problémem pro mě tehdy bylo odnaučit se řešit problémy v Linuxu "Wokenním způsobem". Když uvedu příklad: ještě nedávno jsem měl za to, že *.so soubory jsou analogií *.dll knihoven z Windows a *.a představují *.lib. Ve všech textech, co jsem četl o kompilování v gcc, bylo přece jasně uvedeno, že se argument -lGL převede na libGL.a a tento soubor se pak hledá ve standardních adresářích s knihovnami. To je sice naprostá pravda, ale nikde už nebyla ani zmínka, že se u linkování používá i libGL.so, o kterém jsem si tudíž myslel, že je Linuxovou formou DLL knihovny - v linkovací fázi naprosto nepoužitelné. Překonání této utkvělé představy mi trvalo nejméně měsíc... a to je jen jedna z mála ukázek. Abych to ukončil: Linux se nerovná Windows, jak toto pochopíte (uvnitř - ne, že vám to někdo řekne), máte vyhráno.
napsal: Michal Turek - Woq <WOQ (zavináč) seznam.cz>