[ Filip Strugar @ 28.05.2006. 00:54 ] @
Da pitam, mozda neko zna, zanimljiva tema:

Kako stoji trenutno stanje u gamedev-u, koristili li se deferred rendering, koliko, kako se hendluju problemi bandwidtha, transparencije, anti-aliasinga itd - kako se ponasa u 'stvarnosti', koja su predvidjanja za buducnost?

evo da ubacim i link koji objasnjava deferred shading: http://www.beyond3d.com/articles/deflight/, sigurno ima i boljih.
[ yooyo @ 28.05.2006. 11:33 ] @
U zadnje vreme se zanimam oko deferred lightinga. Ima dosta prednosti i mana...
- Ima smisla samo ako se koristi za unified lighting, tj. jedan shader za sve.
- Kvalitetniji rendering. Moze se koristiti mnogo vise svetala u sceni i za svako svetlo racunati perpixel lighting.
- Lighting racunica se koristi samo na onim pixelima gde treba. Postoji trik za mala svetla, tako da se u stencil buffer ucrta maska pixela koji su osevtljeni sa izvorom svetla. U sledecem pass-u, ako fragment prezivi stencil test izracunaj lighing.
- Sto se senki tice, kompatibilan je sa Shadow Volumes i sa Shadow Mapping-om
- Kompatibilan je sa HDR renderingom
- Dozvoljava geometriju sa vecim brojem poligona/vertexa u odnosu na klasican rendering i smanjuje opterecenje vertex pipeline-a
- Ne radi u MSAA modovima!
- Trazi veliki mem-bw zbog fat buffera.
- Moze se implementorati i na SM2.0 hw-u. Cak i na GeForce 5x00 FX seriji... inace potrebna je podrska za Multi Render Target ili Multi Element Texture.
- Transparentni objekti se nemogu renderovati ovom tehnikom. Moraju se renderovati na klasican nacin. Ukratko... sve sto se upisuje u z-buffer moze da se renderuje sa ovom tehnikom.
- Mislim da bi super "legao" na unified shader architecture.
- Koristi se u Gear of War (Unreal 3 engine) na XBOX360 i u STALKER-u. Procitaj interview sa Tim Sweeney na nvNews-u


Ima odlican clanak u GPU Gems-2, prezentacija na nvdeveloper sajtu (6800_Leagues_Deferred_Shading.pdf) i demo u NVSDK 9.5.

Moj plan je da primenim sledecu formulu razbijenu na vise pass-ova koriscenjem deferred renderinga.

final_color = (ambinet + lights*shadow)*texture + specular*gloss*lights*shadow + emmisive
texture je u stvari difuzna komponenta.
light*shadow je boja svetla * 0 ili 1 (u zavisnosti od senke)

U fat buffer bi stavio texturu, poxel_pos.xyz, normalu.xyz, gloss, materialID na sledeci nacin:
MRT:
pos.xyzw -> RGBA16f
nrm.xyz + matID -> RGBA16f
texture.rgb+gloss-> RGBA16f

MET: jedna rgba32f textura... samo za gffx 5x00 seriju
O.x = pack_2half(vec2(pos.x, pos.y));
O.y = pack_2half(vec2(pos.z, pos.w));
O.z = pack_4byte(nrm + matID);
O.w = pack_4byte(texture + gloss);


materialID je float 0..1 koji je 3. koordinata u 3d lookup texturi (N dot L, N dot H, matID). 3D textura je Alpha8-Luminance8 i cuva difuznu i spekularnu komponentu. Menjanjem matID lako se bira "izgled" materijala.

