Zanir » Blog Archive » Program 19 – Offset Mapping

Program 19 – Offset Mapping

21.09.2004

019_Offset_Mapping_Offset_roomOffset 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.

019_Offset_Mapping_bump019_Offset_Mapping_Offset019_Offset_Mapping_DisplacementHorný 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.

zdrojové texty a program – 500kB

Pridať komentár