Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Downsampling filter

[es] :: 3D programiranje :: Downsampling filter

[ Pregleda: 4449 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
109.93.44.*

ICQ: 208550327


+14 Profil

icon Downsampling filter08.01.2010. u 14:51 - pre 173 meseci
Gledao sam Postprocess example iz DirectX SDK-a da bih naucio da implementiram Bloom, Glow i ostale efekte.

Otprilike razumem postupak.

1. Renderujem scenu u Full Screen Render Target ( FSRT )
2. Downsamplujem ( npr. 4 puta ) tako sto koristim 4x manji RT od FSRT i renderujem ScreenQuad koji je 4x manji od Screen-a koristeci shader koji downsampluje ( na nacin koji nisam razumeo )

Dalje ide bluring i 'Upsampling' ali bih se fokusirao na 2. korak.

Ne mogu da nadjem neki primer koji malo jednostavnije objasnjava shader koji izvrsava Downsampling ( i uopste postupak ) pa bi mi pomoglo ako imate neke reference ili objasnjenje.
EOF
 
Odgovor na temu

tosa
上海, 中国

Član broj: 1811
Poruke: 1342
*.guerrilla-games.com.

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Downsampling filter08.01.2010. u 15:08 - pre 173 meseci
Najjednostavnije je da u shader-u pročitaš semplove koji ti trebaju i izračunaš srednju vrednost.
Pošto ti se mapira tačno 4 sempla (za običan box filter), to je skroz jednostavno.
Jedino moraš da obratiš pažnju kada radiš sa Z buffer-om jer tu srednja vrednost nema mnogo smisla.
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
93.87.118.*

ICQ: 208550327


+14 Profil

icon Re: Downsampling filter08.01.2010. u 15:26 - pre 173 meseci
Aha....
To, verovatno, vazi i za Upsampling? Razumem zasto ne bi vazilo za Z buffer.

Ok, ako sam dobro razumeo, shader bi izgledao ovako:

float4 color;

float val; // koliko bio ovo trebalo da bude?

color = tex2D( srcTex, float2( texCoord.x + val, texCoord.y ) );
color += tex2D( srcTex, float2( texCoord.x - val, texCoord.y ) );
color += tex2D( srcTex, float2( texCoord.x, texCoord.y + val) );
color += tex2D( srcTex, float2( texCoord.x, texCoord.y - val) );

color /= 4;
EOF
 
Odgovor na temu

tosa
上海, 中国

Član broj: 1811
Poruke: 1342
*.guerrilla-games.com.

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Downsampling filter08.01.2010. u 15:43 - pre 173 meseci
'val' bi bio float2 u suštini, gde bi .x komponenta bila 1/width render targeta a .y 1/height.

Onda su ti koordinate:
UV
UV + float2(val.x,0)
UV + float2(0,val.y)
UV + val
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
93.87.118.*

ICQ: 208550327


+14 Profil

icon Re: Downsampling filter08.01.2010. u 15:48 - pre 173 meseci
Ok, pogledacu malo Box filter da bih malo bolje razumeo.
Hvala na odgovoru :)
EOF
 
Odgovor na temu

Filip Strugar
Filip Strugar
UK

Član broj: 9871
Poruke: 383
*.zone7.bethere.co.uk.



+1 Profil

icon Re: Downsampling filter09.01.2010. u 00:03 - pre 173 meseci
I da, da dodam: nemas nikakav upsampling; ako radis blur/glow/slicne efekte, onda radis downsample, efekat, i onda to primenis preko ekrana, gde je to 'primenjivanje' samo po sebi upsampling, ali ne pravis nikakav dodatni buffer za tu namenu.

Za downsample na 1/4 manju teksturu (tojest sa dimenzijama 1/2 x 1/2 od pocetne) ti u sustini treba jedan korak koji se sastoji iz samo jednog sample-a ako koristis ugradjeni hardverski filter koji svaki GPU ima: samo treba da naciljas da samplujes izmedju 4 pixela i dobices blurovan po ceni 1 tex2D().

