Lekce 0 - Předmluva k NeHe Tutoriálům

Ještě než se pustíte do čtení tohoto textu, měli byste vědět, že není součástí oficiálních (anglických) NeHe Tutoriálů. Napsal ho "pouze" jeden z překladatelů, kterému chybělo něco na způsob trochu ucelenějšího úvodu do tak obrovské problematiky, jakou představuje programování 3D grafiky, her a ostatně všeho okolo OpenGL.

Když jsem začínal s NeHe, myslel jsem si, že umím programovat. Je možné, že u vás je to pravda, u mě ale nebyla. Napsal jsem již sice několik aplikací, ale většinou se skládaly z bezduché lineární posloupnosti příkazů s občasnými odskoky do if bloků testující návratové hodnoty, pár cykly a podobně. Opravdu ucelenou množinu funkcí plných mnoha vnořených cyklů a podmínek, kdy každá plní svůj přesně daný účel a dohromady tak tvoří jednotný celek, jsem nikdy nenapsal. Toto mě naučily až NeHe Tutoriály.

Možná vám při čtení desáté, dvacáté lekce bude připadat, že až se dostanete na konec, budete umět (nejen) o OpenGL naprosto vše. Pokud mi slíbíte, že to nikomu neřeknete, prozradím vám jedno malé, ale důležité tajemství... v NeHe Tutoriálech rozhodně NENÍ všechno. Zpočátku to tak sice vypadá, ale až dočtete poslední tutoriál a ohlédnete se zpět, zjistíte, že sice umíte vytvořit OpenGL okno, vykreslit do scény nejrůznější obrazce, pokrýt scénu neprostupnou mlhou, vrhat stíny, načítat nejrůznější formáty obrázků, loadovat úchvatné 3D modely nebo tvořit jednoduché hry, ale věřte nebo ne, je to opravdu jen začátek. Stejně jako snad u čehokoli jiného i zde platí, že čím více věcí už znáte, tím více jich neustále objevujete před sebou.

Po dočtení těch 350, nebo kolik jich vlastně je, stránek zjistíte, že NeHe byl jen malý úvod. Na druhou stranu vám mohu slíbit, že pokud přečtete a hlavně pochopíte většinu z probíraných témat, budete mít vystavěné ultra pevné železobetonové základy, které se nikdy a za žádných okolností nezřítí jako vratký domeček z karet...

Ale dost strašení, nebojte, není to zase úplně tak hrozné, jak jsem právě napsal. Počítačová grafika má tu výhodu, že jakmile pochopíte principy a vytvoříte si pevné jádro poznatků, vše, co se naučíte dále, bude (většinou) jen nabalování dalších funkcí a efektů, které sice mohou být za určitých okolností naprosto úžasné, ale pokud je nepoužijete, tak se zase nic tak hrozného nestane.

Po dosažení této úrovně narazíte na jednu zajímavou věc a to, že při programování tzv. "grafiky" je samotná grafika jen malá částečka z moře dalších a většinou stejně nezbytných a mnohem složitějších věcí, které ale na první pohled nejsou vidět. Nezasvěceným lidem většinou naprosto unikají. Abychom nezůstali jen v teoretické rovině, uvedu několik praktických příkladů.

Vezměme si třeba trojúhelník, na který chceme namapovat texturu, což je samo o sobě velice jednoduché. Tedy, abychom byli přesní, extrémně složité, ale jako "blbí programátoři" ;-) necháme veškerou špinavou práci na OpenGL a potažmo na hardwaru grafické karty. Zkrátka vystačíme si několika málo řádky kódu. Pokud máme data obrázku ve správném formátu, je i vytvoření textury hračka. Problém spočívá především v nahrání obrázku do paměti. Existují spousty formátů od těch nejjednodušších (.RAW), kdy stačí soubor nahrát do paměti tak jak je, přes trochu složitější (.TGA, .BMP), které se ještě dají nahrát vlastními silami, až po hodně složité formáty (.JPG a spol.), kdy každý rozumně uvažující člověk vůbec nepřemýšlí a ihned sáhne po cizí knihovně. To samé platí i pro nejrůznější 3D modely z CAD/CAM programů, 3D Studia MAX, Milkshape 3D a dalšího modelovacího softwaru. Orientovat se v načítání externích dat bývá opravdu hodně složité, zvlášť když ani neznáte přesný formát souboru, protože ho daná firma vůbec neuvolnila.

Obrázky, modely a všechny ostatní formáty dat však mají jednu obrovskou výhodu - práce s nimi je téměř vždy naprosto stejná. Lze vytvořit univerzální knihovny, které např. uspořádají data nahraná ze souboru do pevně daného univerzálního formátu, programátor je pak pouze převezme a bez problémů použije.

