Program 19 – Offset Mapping
21.09.2004
Offset mapping spočíva v posunutí textúrových koordinacií s ohľadom na pozíciu pozorovateľa a výšku povrchu tak, že vzniká dojem plastického povrchu. Konkrétne sa textúrové koordinácie posunú v smere od pozorovateľa pre hrbole a v smere ku pozorovateľovi pre diery. Pre výpočet potrebujeme mať eye vektor (vektor od povrchu ku pozorovateľovi) v suradnicovej sústave povrchu (surface space) a výškovú mapu. Potom:
nové_textúrové_koordinácie = (0.04*výška-0.02)*eye + povodné_tex_koordinácie
Tieto nové vypočítané koordinácie použijeme na čítanie z difúznej a normálovej mapy, a následne spočítame osvetlenie.
Offset mapping je niekedy označovaný ako parallax mapping. Viac informácií môžete nájsť v dokumente Parallax Mapping with Offset Limiting a na diskusných fórach (odkazy v sekcii linky).
Offset mapping je efekt porovnavaný s Displacement mapping-om, čo je technika kde sa na základe výškovej mapy generuje povrch zložený s veľkého počtu trojuholníkov. Displacement mapping podporujú niektoré nové grafické karty. Je ho možné robiť (aj) pomocou vertex shader 3.0, ktorý umožňuje pristupovať ku textúre. V programe je ukážka displacement mapping-u, cez dopredu vygenerovanú sieť trojuholníkov. Offset mapping je nenáročný a ľahko implementovateľný s per pixel osvetlením.
Implementovať offset mapping cez ps 1.4 je možné v jednom pase. V ps 1.1 je situácia zložitejšia, pretože vykonanie samotného offset mappingu spotrebuje 3 z 4 textúrovacích jednotiek použiteľných v ps 1.1. Ja ho som implementoval tromi pasmy.
V programe je aj ase model osvetlené pex pixel osvetlením s offset mapping-om. Offset mapping je urobený iba pre pixel shader 1.4 (v ps 1.1 sa to bez kreslenia do textúry nedá). Offset mapping sa dá vypnúť a tak porovnať s bežným per-pixel osvetlením.
Použil som viaceré optimalizácie:
- vykresľovanie iba tých objektov, ktoré sú v pohľade (Frustum Culling)
- zmena tých trojuholníkov, ktoré sú mimo dosahu svetla na trojuholníky s nulovou plochou pomocou vertex shader
- vykresľovanie v smere od pozície pozorovateľa
Svetlá sa usporiadajú od najbližšieho svetla ku najvzdialenejšiemu. Najprv vykreslím všetky trojuholníky v pohľade s prvým svetlo a s ambient zložkov. Potom vykresľujem postupne všetky trojuholníky v pohľade osvetlenými svetlom podľa poradia, pričom sa používa optimalizícia cez vertex shader. Veľa pixelov s týchto trojuholníkov bude vzdialenejšie ako tie skor vykreslené a tak z-test pre ne neprejde. Aj keď z-test je v pipeline až za pixel shader-om, v skutočnosti ho hw prevádza pred pixel shaderom. Tým sa dá ušetriť mnoho prístupov do pamete (pre načítanie texelov) a aj samotný vypočet pixel shader-a.
Horný obrázok predstavuje klasické per pixel osvetlenie s ambient, diffuse a specular zložkov (exponent 32). Prostredný obrázok predstavuje to isté osvetlenie s použitím offset mapping-u. Dolný obrázok predstavuje displacement mapping.
Vyžaduje pixel shader 1.1. Používa pixel shader 1.4.