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č
|
Zaslal: 12. září 2007, 17:37:31 Předmět: Generování normál mapy z heightmapy v GPU. |
|
|
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 |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 12. září 2007, 17:51:44 Předmět: |
|
|
a nevykresluju to v ortho tu mapu?? _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 12. září 2007, 17:55:12 Předmět: |
|
|
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 |
|
|
Crusty
Založen: 28. 08. 2007 Příspěvky: 120 Bydliště: Praha
|
|
Návrat nahoru |
|
|
Ondras
Založen: 12. 09. 2007 Příspěvky: 66
|
Zaslal: 12. září 2007, 18:44:26 Předmět: |
|
|
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 |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 13. září 2007, 08:01:11 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 13. září 2007, 09:52:20 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 13. září 2007, 10:00:03 Předmět: |
|
|
Jeste me napadlo: Kdyztak omrkni to D3D demo, jaky se tam pouzivaji formaty textur a jaky se tam nastavuje sampler state. Neboj, D3D nekouse.
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. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 13. září 2007, 12:32:27 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 13. září 2007, 12:51:01 Předmět: |
|
|
Hehe dik.
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.
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 |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
|
Návrat nahoru |
|
|
|