Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 31. leden 2010, 18:36:44 Předmět: GeoMipMapping |
|
|
Aktuálně se chystám implemtovat geomipmapping do svého terénu. Jen bych rád věděl, že jsem systém pochopil dobře
1) Mám vytvořeny jednotlivé chunky (využívám je v quadTree Cullingu) - takže např. terén dělený na 16 x 16 dílů (terén je 257 x 257)
2) pro bloky blíže kamery zvolím větší LOD -> určím vzdálenost středu chunku od kamery
3) asi bych si pro každý LOD udělal vlastní Index Buffer (IB) a kreslil podle příslušného IB
Aktuálně mám systém udělaný tak, že přepínám draw cally podle chunk. Tzn. že jeden chunk vykreslím jedním draw callem. Takže mám IB naplněný nikoliv po řádcích, ale speciálně si přepočítávám pozice indexů podle chunků.
4) Nějakým způsobem vyřešit praskliny mezi LODy - a tady mám trochu problém Napadlo mě třeba dynamicky upravit obsah Vertex Bufferu (VB), nebo změnit IB pro menší z LODů.. ovšem popravdě tady mám trochu mezeru ve stylu implementace.
Pozn: Pracuji s DirectX 9 |
|
Návrat nahoru |
|
 |
johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 1. únor 2010, 11:05:06 Předmět: |
|
|
GeoMipMapping jsem delal takze napisu par postrehu.
Ad 1,2,3) Tohle mam vsechno stejne.
Ad 4) S timhle jsou fakt problemy, takze...
Rekneme, ze si definuju pro aplikaci maximalni LOD 4. Pak pro kazdy blok mam 5 IB ktere poslu na kartu, plus jeden sdileny IB(v pameti) ktery slouzi pro reseni okraju.
Do tech 5 IB predpocitam indexy tak, ze pri danem LODu vynecham vzdycky krajni vrcholy. Tohle je vsechno preprocessing.
Sdileny IB pak plnim pri vykreslovani podle aktualniho stavu. Je dulezite, ze kazdy blok vedle sebe muze mit ruzne LODy takze nejaky predpocitani by nebylo prilis realizovatelne.
Pred vykreslenim zjistim jake LODy maji sousedi aktualniho bloku a vygeneruju indexy do sdileneho IB.
Nevyhoda je, ze na kazdy blok vychazi 2 draw cally.
Jeste se to da usporit tak, ze pokud blok vedle sebe nema rozdilne LODy tak ho vykreslit na jeden draw call(coz muzeme protoze nevznikaji zadny diry).
Ad dalsi veci)
pokud budes pouzivat per vertex nebo per pixel osvetleni tak narazis pri zmene urovne LODu na dost viditelny zmeny(coz je pochopitelny).
Jediny zpusob jak se mi to podarilo vyresit bylo pouziti jedne velke normal mapy pro cely teren. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. únor 2010, 12:27:21 Předmět: |
|
|
citace: |
Pak pro kazdy blok mam 5 IB ktere poslu na kartu, plus jeden sdileny IB(v pameti) ktery slouzi pro reseni okraju.
|
Proč máš pro každý blok 5 IB ? Já jsem to myslel tak, že bych měl globálně 4 IB pro celý terén (por tvůj LOD 4 => 1LOD = 1IB).
Ad ty díry... to mi napadalo taky řešit takhle. Ale zase ten "šicí" IB může být preprocesingový, ne ? Vygeneruju si do nej jenom spojovací pruhy mezi LODy, takže bude i poměrně malý. Např. pro 16x16 bloky bude mít LOD 1 to 2 vel 16 x 1; LOD 2 to 3 stejně; 3 to 4, 1 to 3; 1 to 4; 2 to 4 a tím možnosti přechodů končí... |
|
Návrat nahoru |
|
 |
johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 1. únor 2010, 14:17:36 Předmět: |
|
|
Jo sorry s tema IB jsem to blbe napsal, je to pro cely teren.
Ted kdyz na tim premyslim tak ten preprocessing by mel jit taky vpohode, uz si ani nevzpominam proc jsem ho zavrhnul. |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 2. únor 2010, 10:56:00 Předmět: |
|
|
Taky jsem to programoval, použil jsem pro jeden LOD chunku vždy 1 centrální buffer index buffer a pak několik adaptujících ("šicích"), který uměly z LODu N adaptovat na LOD N+1. Nedávno jsem nad tim všim uvažoval a dneska bych to asi udělal jinak. Předpočítal bych pro každý lod všechny kombinace index bufferů a tak bych mohl kreslit každý chunk jednim drawcallem. Jen by se z nějaký matice zvolil ten správný index buffer. Takhle surově by to bylo náročný na paměť, ale dalo by se razantně optimalizovat:
1) zavést pravidlo, že LOD N se může adaptovat pouze na N+1 a N+2 (nebo jen N+1)
2) použít 16 bit a 8 bit integery
3) Zkomprimovat index buffery nějakou vlastní velmi jednoduchou kompresí, která vychází ze znalosti dat. Například centrální neměnná (neadaptující) část bufferu může být uložena parametricky. V případě požadavku na určitý index buffer, by se tento mohl rozkomprimovat (např. paralelně, nebo po částech přes několik snímků) a se spožděním použít. 1-5 framy zpoždění nevadí. Rozbalené buffery by zůstaly v nějaký cache. Předpokládám, že v praxi nebude potřeba mít stále všechny IB zobrazené.
Tenhle bod 3 bych zavedl až v případě nouze.
EDIT: a samozřejmě 4) použít triangle stripy _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 2. únor 2010, 12:44:00 Předmět: |
|
|
Jaký může být výkonostní rozdíl mezi Stripy a Listy ? Zatím mám Listy, ale co jsem zkoušel kreslit, tak jsem zásadní neviděl (ale možná to bylo jenom tím, že jsem kreslil málo věcí) |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 2. únor 2010, 13:27:37 Předmět: |
|
|
V tomto případě výkonostní ne, ale ušetříš tu paměť pro index buffery. Kdysi to prý šetřilo i výkon, protože se transformovalo míň vertexů, ale dneska zůstanou ty poslední ztransformovaný vertexy v cache, takže rozdíl neni (máš-li ty stejný vertexy v bufferu * nějak rozumně blízko u sebe).
Pasáž o výkonu ber s rezervou, moc jsem o tom nečetl.
EDIT: *chtěl sem říct indexy odkazující se na stejný vertex _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 2. únor 2010, 14:30:32 Předmět: |
|
|
Napadlo mě to "šití" udělat takhle
Budu potřebovat navíc 1IB pro "šicí stroj". Přičemž se bude vždy usekávat z většího LOD (takže LOD 1 se vykreslí celý a v LOD2 se nahradí 1. řádka a sloupec šicím)
Přikláním se spíš k volbě b), protože nepotřebuju ten "šicí roh", ale nevím jak bude vypadat výsledek |
|
Návrat nahoru |
|
 |
johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 2. únor 2010, 15:10:09 Předmět: |
|
|
Tohle mi prijde moc komplikovany, jednodussi je urcite "sit" z vrcholu v bloku s vyssim detailem.
Mam to nejak takhle
 |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 2. únor 2010, 15:59:55 Předmět: |
|
|
A já zas takhle :-)
Nechci vnucovat, ale máš pak krásně oddělený ty adaptivní a centrální buffery. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 2. únor 2010, 16:50:03 Předmět: |
|
|
citace: |
Tohle mi prijde moc komplikovany, jednodussi je urcite "sit" z vrcholu v bloku s vyssim detailem.
|
Co konkrétně myslíš tím "tohle"
Semo: Tvoje řešení mi taky pak napadlo a asi bude lepší než moje A nebo B
EDIT: Když jsem o tom ještě popřemýšlel, tak se mi zdá jako nejefektivnější moje B) ... protože musím upravovat pouze na kříži a chunky bokem mě nezajímají.
EDIT 2: Ještě to zkouším urychlit omezením draw callu...tzn, ze si qsortem radim chunky a pak kreslím najednou treba 3 (se stejnym LODem), co lezi za sebou. Jaký je nárust výkonu je ovšem otázka.
EDIT 3: Použít styl Semo, ale s tím, že se šití prostě skipne... vygeneruju ten další LOD už postranách s šicími pruhy (na krajích mezi 2 LODy bude vždy LOD 1). Sice se tím ztratí "část" výkonu, protože se bude kreslit více trianglu, než je potřeba, ale zase klesne počet draw callů, popř. IB |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 9. únor 2010, 12:43:45 Předmět: |
|
|
Takže nakonec jsem zvolil "kompromisní řešení" poskládané ze všeho možného
Nepotřebuju žádné "šicí" pásy, za cenu že generuju více trianglů na přechodu mezi 2 LODY (aka. mezi 2 LODy je vždy pás s kvalitou přibližně LOD 0). Generování indexů je poměrně snadné, jednoduchá rekurze.
Možná to není nejrychlejší řešení, ale odpadl problém s řešením šicích pásů (kdy bych musel na vykreslení volat více drawcallů, nebo mít více IB, nebo mít dynamické IB). Napotřebuju také informace o sousednícj LODech. Další výhodu vidím v tom, že LOD 12 klidně může sousedit s LODem 2 a nikde nebudou trhliny a nemusí se starat o N pásů.
Před vykreslením si chunky, které mi vrátí QuadTree qucik sortem seřadím podle LODu abych eliminoval přepínání IB a pak kreslím.
možná vylepšení:
1) Seřadit nejenm podle LODu, ale i podle sousednosti, abych na jeden draw-call mohl vykreslit třeba 3 za sebou ležící díly.
2) Pokud mám 3/4 terénu placku, snížit v rámci LODu počet trianglů tak, že "sloučím" triangly se stejnou výškou a vznikne mi místo např. 4 malých 1 velký
3) Místo QuadTree použít OctTree a uřezat i to, co je třeba za kopce a tudíž není vidět. Quad mi řeže jen na frustrum.
Případnou kritiku prosím směřovat do tohoto topicu  |
|
Návrat nahoru |
|
 |
|