Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

3D technologie: Bump Mapping

20.7.2004, Zdeněk Kabát, článek
3D technologie: Bump Mapping
Po delší době se opět podíváme na 3D technologie používané v současných GPU. Pod drobnohled jsem si tentokrát vzal Bump Mapping, což je řada technik a algoritmů umožňujících pomocí 2D textur simulovat zakřivení povrchu apod. V článku poskytnu detailní popis Emboss, Environment a DOT3 Bump Mappingu (tzn. normálového mapování), okrajově se zmíním i o Displacement Mappingu.
Normal (DOT3) Bump Mapping

Než se pustím do popisu dalšího typu Bump Mappingu, musíme si nejdříve ujasnit, o co se vlastně jedná. Normálové mapování (Normal mapping) můžete v dokumentech nalézt pod různými názvy. Všechny výrazy jako je Dot product Bump Mapping, DOT3 Bump Mapping, Per-pixel shading, Per-pixel lightning označují svým způsobem stejný jev (poslední dva samozřejmě v širším slova smyslu). Jeho využití a princip se pokusím dále osvětlit.


Obr. 10 - Příklad per-pixel Bump Mappingu
Klikněte pro zvětšení

Normálové mapování je dnes nejrozšířenějším typem Bump Mappingu, protože jako jedno z mála využívá k osvětlení přímo normály (proto tento název). Další výhodou je, že pracuje čistě na per-pixel úrovni. Zatímco předchozí typy vycházely při osvětlení (které nebylo dáno bump mapu) z normál, které byly při Gouraudově stínování interpolovány, normálové mapování přímo určuje normály pro každý pixel uvnitř polygonu! To umožňuje obrovskou škálu efektů, které v kombinaci s pixel shadery dokáží mnoho.

Princip normálového mapování je opět postaven na přídavné textuře, která je zde nazvaná normálová mapa (normal map). Je tu jistá podobnost s bump mapou u EMBM, která obsahovala DU/DV změnu oproti U, V souřadnicím texelů v polygonu. Zde obsahuje normálová mapa absolutní vektor normály pro daný texel v souřadnicích XYZ. Tento upravený vektor je nadále použit pro výpočet osvětlení scény.

Pozn.: Normálová mapa je buď odvozena z výškové mapy nebo je přímo vypočtena. K tomu se používají dva modely - jeden velmi detailní a jeden takový, jaký bude použit ve hře. Dále je spočítán rozdíl v souřadnicích jednotlivých texelů a ten je následně uložen do normálové mapy.


Obr. 11 - Výpočet normálové mapy ze dvou modelů

Emboss Bump Mapping i EMBM pracovaly s 8-bitovou, tedy černobílou mapou. Normálová mapa využívá již 24-bitovou texturu, která je schopná uchovat 65 536x více informací. Ti bystří z vás již pochopili, že se jedná o barevnou texturu a já jen upřesním, že každý barevný kanál RGB (red, green, blue) obsahuje právě jednu souřadnici XYZ (X - červená, Y - zelená, Z - modrá).


Obr. 12 - Převod výškové textury na normálovou mapu

Odvození od výškové mapy je již trochu složitější. Každý texel, který obsahuje v původní mapě posun v rozsahu [-1, 1], je převeden do 8-bit celého čísla [0, 255] a následně je přidán třetí vektor, jenž je určen podle směru osvětlení. Konečná informace pro každý texel je tedy ve formátu [x, y, z], kde XYZ mohou nabývat 256 celočíselných hodnot.

Ovšem normálové mapování má jednu mouchu, která ztěžuje život všem vývojářům. Zatímco osvětlení scény je určováno ve světových souřadnicích, tak normálová mapa kóduje informace v texturových souřadnicích, kde X, Y odpovídají U, V vektorům a Z je kolmice na texturu, čili normála daného polygonu (tzv. tangentový prostor). Řešení sice není složité, ale samozřejmě přidá programátorům práci.

U statických scén se řeší tento rozpor tak, že se souřadnice v normálové mapě převedou do světových souřadnic. Pokud je scéna pohyblivá, je situace složitější - každý světelný zdroj musí být převeden do tangentového prostoru. Z toho je evidentní, že situace dynamické scény s několika světelnými zdroji je pro vývojáře noční můrou.


Obr. 13 - Serious Sam 2 s normálovým mapováním
Klikněte pro zvětšení

Normálová mapa má ale ještě jednu nevýhodu. Protože je textura obsahující normálové vektory texelů 24-bitová, není její objem zrovna nejmenší. Normálová mapa musí mít totiž stejný rozsah jako model, na který chceme normálové mapování aplikovat, a proto klade na frame buffer stejné nároky jako původní textura. Proto je nutné používat různé kompresní algoritmy jako S3TC/DXTC a nově i 3Dc od ATi (viz preview Radeonu X800).

Ovšem výhody plynoucí z použití normálového mapování jsou obrovské. Protože tato technika pracuje na per-pixel úrovni, kde každý texel obsahuje svůj normálový vektor, lze takto vytvořit téměř všechny možné efekty, které v kombinaci s Shader Model 2.0 přinášejí skvělou grafickou podívanou. Na scénu s upravenými normálami lze libovolně aplikovat Gouraudovo i Phongovo stínování. Nároky na paměť jsou sice větší než u Emboss a Environment BM, ale menší, než kdybychom takto renderovali celou scénu.