Isto tako za downsample na 1/16 manju teksturu (tojest sa dimenzijama 1/4 x 1/4 od pocetne): jedan korak, koristis ovaj filter sto ti je Tosa napisao i naciljas da sva 4 ciljaju u sredinu: tako dobijes average od 16 pixela.

Neke starije graficke ne mogu da rade hardverski filter na floating-point teksturama tako da sa njima moras da radis sve rucno (ako koristis floating point za HDR).

A inace, imas kod za sve to u DirectX SDK primerima, npr stari HDRLighting (iz 2003) ima bas sve te filtere (doduse u sporijim verzijama ali nije bitno), sve u jednom projektu!
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
93.87.118.*

ICQ: 208550327


+14 Profil

icon Re: Downsampling filter09.01.2010. u 13:10 - pre 173 meseci
Da da, ne postoji 'upsampling' kao poseban korak ( ne znam odakle mi to :) ) vec se blurovana tekstura nalepi preko cele scene.

Citat:
Za downsample na 1/4 manju teksturu (tojest sa dimenzijama 1/2 x 1/2 od pocetne) ti u sustini treba jedan korak koji se sastoji iz samo jednog sample-a ako koristis ugradjeni hardverski filter koji svaki GPU ima: samo treba da naciljas da samplujes izmedju 4 pixela i dobices blurovan po ceni 1 tex2D().


Nisam najbolje razumeo ovo oko ugradjenog hardverskog filtera i ovo ciljanje :)

Koliko mi se cini, downsamplovanje je slicno blurovanju. Kada se procesira pixel on dobija average vrednost svih okolnih piksela. Da li tako da shvatim downsampling ili postoji drugacije objasnjenje?
EOF
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Downsampling filter09.01.2010. u 17:16 - pre 173 meseci
Hmmm....hajde da pokusam da vam objasnim tu pricu oko downsampling-a:

Generalno, resampling je procedura koja se primenjuje kako bi se signal (zvuk, slika, itd)
semplovan jednom finocom (rezolucijom) prebacio na sistem druge finoce (rezolucije).

Par intuitivnih primera:

Tri digitalne kamere slikaju isti predeo, rezolucije su 1.2 MPixel, 3.1 MPixela, 10 MPixela. Iako sve
tri slikaju isti predeo, razlikuju se po tome kroz kakvo sito i reseto interno propustaju svetlo.
Istu jedinicu prostora ce kamera od 1.2 MPixela da prikaze na 640x480 pixela, ova sa 3.1 MP
sa 2048x1536, itd...

Resampling je pokusaj da se slika zabelezena jednom rezolucijom prilagodi drugoj rezoluciji, a
da slika vizuelno ostane ista (ili priblizno ista).

Upsampling je prebacivanje signala nize finoce na visu finocu.

Downsampling je prebacivanje slike sa vise finoce na nizu finocu.

Posmatrajmo promenu intenziteta svetla jedne linije slike (potpuno primenljivo i na mono audio signal) :


Po prirodi stvari, prelazak sa nize finoce na visu je prilicno lak. Obrnuto, medjutim, ima svojih
zamki. Zamisli da pokusavas da objasnis prostu stvar malom detetu, ili prostom i neobrazovanom
coveku. Neke stvari mozes da im objasnis priblizno, medjutim, neke malo tananije stvari ne samo da
ne mozes lako, nego upadas u situaciju da budes pogresno shvacen. Da bi se izbeglo da te neke
tananije stvari unesu zabunu u naivnu psihu deteta ili prostu psihu laika, te neke stvari se moraju
eliminisati.

Apsolutno ista stvar je kod downsamplinga - ako imas sliku (ili audio snimak) snimljenu vecom
rezolucijom, i hoces da je prebacis na manju rezoluciju, prvo sto mora da se uradi je filtriranje
slike pri cemu se najfiniji detalji eliminisu, a ostavljaju oni manje fini. Ovo se u teoriji zove
antialiasing filtering. U principu to je low-pass filtriranje koje pusta sve ispod neke ucestanosti
koja je tacno 0.5 od ucestanosti te manje rezolucije, a ime antialising je dobilo zbog namene
(anti-zbunjivanje ili anti-pogresno interpretiranje).



