[ glorius @ 15.04.2008. 13:19 ] @
Ne uzimajuci u obzir da danasnje kartice mogu da obradjuju veliki broj instrukcija u shader-ima, zanima me kako bi ste vi resili problem shadera sa vise svetala.
Npr, imamo 9 light source-a.

Sta je najbolje od sledecih tehnika:

- da se odradi multpass ( rendering 9 puta ) sa shaderom koji u sebi ima jedno svetlo ( ovo definitivno nije resenje ali jos uvek nisam siguran da li ga treba izbegavati )
- da se u shader stave svih 9 svetala ( ovo sa povecanjem instrukcija vise nije problem )
- da se u shaderu odradi proracun za 3 svetla i da imamo 3 rendering pass-a ( meni se ovo cini kao najbolje resenje, malo se komplikuje kod ali, kad se odradi algoritam sve moze biti ok )

Postoje li bolje tehnike?
[ tosa @ 16.04.2008. 02:29 ] @
Ja bih ti preporučio deferred shading: http://en.wikipedia.org/wiki/Deferred_shading

Kod ove tehnike se komponente koje koristiš za senčenje upisuju u MRT pa se na
kraju osenči cela scena u jednom prolazu - broj prolaza će zavisiti od broja svetala,
tj. da li možeš sva svetla da smestiš u konstante šejdera ili teksturu, u zavisnosti
od toga gde držiš parametre. Takođe mislim da ti broj instrukcija nije previše važan
jer ćeš senčenje raditi u petlji pa je i SM2.0 verovatno dovoljan za dosta toga.

Mane ove tehnike su otežan rad sa više različitih formula za osvetljenje,
dosta potrebne memorije za sve frejm bafere, rendering transparentnih objekata
je otežan i slično.
[ glorius @ 16.04.2008. 09:20 ] @
Hvala na odgovoru.

Da, radio sam sa deferred shading-om. Opet se tu postavlja pitanje, u Diffuse + Specular prolazu oko toga kako osmisliti optimalno renderovanje ( multipass + multilight PIXEL shader )

Mozda je najbolje videti koliko shader moze da izdrzi i u zavisnosti da li je 2.x, 3, 4, ( 5 :P ) model, postaviti optimalan broj svetala u shaderu.

Postoji li neki primer gde se to moze najbolje videti?

Evo jednog primera kako FarCry koristi neke tehnike za renderovanje (DX9)
http://ati.amd.com/developer/gdc/d3dtutorial08_farcryanddx9.pdf


[ tosa @ 16.04.2008. 09:51 ] @
Citat:
glorius: Hvala na odgovoru.

Da, radio sam sa deferred shading-om. Opet se tu postavlja pitanje, u Diffuse + Specular prolazu oko toga kako osmisliti optimalno renderovanje ( multipass + multilight PIXEL shader )

Ovo bi bio jedan od razloga zašto želim opet da vidim softverski rendering - previše cimanja oko
previše dostupnog hardvera. Čak i direkt iks 10 ne garantuje baš sve fičure svuda :(
Tvoj problem zavisi od potencijalnog rasporeda i broja svetala u sceni koju renderuješ
(nad ovim imaš delimičnu kontrolu u fazi dizajna) i kartice/šejder modela na kome
će to da se dešava (ako želiš da radi svuda - nemaš nikakvu kontrolu).
Srećno, mogao bi kasnije da podeliš svoja iskusva ovde, mnogo je nešto utihnuo forum :)
[ glorius @ 16.04.2008. 12:16 ] @
Hvala! Uglanom bi to bio sledeci scenario...

Odredjivanje svih svetlosnih izvora cije bounding sfere zahvataju trenutno vidljive poligone ( neki BSP sistem ). Verovatno ne bih imao potrebe za vise od 4-5 svetlosnih izvora u trenutku ali bi sigurno postojao neki exception ( npr. nekoliko eksplozija koje odaju svetlost + torch :) + prirodni izvori svetlosti ).

Verovatno bi enable-ovao vise izvora ako user ima bolju graficku itd...

A da, sto se tice featur-a i ovog prelaza sa DX9 na DX10 i postojanja raznih tehnika u zavisnosti od dostupnog hardvera, sve totalno zbunjuje... Treba pohvatati sve tehnika... ( samo za Instancing mislim da ima minimum 4... :P )

Ogranicicu se za sada na DirectX 9.0c... Shag'n'fur ce malo da saceka :)
[ glorius @ 16.04.2008. 16:48 ] @
OK. Mogla bi mala pomoc oko deferred renderinga. Najbolji izvor koji sam nasao je famozni PostProcess primer iz DirectX SDK. Naravno, to je samo postprocessing ali, koliko kapiram i deferred se izvodi na potpuno isti nacin.

Ono koliko ja kapiram je:

1. Renderovati scenu pomocu Ambient shader-a ( Emissive, ili kako je jos zovu, Glow tekstura + Ambient faktor materijala + Ambient faktor svakog svetla ) i to sacuvati u Ambient RT

2. Renderovati diffuse + specular komponente u sledeci RT ( da li ovo odraditi kao dva odvojena pass-a? ) Bloom koristi specular koliko sam skapirao.

3. Izvesti postprocessing ( Glow, HDR... ) ( Koriscenje gaussian blura, additivno dodavanje... )

PostProcessing primer koristi nekoliko RT...

Sve mi je ovo donekle jasno ali ne znam pravi nacin da odradim. Sta renderovati u glavni framebuffer, sta u RT tj., optimalni nacin kombinovanja ovih RT.
[ tosa @ 17.04.2008. 02:56 ] @
Raspoređivanje komponenti po RT-ovima je u zavisnosti od tvojih potreba, ali najčešće će ti trebati
normala (tri bajta dovoljna), pozicija u vrld spejsu ili samo Z pa sam rekonstruišeš u PS-u i informacije
o materijalima (spekular, difjuz i slično).

Ovaj članak je prilično detaljan: Photo-realistic Deferred Lighting
[ glorius @ 17.04.2008. 14:59 ] @
C# ali dobra polazna tacka...

http://www.catalinzima.com/?page_id=38
[ glorius @ 19.04.2008. 10:07 ] @
Deferred shading rocks :)))

Interesuju me neke stvarcice vezane za hardversku podrsku i tehnicke detalje. Moja graficka je nVidia GeForce NX8600GT 256

1. Zbunjuju me malo ovi formati RT-ova ( za position, normal, color, ... ) Na koji nacin determinisati prave formate ( Device CAPS checking? )

npr. ono sto sam ja uzeo: Position : D3DFMT_A16B16G16R16F
Normal : D3DFMT_A8R8G8B8
Diffuse Color: D3DFMT_A8R8G8B8

2. Kako da renderujem sa vise svetala. Posto se sve radi pomocu texture lookup-a, da li mogu da u glavnom programu napravim for petlju i aditivno 'nalepljujem', tako da mi je u shaderu samo jedno svetlo ( ovo je dobro zbog starijih grafickih )

3. Obuhvatanje veceg spektra grafickih: Evo kako ja shvatam nacin podesavanja renderinga od boljih ka losijim karticama

- Non Power Of 2 Render Targets, 4 RTs u GBuffer shaderu
- Power of 2 Render Targets, posebni pass-ovi za GBuffer ako graficka podrzava manje od 2, 3 ili 4 RT ( mada, ako podrzava 2 RT, onda moze 2 pass-a x 2 )
- Single pass Multilight
- Multipass Multilight :)

Izvinjavam se za ovaj post, jer sam sve ovo sam mogao da probam i naucim ali mislim da je diskusija u ovoj fazi istrazivanja Renderinga korisna.
[ Filip Strugar @ 19.04.2008. 12:18 ] @
Citat:
glorius: Deferred shading rocks :)))

Interesuju me neke stvarcice vezane za hardversku podrsku i tehnicke detalje. Moja graficka je nVidia GeForce NX8600GT 256

1. Zbunjuju me malo ovi formati RT-ova ( za position, normal, color, ... ) Na koji nacin determinisati prave formate ( Device CAPS checking? )

npr. ono sto sam ja uzeo: Position : D3DFMT_A16B16G16R16F
Normal : D3DFMT_A8R8G8B8
Diffuse Color: D3DFMT_A8R8G8B8

Vidi koji ti je minimum target hardware pa nadji na internetu koje RT formate podrzava i njih koristi. Postoje spiskovi kartica i CAPSova koje podrzavaju - samo ne mogu da se setim tacno gde sam to gledao. Naravno, sto manje memorije po pixelu koristis za taj G-buffer (ili kako vec ga zovu - ) to ce stvar biti brza.

Citat:
2. Kako da renderujem sa vise svetala. Posto se sve radi pomocu texture lookup-a, da li mogu da u glavnom programu napravim for petlju i aditivno 'nalepljujem', tako da mi je u shaderu samo jedno svetlo ( ovo je dobro zbog starijih grafickih )

Samo tako i mozes da radis - for petlja u lighting pass-u i za svako svetlo radis sledece: kao ulaz imas G-buffer i podatke o svetlu (pozicija, tip i tako to), a za izlaz sve zapisujes u lighting texturu (aditivno). Dobra optimizacija jeste da ne crtas ceo ekran za svako svetlo nego samo parcence koje svetlo pokriva ali o tome razmisljaj kad ti sve proradi.
Nakon toga tu light texturu 'zalepis' preko color buffera i - radost!
Pre toga mozes da primenis neki bloom efekat na light texturu ili sta god zelis..

Citat:
3. Obuhvatanje veceg spektra grafickih: Evo kako ja shvatam nacin podesavanja renderinga od boljih ka losijim karticama

- Non Power Of 2 Render Targets, 4 RTs u GBuffer shaderu
- Power of 2 Render Targets, posebni pass-ovi za GBuffer ako graficka podrzava manje od 2, 3 ili 4 RT ( mada, ako podrzava 2 RT, onda moze 2 pass-a x 2 )
- Single pass Multilight
- Multipass Multilight :)

Izvinjavam se za ovaj post, jer sam sve ovo sam mogao da probam i naucim ali mislim da je diskusija u ovoj fazi istrazivanja Renderinga korisna.

Sve zavisi od toga sta ti je target platforma i kakvog tipa ti je projekat... Moj predlog ti je da ne pravis nikakve razlicite varijante, nego uzmes najmanji zajednicki sadrzalac i radis za njega - inace ces se zakopati u milion varijanti i nikad neces nista zavrsiti :)

Nisam siguran da razumes tacno kako radi deferred rendering/shading posto pominjes 'single pass multilight' i 'multipass multilight'. :)

Treba da (uprosceno):
1.) Iscrtas celu vidljivu geometriju u g-buffer (BEZ ikakvih informacija o svetlima). Ispisujes: boju, poziciju (moze samo Z kako Tosha kaze), normalu, specular ako hoces i to je valjda to. To je prakticno nacin da konvertujes geometriju u teksturu. Dalje ti vise geometrija ne treba (osim za senke i slicno).
2.) Koriscenjem tog g-buffera (treba ti pozicija, normala, specular) prodjes svako svetlo (koje moze imati uticaja na vidljivu geometriju) i dodajes rezultat u light texturu - koja sadrzi kolicinu svetla sa svakog izvora.
3.) Spojis color informaciju iz g buffera i light texturu u konacni rezultat.


I da, deferred shading nije nikakav silver bullet - ono ima svoje prednosti i mane - ima smisla za slucajeve kada imas mnogo svetala i geometrije koja ti se preklapa i slicno - i mozda je laksi za izprogramirati i bolji za postprocessing. Ali ima i svojih mana jer razne stvari neces moci da uradis. Ne znam dal' postoje neke nove tehnike u toj oblasti ali poslednji put kad sam gledao alpha blending i anti aliasing nisu bili jednostavni za uraditi ako koristis deferred shading... (tojest, bili su manje vise nemoguci bez dodatnog velikog cimanja).


I, kad uradis nesto obavezno okaci demo :)
[ glorius @ 19.04.2008. 13:55 ] @
Sto se ove optimizacije za svetlo tice, verovatno mislis na Scissor rectangle?

Ovo ostalo sto sam spominjao Single Pass Multilight i Multipass je alternativa ako ne koristim deferred shading. Naravno, jos uvek ne razumem sve...
[ Filip Strugar @ 19.04.2008. 20:56 ] @
Citat:
glorius: Sto se ove optimizacije za svetlo tice, verovatno mislis na Scissor rectangle?

Da! Moze da bude i neki poligon - npr za spotlight i slicno!

Citat:
Ovo ostalo sto sam spominjao Single Pass Multilight i Multipass je alternativa ako ne koristim deferred shading. Naravno, jos uvek ne razumem sve...

A, sorry, nisam razumeo.

Evo i linka na jednu dobru diskusiju na tu temu:

http://www.gamedev.net/community/forums/topic.asp?topic_id=424979

Citat:
Deferred rendering:

Pros:
-VERY easy and simple to make, and can be made fairly fast.
-Very tight boundaries on what pixels the light volumes affect (i.e. not many pixels, if any, are wasted).
-Fairly geometric complexity-agnostic because you're only doing a single draw.
-Low amount of state changes
-One-time generation of reasonably complex perpixel data, e.g. calculation of normals for normal mapping, Fresnel specular coefficients, anisotropic filtering.
-Scales very nicely as number of lights increases

Cons:
-No hardware antialiasing.
-Fairly high memory cost, especially at higher resolutions.
-No hardware antialiasing.
-Difficult, but not impossible, to support a reasonably wide variety of materials.
-No hardware antialiasing.
-High initial cost of G-Buffer generation due to the large amount of data that must be generated. (the last pro above should be strongly noted in conjunction with this point)
-No hardware antialiasing.
-Very fillrate/memory-bandwidth intensive.
-No hardware antialiasing.
-[This is more of an anti-pro than a con...] If you're doing any kind of shadowing solution, the geometry complexity argument flies out the window.
-I'm not sure if I mentioned this or not, but there's also no hardware antialiasing.