.[ ČeskéHry.cz ].
Generování normál mapy z heightmapy v GPU.

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 12. září 2007, 17:37:31    Předmět: Generování normál mapy z heightmapy v GPU. Odpovědět s citátem

Mořím se už dva dny s velkým problémem. Na první pohled žádná věda, ale myslím, že to je pro fajnšmekry. Posuďte:

Mám texturu šumu a pomocí ní vytvářím v Shaderu heightmapu, z ní následně generuju NormalMapu. Je to v OpenGL.

ALE:
Ta heightmapa i normal mapa jsou promítnutý a vykreslený z pohledu kamery (nebo jinýho projektoru) na rovinu (voda).
Takže ta šumová textura, podle který se generuje Heightmapa, může být hodně roztažená (např. při pohledu kamery zblízka na vodu). Roztažením dojde k lineární interpolaci (filtrování) textury šumu, což je nepřesné a dojde k nepostřehnutelnýmu zubatění vygenerované heightmapy.

Když se ale z této heightmapy vytváří dále normalmapa, zoubky začnou bejt na obtíž, protože se podle normál počítá osvětlení a je to hodně vidět. Vzniká naprosto příšerný moire.


Zkusil sem použít float textury (na všechno co se dalo), ale zjistil sem, že float textury neumí některé karty filtrovat (opravte mě, jestli se pletu). Takže problém s roztažením se tímto nevyřešil. Pouze pokud použiju místo šumové textuy nějakou funkci přímo v shaderu, jsou výsledné normály hladké, ale to udělat nemůžu, protože takovou funkci (která by simulovala rychle vodní vlnění) nejde snadno udělat.


Má někdo z vás nějaký nápad jak dosáhnout větší přesnosti s obyčejnou 24-32bit texturou? Jsou to 4 Byty, stejně jako float, jen nevím, jak v shaderu přetypovat na float r g b a [0..1]. A stejně by to bylo asi k ničemu.

A ještě pro upřesnění, implementuju tohle: http://graphics.cs.lth.se/theses/projects/projgrid/
Tam to hladký má, ale nepochopil sem z toho paperu, jak to dělá. Jednak je to DX a druhak používá hodně procesor.


Za odpovědi na můj specifický dlouhý dotaz děkuji, i když skoro ani nedoufám, že budou :)
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 12. září 2007, 17:51:44    Předmět: Odpovědět s citátem

a nevykresluju to v ortho tu mapu??
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 12. září 2007, 17:55:12    Předmět: Odpovědět s citátem

kdyby to bylo v ortho, bylo by všechno snadnější, ale je to v perspektivě
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crusty



Založen: 28. 08. 2007
Příspěvky: 120
Bydliště: Praha

PříspěvekZaslal: 12. září 2007, 18:10:06    Předmět: Odpovědět s citátem

mno jestli spravne chapu co k tomu autor pise tak pouziva LOD a ma to delene na quady ... mno a cim blize ke kamere tim detailnejsi

viz jeho popis http://graphics.cs.lth.se/theses/projects/projgrid/projgrid-hq.pdf
_________________
http://www.2ox.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ondras



Založen: 12. 09. 2007
Příspěvky: 66

PříspěvekZaslal: 12. září 2007, 18:44:26    Předmět: Odpovědět s citátem

Presne tak, on tam tim dela ten lod, takze si pak kazdy vrchol te site sedne presne do jednoho pixelu na te sumove mape. Tam by zadna interpolace byt nemela. On nedela projekci na plochu, ale vrcholy te plochy vytvari z projekce.

OT: cim generujes tu sumovou texturu? Perlinem nebo IFFT?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 13. září 2007, 08:01:11    Předmět: Odpovědět s citátem

Crusty:
ne ne,
dělá projekci mřížky ze screen space do world space. V tom demýčku stačí máčknout na pár kláves a je to vidět. Ty lody používám v enginu do teď, ale neni to nejlepší přístup.

Ondras:
Používám nejspíš Perlin, neboť FFT neznám.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 13. září 2007, 09:52:20    Předmět: Odpovědět s citátem

