|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
|
|
||||||||||
|
|
|||||||||
|
Vítám vás u prvního dílu seriálu o tvorbě v OpenGL. Jistě vás již omrzelo (jako
mě) dělat hry v DirectX. Je tedy čas skončit s líbeznými omalovánkami a pusťme se do drsné reality 3D prostoru. OpenGL je pro programátora velmi komfortní nástroj pro rýsování. Dovolím si
ještě jedno malé srovnání DirectX a OpenGL z hlediska programování aplikací.
Teď jistě potěším ortodoxní céčkaře, OpenGL je knihovna C funkcí. Jedním slovem
"ráj " pro céčkaře. Žádné třídy a složité struktury, vše je čisté
a uhlazené. Možná to bude znít jako věta z reklamy, ale programování s OpenGL je opravdu
jednodušší. Nastavení OpenGL ve Windows98Pro práci s OpenGL je potřeba mít tuto knihovnu v počítači nainstalovánu, což myslím je dnes již samozřejmostí. Ovšem některé grafické karty mají s OpenGL veliké problémy. Nebudu jmenovat, konkrétně karty Voodo si s OpenGL moc nerozumějí. Je proto potřeba si u výrobce grafické karty stáhnout potřebný ovladač. Další potřebnou věcí pro úspěšnou práci s OpenGL jsou příslušné hlavičkové soubory: gl.h, glu.h a glaux.h. Poznámka: U některých překladačů možná budete potřebovat do projektu přidat soubory: OpenGL32.lib GLu32.lib a GLaux.lib. Dost řečí, pusťme se do našeho prvního OpenGL programu. Co bude cílem našeho jednoduchého výtvoru? Pro začátek bych se nepouštěl do žádných větších akcí, spokojíme se z trojúhelníkem, který vidíte na obrázku:
Nic světoborného. Budeme programovat v C++ Builderu. Vytvořme si nový projekt a podívejme se na jeho odlišnosti a specifika od jiných aplikací. Za zmínku stojí
Ve Windows probíhá vykreslování přes rozhraní GDI pro 2D grafiku, které jak víme je velmi pomalé. Funkce GDI vykreslují do HDC (resp. jenom DC) - do příslušného zařízení Device Context. Device Context získáme z Canvas->Handle. Abychom mohli pracovat s OpenGL musíme přemostit vykreslování na rozhraní OpenGL tím, že nastavíme tzv. PixelFormatDescriptor, který slouží jako komunikátor mezi výstupními rutinami windowsu a výstupními rutinami knihovny OpenGL. Poukazuje na to, jaké rozdíly jsou v zobrazování barev atd. Toto nastavení najdete ve funkci bSetupPixelFormat. Pokud vás zajímají jednotlivé položky ve struktuře PIXELFORMATDESCRIPTOR, najdete to v helpu. SetPixelFormat nastaví daný pixelformat danému DC. Po nastavení PixelFormatu vytvoříme Context pro OpenGL funkcí wglCreateContext opět s parametrem HDC, tedy Canvas->Handle.
Nastaví hRC - OpenGL Rendering Context jako aktuální, Po té zavolá uživatelskou funkci DrawScene, která nám slouží pro rýsování a nakonec zruší aktuální Rendering Context. Nyní musíme ošetřit metodu FormResize, aby se nám scéna správně překreslila
při změně velikosti okna.
Nejdřív zrušíme Rendering Context a nastavíme nový PixelFomat. To už je nám stará známá písnička, takže následně opět vytvoříme nový aktualizovaný Rendering Context. glLoadIdentity() - resetuje projekční plátno, a posune souřadnici 0,0 do středu. gluPerspective - nastavuje perspektivu kamery, jak bude vypadat prostor pohledem kamery. První parametr s hodnotou 30.0, určuje zorný úhel kamery. gldAspect je poměr výšky a šířky formuláře (projekčního plátna). Další hodnota (1.0) zadává nejmenší vzdálenost, od které je vidět vykreslovaný objekt. No a 10.0 naopak udává největší vzdálenost od které již objekt není viditelný. glViewport - tato funkce nastavuje velikost zobrazované plochy. Nakonec zavoláme naši uživatelskou rýsovací funkci DrawScene();. Výsledek je jednoduchý, RGB trojúhelník. Začínáme rýsovatJaký je základní princip rýsování do rozhraní OpenGL? Kreslení v OpenGL se dá připodobnit k rýsování jako například v AutoCadu. Vše se rýsuje posloupností příkazů - bod, čára trojúhelník. Takže obdobně jako při rýsování máme určený nějaký počátek souřadnicového systému. Ten je dán jako obyčejně souřadnicí 0,0,0 na osách x,y,z. Počátek je umístěn uprostřed plátna. glLoadIdentity() - zresetuje pohled a souřadnice 0,0,0 se nachází uprostřed obrazovky. Přitom nalevo od 0,0,0 se nachází záporný směr osy X, napravo kladný. Nahoru směřuje kladný směr osy Y, a dolů záporný. Osa Z má záporné hodnoty dovnitř a kladné ven.
Kreslení bodů, čar nebo vektorů, je analogické kreslení do souřadného systému x,y,z. Z obrázku je patrné, že pokud chceme používat jen souřadnou rovinu XY, zadáváme hodnoty tak, že Z souřadnice je 0. Dostaneme 2D zobrazení. Mě ale nevyhovuje, zadávat hodnoty jen od -1 do 1. Potřebuji často daleko větší rozmezí hodnot. Pro OpenGL to není problém, stačí jen posunout počátek.
Funkce přesune počátek souřadnicové sítě o zadanou hodnotu např. glTranslatef(-0.5f,0.5f, 0.0f); posune počátek o 0.5 na ose x a y. Chceme-li tedy mít k dispozici větší rozmezí, stačí posunout počátek na ose Z o -20. Teď už můžeme narýsovat jednoduché geometrické útvary. Jak už jsem říkal, vše rýsujeme pomocí posloupnosti příkazů. Tuto posloupnost uzavíráme do bloku glBegin() a glEnd(). Tím řekneme rozhraní OpenGL, že hodláme rýsovat, ale hlavně co chceme rýsovat.
Trojúhelník:
Čtverec se rýsuje obdobným způsobem.
Rectanlge - čtyřúhelník Obdelník lze narýsovat dvěma způsoby. Klasicky jako polygon pomocí vertexů nebo jako tzv. rectangle.
Rectangle se rýsuje do roviny XY
Trojúhelník a čtverec v barvách Další dovednost v OpenGL je použití barev. V této části se pokusíme vytvořit trojúhelník a čtverec v barvách. Nastavíme pro každý vrchol trojúhelníka barvu a zvolíme nastavení pro zobrazení polygonu na vyplněný polygon.
potom zkuste změnit druhý parametr na GL_LINE První bod projekce bude červený druhý modrý a třetí zelený Zkuste najít řádek:
Pokud máme nastaveno stínování GL_SMOOTH a umístíme do každého bodu jinou barvu, vznikne efekt, kde v jednotlivých rozích barvy přecházejí v druhou, prolínají se. To by pro tentokrát stačilo. Ještě se podívejte na názorný příklad a nemějte mi za zlé, že dnes dělám samé trojúhelníky. Příště určitě přitvrdíme. Podíváme se na rotace objektů. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||