Tu odprilike prestaju razlike izmedju upsampling-a i downsampling-a. Ostatak algoritma je neka
vrsta interpolacije - tj. pokusaja da se na osnovu nekih susednih vrednosti semplova 'pogodi', tj.
napravi procena (estimate) kakva bi bila vrednost sempla u nekom medju-trenutku:



[Ovu poruku je menjao milanche dana 09.01.2010. u 18:53 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Downsampling filter09.01.2010. u 17:31 - pre 173 meseci
Downsampling ima i svoj ekvivalent u psihologiji coveka, gde se zove sublimacija, tj. vestina
svodjenja komplikovanog na prosto.

Ta sposobnost je najizrazenija kod karikaturista koji u par prostih linija znaju da ubedljivo i upecatljivo
predstave kompleksne detalje kako fizickih tako i karakternih crta licnosti.

Bez sublimacije nema ni umetnika, najpre kompozitora, muzicara, a takodje ne ni pesnika, ni filozofa.

Nazalost, ni politicara.

Duga tema...
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
93.87.118.*

ICQ: 208550327


+14 Profil

icon Re: Downsampling filter09.01.2010. u 18:11 - pre 173 meseci
Ok, hvala.

Znaci, ako hocu da umanjim sliku a da ona ne izgubi na originalnom prikazu moracu da uradim sledece:

* * *
* * * -> *
* * *

Bukvalno receno, od ovih 9 piksela treba napraviti jedan tako sto saberem vrednosti boja svakog piksela i podelim brojem piksela da bih dobio srednju vrednost.

Tosa mi je objasnio sledece:

Citat:


'val' bi bio float2 u suštini, gde bi .x komponenta bila 1/width render targeta a .y 1/height.

Onda su ti koordinate:
UV
UV + float2(val.x,0)
UV + float2(0,val.y)
UV + val



Ovde se ne uzimaju svi okolni pikseli tako da se moja teorija ne slaze sa ovom. Ili je ovo brzi nacin za downsampling?
EOF
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Downsampling filter09.01.2010. u 19:30 - pre 173 meseci
Citat:
Bukvalno receno, od ovih 9 piksela treba napraviti jedan tako sto saberem vrednosti boja svakog piksela i podelim brojem piksela da bih dobio srednju vrednost.


U principu - da. Medjutim, bar teorijski ne sasvim.

To sto si opisao je onaj drugi deo algoritma: interpolacija, tj. procena neke medjuvrednosti
samplova (pixel-a) na osnovu okolnih.

Pre toga, medjutim, mora da se uradi filtriranje slike da se uklone detalji cija ucestanost
menjanja izmice finoci 9 puta proredjenije rezolucije slike, pa moze da ispadne sasvim
pogresno na novoj slici.

Znaci:

- prvo se originalna slika smooth-uje do neke mere (koja se tacno moze proracunati
prema Nyquist-ovom kriterijumu).

- posle smooth-ovanja se uradi to sto si opisao - taj jedan rezultantni piksel se proceni
na bazi vrednosti devet originalnih okolnih piksela. U principu, mozes u racunicu da ukljucis
i vise od tih devet originalnih piksela ciji doprinos proceni srednje vrednosti ide po nekoj
tezinskoj funkciji (najblizi pikseli sa faktorom recimo 0.9, oni dalji sa 0.4, itd...)

U praksi, medjutim, uzimanjem veceg broja okolnih piksela u obzir po nekoj tezinskoj
funkciji (recimo sin(x)) i racunanjem srednje vrednosti, postoji verovatnoca da ces postici isti
efekat kao da si sliku prvo filtrirao jer je low-pass filtriranje u principu usrednjavanje, pa su
dobre sanse da ce krajnji rezultat biti zadovoljavajuci, lisen artifakata aliasing-a.


[Ovu poruku je menjao milanche dana 09.01.2010. u 21:03 GMT+1]
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
93.87.118.*

ICQ: 208550327


+14 Profil

icon Re: Downsampling filter09.01.2010. u 20:55 - pre 173 meseci
Evo kako Postprocess primer iz DirectX SDK funkcionise:

Shader:

Code:


float2 PixelCoordsDownFilter[16] =
{
    { 1.5,  -1.5 },
    { 1.5,  -0.5 },
    { 1.5,   0.5 },
    { 1.5,   1.5 },

    { 0.5,  -1.5 },
    { 0.5,  -0.5 },
    { 0.5,   0.5 },
    { 0.5,   1.5 },

    {-0.5,  -1.5 },
    {-0.5,  -0.5 },
    {-0.5,   0.5 },
    {-0.5,   1.5 },

    {-1.5,  -1.5 },
    {-1.5,  -0.5 },
    {-1.5,   0.5 },
    {-1.5,   1.5 },
};

float4 DownFilter( in float2 Tex : TEXCOORD0 ) : COLOR0
{
    float4 Color = 0;

    for (int i = 0; i < 16; i++)
    {
        Color += tex2D( g_samSrcColor, Tex + TexelCoordsDownFilter[i].xy );
    }

    return Color / 16;
}




imamo dva array-a: PixelCoordsDownFilter koji je definisan u shaderu i TexelCoordsDownFilter koji se proracunava u programu tako sto se svaka vrednost PixelCoordsDownFilter deli sa width i height ekrana ( kao sto je Tosa naglasio ) tako da se dobijaju neke vrednosti reda -0.01 - 0.01.

Iskoristicu postojeci kod jer sam video da to radi OK u primeru ali, nazalost, bez nekog veceg razumevanja sta se ovde desava jer ovde nema Smooting koraka koji je spomenut u prethodnom odgovoru.
EOF
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Downsampling filter09.01.2010. u 23:15 - pre 173 meseci
Interpolacija (tj. usrednjavanje) je po prirodi low-pass filtriranje, zato sto uzima kao ulaz
zivlje promene, a daje kao rezultat neku srednju vrednost koja se mirnije menja.

Bitan trik je da se tezinska funkcija interpoliranja (u ovom primeru verovatno PixelCoordsDownFilter)
moze odabrati prema posebnim kriterijumima (DSP), tako da ce puko interpoliranje ujedno doneti
i eliminaciju visih frekvencija a potpuno ocuvanje amplitude nizih. Dakle, u istom koraku se uradi i
low-pass filterovanje i dobra procena vrednosti medju-piksela.

Ovde mi lici da je to u pitanju.
 
Odgovor na temu

Filip Strugar
Filip Strugar
UK

Član broj: 9871
Poruke: 383
*.zone7.bethere.co.uk.



+1 Profil

icon Re: Downsampling filter10.01.2010. u 01:34 - pre 173 meseci
Samo da uprostim/pojasnim par sitnica vezanih direktno za DirectX:

U idealnom slucaju za blur/bloom/glow/slicne filtere ne moras da downsamplujes - dovoljno je da uradis blur i primenis ga preko screen teksture. To se ne radi u praksi jer je blur (i ostali efekti) spor, pa posto ionako nema potrebe za detaljima (jer blur-ujes) onda se ta screen tekstura downsampluje, i obradjuje u manjoj rezoluciji, da bi se na kraju primenila na screen teksturu.

To je, dakle, razlog downsample-ovanja u ovom slucaju.

Ako hoces da downsamplujes texturu velicine 512x512 u 256x256, jasno je, na primer, da se jedan pixel u manjoj teksturi nalazi na mestu (pokriva) 4 pixela u vecoj teksturi. Najprostiji nacin da to uradis je da koristis pomenuti Box filter kojim jednostavno izracunas srednju vrednost ta 4 pixela i to je vrednost downsample-ovanog pixela.

To znaci da treba da uzmes 4 susedna pixela (9 ako downsamplujes na 1/3 x 1/3, ili 16 ako downsamplujes na 1/4 x 1/4, itd) i izracunas njihovu srednju vrednost.

E sad, kao sto vec znas uzimanje boje sa odredjenih koordinata texture se u pixel shaderu zove 'sampling', i radi se sa tex2D i slicnim funkcijama.

U najprostijoj varijatni toj funkciji prosledjujes UV koordinate koje se nalaze u opsegu [0,1] i odredjuju koji pixel (ili pixele, kasnije o tome) sa teksture zelis dobiti. Te [0,1] koordinate se zovu normalizovane koordinate jer ne zavise od rezolucije teksture: ako zamenis teksturu vecom ili manjom koordinate i dalje ostaju iste.

Formula za izracunavanje UV koordinata pixela u teksturi (texela) je: U = (TX+0.5) / SirinaTeksture); (V = (TY+0.5) / VisinaTeksture.

Na primer, UV koordinate texela [33, 77] u teksturi od 128x128 su [33.5/128, 77.5/128] tj [0.26171875, 0.60546875]. (Tih dodatih 0.5 izgleda zbunjujuce, detalje imas u 'Directly Mapping Texels to Pixels (Direct3D 9)' clanku u DirectX dokumentaciji, ali bitno je znati za taj detalj).


E sad, da objasnim funkciju iz DirectX Postprocess primera koju si naveo:

Ta funkcija downsampluje teksturu na 16 puta manju (tj sa 4 puta manjom sirinom i visinom, na primer sa 512x512 na 128x128). To radi tako sto sempluje 16 texela i vadi srednju vrednost - najprostiji moguci downsampling filter. Dakle, ne postoji nikakva tezinska funkcija koju milanche pominje - samo prosta srednja vrednost (sve tezine su jednake).

float2 PixelCoordsDownFilter[16] je offset potreban za sempling tih 16 texela iz nekog UV-a (in float2 Tex) koji DownFilter() dobija. Taj UV je centar texela u maloj teksturi, a kad iskoristis onu gore navedenu funkciju da iz njega izracunas centre 16 texela koje on pokriva dobices da su oni jednaki tom Tex plus svaki od ovih offseta iz PixelCoordsDownFilter.

To je otprilike celo objasnjenje.


Da celu stvar malo zakomplikujem i objasnim na sta sam mislio (ovo ti nije potrebno, pa ignorisi za sada ako je zbunjujuce) - tex2D zapravo radi na sampleru koji pored teksture sadrzi jos par informacija. Sampler je DirectX objekat koji objasnjava kako zelis da se tekstura sample-uje. On ima 5-6 parametara koji se mogu namestiti iz HLSL effect shadera ili iz DirectX koda (ako ne koristis effects) - predlazem da procitas o ovome detaljnije u dokumentaciji. Parametar koji je nama trenutno zanimljiv je D3DSAMP_MINFILTER/D3DSAMP_MAGFILTER definise kako ce se tex2D ponasati ako prosledis UV koordinate koje nisu tacno u centru pixela. U nasem konkretnom downsampling slucaju ako postavis D3DSAMP_MAGFILTER na D3DTEXF_LINEAR, i potrefis UV koordinate koje su tacno na sredini izmedju 4 pixela, dobices njihovu srednju vrednost (D3DTEXF_LINEAR govori tex2D-u da vrati interpoliranu vrednost izmedju 4 pixela gde UV pogodi). To mozes iskoristiti da 4 puta ubrzas downsampling jer ti za downsampling na 1/2x1/2 treba samo jedan tex2D umesto 4, ili za downsampling na 1/4x1/4 samo 4 tex2D umesto 16. Ali, kao sto rekoh, ignorisi ovo za sada jer ima jos par zackoljica.

Ne znam na ste 'smoothing' odnosi (na blur?), ali HDRLighting primer iz SDK-a ima sve detalje cini mi se.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Downsampling filter10.01.2010. u 06:22 - pre 173 meseci
Citat:
Ne znam na ste 'smoothing' odnosi (na blur?), ali HDRLighting primer iz SDK-a ima sve detalje cini mi se.


Smoothing = blur
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
109.93.0.*

ICQ: 208550327


+14 Profil

icon Re: Downsampling filter30.01.2010. u 17:49 - pre 172 meseci
Ok, hvala na odgovorima.
Uspeo sam da napravim u svojoj aplikaciji postprocessing 'pipeline' koji radi na nacin prikazan u Postprocess primeru iz DirectX SDK-a ali sam klase dizajnirao da budu lakse za dodavanje novih postprocess efekata, tj. automatizovao sam proces tako da je sada moguce dodavati razne postprocess efekte.


EOF
 
Odgovor na temu

[es] :: 3D programiranje :: Downsampling filter

[ Pregleda: 4449 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.