Moc jsem ten algoritmus nezkoumal, kazdopadne na nekolik otazek ti muzu odpovedet.

]semo[ napsal:
Roztažením dojde k lineární interpolaci (filtrování) textury šumu, což je nepřesné a dojde k nepostřehnutelnýmu zubatění ... Vzniká naprosto příšerný moire.

Nevim jak moc to na to bude mit vliv, kazdopadne moire vetsinou vznika, kdyz nepouzivas mipmapping a zmenseni textury ve viewportu je moc velke. Zkus zapnout generovani mipmap po renderingu do textury a pouzivat trilinearni filtrovani.

]semo[ napsal:
Zkusil sem použít float textury (na všechno co se dalo), ale zjistil sem, že float textury neumí některé karty filtrovat (opravte mě, jestli se pletu).

Od GF6 jde filtrovat float16 textura, na ATI az od HD2000, ale jsou tu dalsi moznosti. Na ATI jde od 9500 filtrovat 16bit fixed-point format, ktery je na vetsinu HDR-like veci dostatecny a pri reflexi (odrazech) je na normal mapy dokonce lepsi nez 8bit fixed-point. Akorat tady pozor - nVidia myslim neumi 16bit fixed-point RGBA, pouze RGB (tim RGB si nejsem jisty). Dale muzes bilinearni filtrovani naprogramovat v shaderu, jinymi slovy, napises si vlastni funkci na fetchovani textury, ktera bude pouzivat tu puvodni. Kod takove funkce najdes treba v paperu Radeon X1000 Series Programming Guide, strana 9 (viz ATI SDK). Da se to aplikovat na vsechny SM2.0 karty.

]semo[ napsal:
Má někdo z vás nějaký nápad jak dosáhnout větší přesnosti s obyčejnou 24-32bit texturou? Jsou to 4 Byty, stejně jako float, jen nevím, jak v shaderu přetypovat na float r g b a [0..1]. A stejně by to bylo asi k ničemu.

8bit fixed-point RGB jde prepocitat na jeden 24bit fixed-point, coz ma o 1 bit vetsi presnost jak float s konstantnim exponentem bez znamenka. Prevod float->R8G8B8 a naopak je celkem snadny. V takovem pripade ale nemuzes pouzit standardni filtrovani, protoze ti to tam nadela paseku. Potrebujes to filtrovat jako 24bit fixed-point a ne jako 8bit po slozkach, takze zase musis filtrovat v shaderu. Tohle reseni mi prislo pekne debilni, ale kdybys chtel, muzu poslat zdrojaky tech shaderu. Taky se to kdysi resilo na gamedev.net.
_________________
AMD Open Source Graphics Driver Developer


Naposledy upravil Marek dne 13. září 2007, 21:52:29, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 13. září 2007, 10:00:03    Předmět: Odpovědět s citátem

Jeste me napadlo: Kdyztak omrkni to D3D demo, jaky se tam pouzivaji formaty textur a jaky se tam nastavuje sampler state. Neboj, D3D nekouse. Wink

EDIT: Po stazeni toho dema jsem si vzpomnel, ze presne tohle demo jsem kdysi pred lety zkousel, ale nijak zvlast jsem se do toho algoritmu neponoril. Wink
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 13. září 2007, 12:32:27    Předmět: Odpovědět s citátem

Eosie napsal:
Dale muzes bilinearni filtrovani naprogramovat v shaderu, jinymi slovy, napises si vlastni funkci na fetchovani textury, ktera bude pouzivat tu puvodni. ...


Tak přesně takhle to dopadlo! :) Našel sem to v jednom článku, kde popisujou vodu z Pacific Fighters.
Díky za rady, je vidět, že se vyznáš. Takovejhle přehled bych potřeboval. Smekám!
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 13. září 2007, 12:51:01    Předmět: Odpovědět s citátem

Hehe dik. Wink

Pred prectenim tveho prispevku jsem trochu zkouknul zdrojaky toho dema, tak to tady hodim:
Pouziva se tam 16bit fixed-point format A16B16G16R16, tzn. na nVidii to jaksi nepujde (u G80 si nejsem jistej). Pro nVidii tam pouziva ten softwarovy noisemaker.

A jeste rypava poznamka od Mema z irc. Wink
kód:
[13:38]   Memik: Eosie: ty voe nehon ego na tom foru, tam se diskutuje o nehoneni a ty takhle ;)
[13:39]   Eosie: Memik: kde zas? :)
[13:39]   Eosie: Memik: narazis na to, ze se snazim semosovi pomoct? ;)
[13:40]   Memik: Eosie: no kde asi, kde jsi dnes vyplodil elaborat s prehledem funkci GK podle verzi, podporou pixel formatu aby fungovalo filtrovani atd. ;)

_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 13. září 2007, 13:03:21    Předmět: Odpovědět s citátem

:-D
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna