|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
|
|
||||||||||
|
|
|||||||||
|
Tak se opět po krátkém čase setkáváme při pokračování seriálu o OpenGL. Jak vám již nadpis napověděl, dnes poznáme, co tajemného skrývá pojem DisplayList. A také se naučíme, jakým způsobem jednoduše udělat objekt průhledným (simple blending) a nakonec vyzkoušíme velmi užitečnou věc, pokrývání objektů texturou.
Poskládáme si pyramidu z krychlí, kterou vidíme na obrázku. Stavíme se tak před problém, jakým způsobem do scény umístit rozumně 15 krychlí, které jsou na chlup stejné. Mohli bychom udělat cyklus a postupně vykreslit všech patnáct krychlí. Každou krychli bychom jako obvykle seskládali ze 6 stěn. Sami uznáte, že při každém volání funkce DrawScene by počítač
pokaždé musel přepočítat celou scénu, tzn. posunout 15 krychlí do správné polohy
a správně zobrazit (barva, průhlednost, světla ... atd.). To může mít za následek
značné zpomalení při složitějších scénách. Druhá možnost, která se nám nabízí je, předem vytvořit jeden objekt
- Tím se dostáváme k tomu, co je to DisplayList. Je to seznam objektů, které jsou předem připravené pro zobrazení ve scéně. Do tohoto seznamu můžeme umístit libovolný objekt nebo skupinu objektů, můžeme s nimi libovolně manipulovat nebo vykreslovat a později z DisplayListu smazat. Je mnohem efektivnější vytvořit objekt ještě před vykreslením, uložit do DislplayListu a později v pravou chvíli vykreslit, jednou, dvakrát ......atd. Teď již víme vše k tomu, abychom mohli začít rýsovat pyramidu. Poznámka:
Každý objekt nebo skupinu objektů, které chceme umístit do DisplayListu,
označíme pořadovým číslem (indexem), podle kterého jej budeme identifikovat.
ten ukončíme podobně jako blok glBegin a glEnd příkazem Jednu krychličku už máme teď nás čeká milá povinnost, editujeme uživatelskou funkci DrawScene. Zde musíme naskládat do pyramidy všech 15 krychlí, po řádcích v počtu od 1 do 6.
Výpočet pyramidy zajistí přesně aby k sobě krychličky pasovali. Můžeme je i otáčet. Na potočení máme staré známe proměnné xrot, yrot, jejíž hodnoty měníme pomocí kurzorových kláves. Vše pěkně zabaleno v zip souboru (161 KB). TexturyDnes se na tomto místě konečně dostáváme k pojmu, který je v herním průmyslu a mezi fanoušky počítačových her skloňován snad ve všech pádech. Jedná se o tzv. textury. Společně poodestřeme roušku tajemství, které textury skrývají. Začneme opět jednoduše, rotující krychlí. Dnes si jí vylepšíme pohlednou texturou viz obrázek.
Textura je obyčejný obrázek. Tento obrázek musí splňovat určitá
kritéria. Musí mít předepsanou velikost, tzn. čtverec o velikostech 16*16, 32*32,
64*64, 128*128, 256*256, 512*512 ..... s jinou velikostí bychom neuspěli.
Uvnitř této funkce voláme velmi důležitou proceduru, která zajistí načtení DIB obrázku a vrácení ukazatele. Jde o funkci z knihovny glaux.
Tím ale naše trampoty nekončí. Nyní musíme převést obrázek na texturu tak, aby ji akceptoval OpenGL. K tomuto účelu potřebujeme opět vlastní funkci LoadGLTextures(), která načte všechny textury (pozn. do budoucna až bude textur více) Budeme potřebovat ukazatel na obrázek: Načteme obrázek pomocí funkce LoadBMP, která nám vrátí ukazatel a pokud je vše v pořádku (soubor existuje a je úspěšně otevřen), vytvoříme tedy texturu. Toho dosáhneme třemi řádky
Prvním řádkem v rámečku říkáme OpenGL, že vytváříme 2D texturu,
která jé přístupná přes ukazatel texture[0]. 2D textura je dána šířkou X a výškou
Y.
target - určuje typ textury, vždy musí být GL_TEXTURE_2D
Doufám, že následující popis byl pro vás dostatečně pochopitelný, protože postupujeme dál k funkci glTexParameteri, nastavení dalších parametrů textury. První hodnota může nabývat GL_TEXTURE_1D nebo GL_TEXTURE_2D, doporučuji pouze tu druhou možnost. Další parametr udává kvalitu texturování. Zvolíme minimální, takže hodnotu GL_TEXTURE_MIN_FILTER a typ mapování textury nastavíme jako lineární - GL_LINEAR. Před ukončením funkce musíme ještě uvolnit použitou paměť, i když jsme sami vlastně žádnou nealokovali, musíme uvolnit TextureImage[0]->data, kde byl uložen surový obrázek a ještě TextureImage[0].
Tak to nejhorší máme za sebou, nyní stačí jen vytvořenou funkci zavolat při inicializaci OpenGL. Nesmíme zapomenout aktivovat používání textur, podobně, jako tomu bylo u světel.
Nastavení textury máme úspěšně za sebou, nyní se můžeme vrhnout na samotné nanášení textur. není to nic těžkého. Jak to funguje?
Mapování textur znázorňuje obrázek. Potřebujeme dosadit levý roh bitmapy do levého rohu čtverce, pravý roh bitmapy potřebujeme dosadit do pravého rohu čtverce atd... Toho dosáhneme tak, že šířku a výšku bitmapy budeme brát jako logický celek, takže jak vidíte na obrázku, levý horní roh bitmapy identifikujeme jako (0,0) a pravý dolní roh určíme jako (1,1).
Řádkem To je celé, program je ke stažení zde (174 KB). No a to je opět všechno, co jsem chtěl dnes sdělit. Příště se
podíváme, jak potexturovat složitější objekty, nakousneme průhledné textury
a možná i vytvoříme mlhu hustou tak, že by se dala krájet.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||