Rendering bi izgledao:
1. Ambient pass
2. FAT pass (renderuje se u fat buffer pos.xyz, nrm.xyz, diffuse.rgb (tj. texture), gloss, materialID
3. Za svako svetlo:
- Ako baca senke onda:
* renderovati shadow mapu (moze i unwrap cube map za omnidirectional light)
* renderovati screen aligned quad i izracunati diffuzni deo u jedan buffer i specularni u drugi buffer
- Ako ne baca senke
* izracunati stencil masku osvetljenih pixela
* renderovati screen aligned quad i izracunati diffuzni deo u jedan buffer i specularni u drugi buffer

Sada imamo ambient u backbuffer-u, diffuzno osvetljenje u offscreen bufferu, specular u offscreen buffer i texture u FAT-u

5. Renderovati screen aligned quad koji ce izvrsiti kombinovanje:
(ambinet + diffuse) * texture + specular
6. renderovati objekte sa emmisive osobinom additivno na scenu

Ako jos neko ima neku ideju, bilo bi lepo da iznese svoje misljenje. Deferred shading je za sada i dalje experimentalna tehnika i moguce je nekim trikovima ubrzati celu stvar.

yooyo
[ Filip Strugar @ 29.05.2006. 06:18 ] @
Citat:
- Lighting racunica se koristi samo na onim pixelima gde treba. Postoji trik za mala svetla, tako da se u stencil buffer ucrta maska pixela koji su osevtljeni sa izvorom svetla. U sledecem pass-u, ako fragment prezivi stencil test izracunaj lighing.


El koristis onaj bounding volume (convex mesh, front-face-culling) koji obuhvata domet svetla?

Ne razumem cemu stencil, ako imas taj volume zar ti Z-test ne ubije automatski nevidljive pixele?

Hm cekaj, imas neki komplikovaniji algoritam za masking?

Citat:
- Mislim da bi super "legao" na unified shader architecture.


A sta mislis o tome u kom pravcu ide razvoj hardvera: ako bude isplativo koristiti branching u pixel shaderu, onda ces moci i na standardnim rendering tehnikama da koristis neki unified shader za vise svetla bez multiple overdraw-a?

Citat:
- Koristi se u Gear of War (Unreal 3 engine) na XBOX360 i u STALKER-u. Procitaj interview sa Tim Sweeney na nvNews-u


Bas gledam neke gamere kako kukaju po forumima jer im se ne dopada kako Ghost Recon Advanced Warfighter izgleda, zato sto nema AA... :)

Citat:
pos.xyzw -> RGBA16f


Cemu ti sluzi 'w' komponenta?

Citat:
materialID je float 0..1 koji je 3. koordinata u 3d lookup texturi (N dot L, N dot H, matID). 3D textura je Alpha8-Luminance8 i cuva difuznu i spekularnu komponentu. Menjanjem matID lako se bira "izgled" materijala.


Hm, ne razumem, a sta koristis za x i y za lookput texture sampling? Ne razumem bas sta tacno lookup texture sadrzi.

Citat:
O.w = pack_4byte(texture + gloss);


Ovog pack-a nema u HLSL-u :D


Video sam u nekom clanku da koriste 8bit/4channel texture da ustede bandwidth, imali su objasnjenje za to kako da se sto je moguce bolje zadrzi precision - ne mogu sad da nadjem taj clanak :(


Citat:
Ako jos neko ima neku ideju, bilo bi lepo da iznese svoje misljenje. Deferred shading je za sada i dalje experimentalna tehnika i moguce je nekim trikovima ubrzati celu stvar.


Hvala tebi na ovoliko detalja!!
Kad budem imao nesto pametno da napisem ocekuj poruku! :)

[Ovu poruku je menjao Filip Strugar dana 29.05.2006. u 10:43 GMT+1]
[ yooyo @ 29.05.2006. 10:10 ] @
Citat:
El koristis onaj bounding volume (convex mesh, front-face-culling) koji obuhvata domet svetla?

Ne razumem cemu stencil, ako imas taj volume zar ti Z-test ne ubije automatski nevidljive pixele?
Hm cekaj, imas neki komplikovaniji algoritam za masking?

Pogledaj stranu 16 i 17 dokumenta http://developer.nvidia.com/ob..._leagues_deferred_shading.html

Citat:
Bas gledam neke gamere kako kukaju po forumima jer im se ne dopada kako Ghost Recon Advanced Warfighter izgleda, zato sto nema AA... :)


To su bre razmazena decurlija. Pa sta ako nema AA... Nek igraju na TV-u... Sto me nerviraju takvi likovi koji tripuju da ako nema AA onda je igra/hw s*****.

Citat:
Cemu ti sluzi 'w' komponenta?


Za sada je 1.0f, ali moze da se iskoristi za npr.. ambient occlusion. E, zato sam hteo da se jos neko ukljuci pa da smislimo dobar format fat buffera.

Citat:
Hm, ne razumem, a sta koristis za x i y za lookput texture sampling? Ne razumem bas sta tacno lookup texture sadrzi.


Da, znam... nisam dobro opisao taj trik sa 3d texturom. Svaki materijal ima difuznu i spekularnu komponentu. Difuzna je manje vise uvek ista, a spekularna se menja u zavisnosti os shininess faktora, tj. stepena cosinusa ugla N dot H (ili R dot V). Ja sam preracunao sve vrednosti u 3d texturu, tako da xyz koordinate racunam na sledeci nacin:
x = N dot L
y = N dot H
z = materialID

Sada odradim 3dlookup i odmah dobijem u Alpha8 spekularnu komponentu a u Luminance8 dobijem difuznu komponentu.... Nema stepenovanja u shaderu :) Texura moze biti mala... 64x128x8...

Textura se pravi na sledeci nacin:
Code:

    typedef struct tagA8L8
    {
        unsigned char l;
        unsigned char a;
    } tA8L8;

        // N.L, N.H, matID
        tA8L8* data = new tA8L8[width * height * depth];
        int oneline = width;
        int onelayer = width * height;

        {
            for (int z=0; z<depth; z++)
            {
                float fz = (float)z/(float)(depth-1);

                for (int y=0; y<height; y++)
                {
                    float fy = (float)y/(float)(height-1);

                    for (int x=0; x<width; x++)
                    {
                        float fx = (float)x/(float)(width-1);
                        
                        float dif =  fx ;
                        float spec = pow(fy, (float)fz*64.0f + 1.0f);

                        int addr = z * onelayer + y*oneline + x;
                        data[addr].l = (unsigned char)(dif * 255.99f);
                        data[addr].a = (unsigned char)(spec * 255.99f);
                    }
                }
            }
        }



Citat:
O.w = pack_4byte(texture + gloss);


To ti treba samo na GF FX 5x00 seriji... Inace... ta func postoji u CG-u, tako da neko treba da MS-u izvuce usi jer su opet ispali paceri... Zezam se... moze to da se izracuna sa mnozenjem sa koeficijentima, samo imace extra pack/unpack code u shaderima.

yooyo
[ Filip Strugar @ 29.05.2006. 16:21 ] @
Citat:


will do as soon as I get home!

Citat:
[/url]:
To su bre razmazena decurlija. Pa sta ako nema AA... Nek igraju na TV-u... Sto me nerviraju takvi likovi koji tripuju da ako nema AA onda je igra/hw s*****.


Pa oni kupuju igre, za njih se igre i prave, ko to ignorise ostace bez para pa moze posle da kuka kako su razmazeni kolko god hoce :)

A i sto mislis da su razmazeni - ja bih pre rekao prevareni - prvo ih loze da kupe najnovije graficke koje mogu da poteraju AA na velikim rezolucijama, a onda - cvrc, nema AA :)

Citat:

Za sada je 1.0f, ali moze da se iskoristi za npr.. ambient occlusion. E, zato sam hteo da se jos neko ukljuci pa da smislimo dobar format fat buffera.


Ja ti necu moci u skorije vreme pomoci jer na poslu radim neke druge engine stvari (animation system, collision detection, physics, player) a kod kuce radim na onom terenu pa mi ne ostaje vremena nizakakvo drugo programiranje :( Ovo me interesuje zbog toga sto na poslu koristimo deferred a imamo neke issues, pa gledam malo da se upoznam sa materijom...

Citat:

Da, znam... nisam dobro opisao taj trik sa 3d texturom. Svaki materijal ima difuznu i spekularnu komponentu. Difuzna je manje vise uvek ista, a spekularna se menja u zavisnosti os shininess faktora, tj. stepena cosinusa ugla N dot H (ili R dot V). Ja sam preracunao sve vrednosti u 3d texturu, tako da xyz koordinate racunam na sledeci nacin:


aaaaaAaa zatoo lookup, da se izbegne trig! A nemas ono da u texturi samog objekta imas posebno specular mapu?



Znaci kako otprilike izgleda tvoj G-buffer:

3 x 16bit 4channel:

1. )
x - position x
y - position y
z - position z
w - unused

2. )
x - norm x
y - norm y
z - norm z
w - matID

3. )
x - color r
y - color g
z - color b
w - gloss

Mogao bi normalu mozda da cuvas u samo x i y, a z da izvlacis iz neke 2d lookup texture, i ustedis jedan channel za nesto drugo? Mada cini mi se da je ovih 12 channela minimum?

Citat:
Inace... ta func postoji u CG-u, tako da neko treba da MS-u izvuce usi jer su opet ispali paceri... Zezam se...


Ne diraj M$! ;)


Btw, video sam da neki pokusavaju da rese AA tako sto prave shader koji blura na mestima gde je veliki depth difference.

A sta ako bi odradio geometry pass, deferred shading pass, i onda umesto da je iscrtas kao quad, tu output texturu zalepio na geometry u screen koordinatama (just position vertex shader, vrlo simple pixel shader) i tako je iscrtao? Dobices onaj hardverski AA. Samo je pitanje cene duplog iscrtavanja geometrije (ali kontam da nije previse jer ces je ionako iscrtati jos par puta za shadow mape, a i mozes mozda da koristis occlusion test iz prethodnog iscrtavanja?)
[ yooyo @ 29.05.2006. 23:13 ] @
Citat:
A i sto mislis da su razmazeni - ja bih pre rekao prevareni - prvo ih loze da kupe najnovije graficke koje mogu da poteraju AA na velikim rezolucijama, a onda - cvrc, nema AA :)


Razmazeni su... Inace... ti koji koji brinu o AA cine < 1% trzista... Ostali nemaju pojma sta je to i kako da ukljuce. Anywa... i sam si rekao.. depth edge filter pa blur preko toga i onda ih isfoliras da je to AAA (Advanced AA) :)

Citat:
Ovo me interesuje zbog toga sto na poslu koristimo deferred a imamo neke issues, pa gledam malo da se upoznam sa materijom...


Sta vas zeza (ako nije tajna)?

Citat:
A nemas ono da u texturi samog objekta imas posebno specular mapu?


Pa imam gloss mapu.. to mu dodje slicno.

Inace... pos.w u G bufferu (ili fat bufferu) moze da cuva ambient occlusion... eto. sad nije unused :)
Ima tu jos jedna fora... da se umesto pos.xyz cuva samo depth.. pa da se xyz rekonstruise u pixel shaderu (frag.x, frag.y, Gbuffer(x,y)) pa se to UnProjectuje i onda dobijes world xyz. Ovo mozes da koristis ako primetis da imas nepreciznost (jer su u prethodnom slucaju pos.xyz bili float16).

Citat:
A sta ako bi odradio geometry pass, deferred shading pass, i onda umesto da je iscrtas kao quad, tu output texturu zalepio na geometry u screen koordinatama (just position vertex shader, vrlo simple pixel shader) i tako je iscrtao? Dobices onaj hardverski AA. Samo je pitanje cene duplog iscrtavanja geometrije (ali kontam da nije previse jer ces je ionako iscrtati jos par puta za shadow mape, a i mozes mozda da koristis occlusion test iz prethodnog iscrtavanja?)


Hmm.. nije losa ideja... ali (ako se ne varam) u prvom passu si vec ostao bez AA. Drugi pass ti nece stvoriti izgubljene pixele. U stvari.. to ti dodje isto kao i da si renderovao screen aligned quad! Mozes da renerujes u 1.5 ili 2x vecoj rez pa da downsemplujes sa nekim pixel shaderom.

yooyo
[ Filip Strugar @ 30.05.2006. 08:50 ] @
Citat:
Hmm.. nije losa ideja... ali (ako se ne varam) u prvom passu si vec ostao bez AA. Drugi pass ti nece stvoriti izgubljene pixele. U stvari.. to ti dodje isto kao i da si renderovao screen aligned quad! Mozes da renerujes u 1.5 ili 2x vecoj rez pa da downsemplujes sa nekim pixel shaderom.


Mislis da je isto kao da rendas screen aligned quad, da ne bi dobio neki blur na ivicama? Mozda ako ofsetujes texturu za neku minimalnu vrednost i igras se sa samplingom? Morali bi da vidimo kako tacno FSAA sampluje - dal' bi dobio neki lerp izmedju vrednosti sa susednog z-different-trougla ili ne? Nemam pojma, bas me interesuje.
[ Filip Strugar @ 31.05.2006. 01:03 ] @
Citat:
Ima tu jos jedna fora... da se umesto pos.xyz cuva samo depth.. pa da se xyz rekonstruise u pixel shaderu (frag.x, frag.y, Gbuffer(x,y)) pa se to UnProjectuje i onda dobijes world xyz. Ovo mozes da koristis ako primetis da imas nepreciznost (jer su u prethodnom slucaju pos.xyz bili float16).


Koliko takve stvari ubijaju ps? Nemam osecaj koliko ps moze da izdrzi aritmetike?
[ yooyo @ 31.05.2006. 09:16 ] @
Citat:
Mislis da je isto kao da rendas screen aligned quad, da ne bi dobio neki blur na ivicama? Mozda ako ofsetujes texturu za neku minimalnu vrednost i igras se sa samplingom? Morali bi da vidimo kako tacno FSAA sampluje - dal' bi dobio neki lerp izmedju vrednosti sa susednog z-different-trougla ili ne? Nemam pojma, bas me interesuje.


FSAA je isto sto u SSAA, tj Super Sampling.. jednostavno, renderuje se u 2x ili 4x vecoj rezoluciji i hw to posle downsempluje. Takodje, tu postoji i problem AA u render targetu (neki hw to ne podrzava) ili filtering FP textura (opet.. to neko podrzava a neko ne).

Citat:
Koliko takve stvari ubijaju ps? Nemam osecaj koliko ps moze da izdrzi aritmetike?

Ne puno... mislim da je to svega par instrukcija. Evo jos jedne ideje...

Performance problem moze da bude u upisu u FAT (ili G) buffer. Ako je koristi float target onda je mem bandwidth ogroman. Trik je da se smanji mem bandwith na MRT hardweru. To moze koriscenjem klasicne RGBA 8bita buffere na sledeci nacin
RGBA8 -> enkodirani depth 32f
RGBA8 -> normala + ...
RGBA8 -> textura + ...

Ovo bi trebalo da bude brzo kao i klasican MRT sa 3 draw buffera.

U sledecem passu se koristi RGBA8 textura (enkodirani depth) zatim se napravi RGB32f ili RGB16f render target i ps za dekodovanje depth->XYZ i "konvertuje" se depth u xyz. Dalje ostaje isto... Na ovaj nacin bi trebalo da se ustedi na mem bw. Problem mozda moze da bude normala koja je 8-bit pa se mozda moze videti color banding na specular hl mestima. Treba probati....

Na kraju.. za stariji hw treba izmeriti brzinu rendera u FAT buffer i 3x rendering u obican buffer. Uz early z-test ovo bi mozda moglo da malo ubrza stvari.

yooyo
[ Filip Strugar @ 02.06.2006. 08:52 ] @
Citat:
FSAA je isto sto u SSAA, tj Super Sampling.. jednostavno, renderuje se u 2x ili 4x vecoj rezoluciji i hw to posle downsempluje. Takodje, tu postoji i problem AA u render targetu (neki hw to ne podrzava) ili filtering FP textura (opet.. to neko podrzava a neko ne).


Al sa deferred ti se u svakom slucaju ne isplati 2x-4x veci render target jer je i normalan najvise ogranicen brzinom pixel shader i bandwidthom. A onaj blur postprocessing za ivice je previse blurry koliko sam video :(

Citat:
U sledecem passu se koristi RGBA8 textura (enkodirani depth) zatim se napravi RGB32f ili RGB16f render target i ps za dekodovanje depth->XYZ i "konvertuje" se depth u xyz. Dalje ostaje isto... Na ovaj nacin bi trebalo da se ustedi na mem bw. Problem mozda moze da bude normala koja je 8-bit pa se mozda moze videti color banding na specular hl mestima. Treba probati....


da, treba probati. voleo bih da imam vremena za to.

Citat:
Na kraju.. za stariji hw treba izmeriti brzinu rendera u FAT buffer i 3x rendering u obican buffer. Uz early z-test ovo bi mozda moglo da malo ubrza stvari.


uf, koga briga za stariji hw ;)