Jsou ale oblasti, kde žádné knihovny od cizích lidí nepomůžou. Pokud vůbec existují, tak většinou musíme provést spoustu složitých úprav, aby pasovaly na náš případ. Typickým příkladem mohou být fyzikální simulace. Co to je? Většinou se jedná o pohyby objektů, které mají vypadat jako z reálného světa, ale nejen ony.

Například při vytváření automobilového simulátoru je velice lehké při zatočení volantem změnit směr auta. Trochu těžší je už zajistit, aby při zatáčení nejelo v jednom okamžiku určitým směrem a v druhém kolmo na původní směr a navíc stejnou rychlostí - hodně nereálné. Automobilovému fanouškovi by dále mohlo být divné, že se auto při najetí ve stovce do ostré zatáčky nepřevrhne a ani nedostane do smyku. Mám pokračovat nebo stačí? Myslím, že velice brzy pochopíte sami. Další podobné "šílenosti" uvedu pouze v rychlosti, k většině z nich byste měli v NeHe nalézt alespoň úvod. Jedná se hlavně o nejrůznější grafické efekty, detekce kolizí, kosterní animace modelů, nejrůznější optimalizace rychlosti programu, umělá inteligence počítačových protihráčů atd. atd. atd... každé téma samo o sobě na tisíc stránek.

Ale proč to sem všechno píši? Abyste se začali co nejdříve a co nejvíce věnovat jednomu hodně důležitému předmětu: matematice. Pokud jste ještě ve škole, neberte ji jako něco, co se musíte naučit, abyste nedostali špatnou známku nebo nepropadli. Berte ji jako něco, co se vám bude jednou určitě hodit a bez čeho se prostě neobejdete. Jestli vám nejde a proto ji nenávidíte, zkuste svůj přístup změnit, bez ní budete mít mnohem menší šance, pokud nějaké.

Je pravda, že úžasných a nepředstavitelných efektů dosáhnete i obyčejným sčítáním a odčítáním (hlavně v začátcích), ale za rok, za dva se minimálně bez analytické geometrie (body, vektory, roviny...) naprosto neobejdete, v 3D grafice vás bude provázet na každém kroku. Pokud se chystáte věnovat grafice především kvůli hrám - je zajímavé, že všichni začínají s myšlenkou her - UČTE SE MATEMATIKU, jinak nemáte nejmenší šanci.

Když už jsme u té školy, vrhněte se i na angličtinu. O programování existuje spousta literatury i v češtině, ale devadesát devět procent se věnuje naprostým základům. Zbývající jedno procento v té záplavě stále stejných informací velice jistě přehlédnete. Zírali byste, kolik knih a internetových serverů se věnuje pokročilým programovacím technikám, grafickým efektům, programování her a vůbec všem převratným novinkám v oblasti počítačů, bohužel všechno anglicky.

Asi si myslíte, že máte české literatury víc, než stihnete kdy přečíst. Jestli vás programování chytne jako mě, a věřte, že chytne :-), dávám vám půl roku, rok, víc určitě ne. Abych pravdu řekl, já jsem začínal s OpenGL téměř rovnou na anglických textech. V té době bylo do češtiny přeloženo pouze osm NeHe Tutoriálů - pro začátečníka absolutní minimum, v knihkupectvích nic (přetrvává do dneška) a i na českém internetu se nalezlo textů pomálu a to jsem prošmejdil každý kout. Dnes se dá alespoň po internetu pár věcí sehnat i v češtině, ale v mnoha oblastech angličtina stále dominuje, troufám si říct, že bude i nadále.

Co víc napsat? Asi jen popřát hodně štěstí, začátky bývají opravdu hodně složité. Ještě jedna věc, pokud nebudete úspěšní u prvního tutoriálu, zkuste ho přeskočit a někdy později se k němu vrátit. Už hodně lidí hned na začátku odradil a přitom se v něm OpenGL skoro nevyskytuje, téměř čisté Win32 API. Popisuje "pouze" vytvoření okna s podporou OpenGL. Zatím vám stačí vědět, že to, co chcete vykreslit, se píše do funkce DrawGLScene() a veškerá inicializace se umisťuje do InitGL(), vše ostatní stačí zkopírovat ...a modlit se, že to bude fungovat i nadále :-)

Takže ještě jednou přeji hodně úspěchů s OpenGL a příjemné chvíle při čtení NeHe Tutoriálů...

Michal Turek - Woq <WOQ (zavináč) seznam.cz>, 19.09.2004

Lekce 1 >>>