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

Uvod u pixel i vertex shadere

[es] :: 3D programiranje :: Uvod u pixel i vertex shadere

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Uvod u pixel i vertex shadere29.02.2004. u 06:04 - pre 245 meseci
Ne znam da li ovo nekoga interesuje, ali hteo sam da pocnem sa malom pricom o shaderima i HLSLu. Ukoliko ima zainteresovanih, mogu da nastavim da pisem o ovome i da zakacim neki sors.

Sta su shaderi?

Shaderi su programi koji se izvrsavaju na grafickoj kartici i obradjuju vertexe (temena trouglova koji se crtaju) i pixele. Shaderi su buducnost grafike u igrama, prakticno sve AAA igre koje su sada u razvoju koriste iskljucivo shadere. Kao i uvek, nove mogucnosti povlace sa sobom i nove probleme, ali zato nude grafiku koja je mnogo bolja od postojace.

Postoji nekoliko jezika u kojem je moguce pisati shadere, ja cu ovde pisati o HLSLu (high-level shading language), koji je deo Direct3Da.

Uzmimo za pocetak vertex shadere. Da bi se neki model iscrtao, potrebno je sve njegove vertexe pretvoriti iz model spacea u view space. To se radi tako sto se svako teme pomnozi sa world matricom, pa onda sa view matricom, i na kraju sa projection matricom.

Evo kako se to radi u HLSLu:

Code:

float4x4 matWorld : WORLD;
float4x4 matView : VIEW;
float4x4 matProjection : PROJECTION;


struct VSIN
{
    float4 pos : POSITION;
};

struct VSOUT
{
    float4 pos : POSITION;
};

VSOUT JednostavanShader(VSIN vin)
{
    VSOUT vout;

    vout.pos = mul(vin.pos,  matWorld);
    vout.pos = mul(vout.pos, matView);
    vout.pos = mul(vout.pos, matProjection);

    return vout;
}


Za pocetak treba da definisemo 3 matrice koje su nam neophodne. To su World, View, i Projection matrice. HLSL uvodi pojam 'semantike' koji sluzi da dodatno opise neku promenljivu. Prva promenljiva, matWorld, je tipa float4x4 (dakle 4 x 4 matrica) i nju vezujemo za WORLD semantiku. To znaci da ce programi koji podrzavaju semantike (kao sto je EffectEdit) automatski namestiti vrednost te matrice na trenutni world transform. Isto vazi i za ostale matrice, matView i matProjection.

Nakon toga treba da definisemo dve strukture koje ce sluziti kao ulaz i izlaz iz naseg vertex shadera. Obe strukture za sad izgledaju isto, posle cemo moci da ih nadogradimo. Ulaz u vertex shader je pozicija svakog temena, a to je jedan float4 (x, y, z, w). Izlaz je takodje to, ali naravno transformisano tako da se uzme u vid pozicija objekta u svetu (world transform), pozicija kamere (view transform) i projekcija na 2D ekran (projection transform). Ove vrednosti za ulaz bi mogli da uzmemo iz bilo kog fajla koji je snimljen iz nekog od 3D programa (Maya, 3DS). Primeticete da uz pomoc POSITION semantike oznacavamo da promenljiva pos treba da sadrzi poziciju temena.

Mozda ce nekima ubosti oci to sto je ulaz float4, umesto float3. Ako su dovoljne 3 koordinate da se opise svaka tacka, cemu onda sluzi w? Kratak odgovor je nicemu, a malo duzi odgovor je da bi ovaj shader bio sto jednostavniji, radicemo samo sa homogenim koordinatama. Ili, jednostavno receno, dovoljno je da se w postavi na 1. Naravno, shaderi uglavnom ne koriste homogone koordinate za ulaz, ali o tome cemo kasnije.

I sada ide sam shader. Shaderi u HLSLu se pisu kao funkcije u Cu: imaju povratnu vrednost (u nasem slucaju VSOUT) i ulazne argumente (VSIN). Sam shader je prilicno jednostavan, samo uzima ulaz, mnozi ga sa world matricom, pa onda sa view matricom, i na kraju sa projection matricom, i onda to vraca pomocu returna.

Dobro, i kako sada to radi?

Vrlo jednostavno: iz programa se ucita ovaj shader, namesti se pomocu SetVertexShader komande, pozove se BeginPass, iscrta ceo objekat kao sto se to inace radi, i onda se pozove EndPass.

Fenomenalno, a sta se time dobija? Dobija se nesto sto izgleda isto kao i sva grafika do sada, jer je ovo u stvari minimalni shader koji moze nesto da radi. Kasnije mozemo da nadogradimo druge stvari kao sto su teksture, osveltjenje, i neke druge specijalne efekte. Ali da ovaj tekst ne bi bio ovoliko suvoparan, evo jedne slike:



Prilicno neimpresivno, zar ne? :)
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.winn.dial.virgin.net



+4 Profil

icon Re: Uvod u pixel i vertex shadere29.02.2004. u 13:07 - pre 245 meseci
Nice one, ReljaM :)

Nedavno sam nabasao na 2 lepe knjizhice o shaderima, koje bih svima preporuchio :

1. "Real-time shader programming", Ron Fosner

Veoma detaljan uvod u shadere. Prvi deo knjige pokriva matematichku teoriju (narochito je interesantno poglavlje o teoriji boja i svetlosti) a drugi veoma detaljno objasnjava shadere. Dakle, sve je tu, od pochetka do kraja. Naravno, DirectX9 :)

2. "Learn Vertex and Pixel Shader programming with DirectX9", James C. Leiterman

Odlichna kao referenca. Nema teorije ni mnogo objasnjavanja, ali su sve funkcije tu, pobrojane.

Obe knjige se bave shaderima na mashinskim nivou :)
Naravno, imate ih na Amazon-u, pa ko bi krenuo da se bavi ovom oblashcu, ove 2 knjige su sve shto treba :)
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.vdial.verat.net

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Uvod u pixel i vertex shadere01.03.2004. u 13:29 - pre 245 meseci
Sve je to lepo ali ja i dalje ne znam sto su oni bolji od recimo klasicnog nacina tipa ucitam mesh i texture i ostale parametre napravim kompajliranu listu i smestim ju u graficku. Nemojte me krivo shvatiti ali jednostavno ne razumem se mnogo u shadere zato i pitam ovako :).
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.in-addr.btopenworld.com



+4 Profil

icon Re: Uvod u pixel i vertex shadere01.03.2004. u 13:56 - pre 245 meseci
:)
Well, i ja sam se to pitao, dok se nisam zainatio i seo da pogledam "what the fook is that all about!" (iako mi 3D nije opis posla)

Vredi, mnogo vishe nego na prvi pogled! :)
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: Uvod u pixel i vertex shadere02.03.2004. u 06:50 - pre 245 meseci
Dejane, pitanje ti je potpuno na mestu. Ono gore stvarno ne lici ni na sta, zato evo malo zanimljivijeg shadera koji radi efekat Phong osvetljenja. Phong osvetljenje se odlikuje po izrazenoj specular komponenti (to je ona bela fleka na mestima gde se svetlo najvise osijava) koja se pojavljuje bez obzira na geometriju objekta. Pre piksel shadera taj efekat jednostavno nije bio moguc.

Evo kako izgleda isti objekat izrendan sa Gouraud osvetljenjem (klasican nacin) i Phong osvetljenjem:


(Objekat je iscrtan bez tekstura da bi bilo jasnije o cemu se radi)

Sam shader je malo komplikovaniji. Ovog puta cemo iz vertex shadera da izvucemo poziciju svakog temena u world koordinatima (VSOUT.worldPos). To nam posle u pixel shaderu koristi da izracunamo ugao izmedju svakog piksela koji crtamo i pozicije svetla. Ostaje jos da se izracuna ugao izmedju svakog piksela i kamera, a za to koristimo VSOUT.viewPos, tj poziciju piksela u view koordinatama. Te dve vrednosti naravno moraju da se normalizuju da bi ostatak jednacine za osvetljenje radio kako treba.

Posle toga sledi standardno racunanje kolicine difuznog osvetljenja (dot(normala, lightDir)), kao i spekularnog osvetljenja (dot(normala, poluvektor) ^ 30).

Code:

struct VSOUT
{
    float4 pos      : POSITION;
    float3 worldPos : TEXCOORD7;
    float3 viewPos  : TEXCOORD6;
    float2 tex0     : TEXCOORD0;
    float3 norm     : TEXCOORD5;
};

VSOUT JednostavanShader(VSIN vin)
{
    VSOUT vout;
    float4x4 matWorldView;
    matWorldView = mul(matWorld, matView);

    vout.pos     = vin.pos;
    vout.pos     = mul(vout.pos, matWorld);
    vout.worldPos = vout.pos;
    vout.pos     = mul(vout.pos, matView);
    vout.viewPos = vout.pos;
    vout.pos     = mul(vout.pos, matProjection);
    vout.norm    = mul(vin.norm, matWorldView);
    vout.tex0    = vin.tex0;

    return vout;
}

float4 PhongShader(VSOUT vin) : COLOR0
{
    float3 outCol;
    float3 diffuse;
    float3 spec;
    float3 halfVec;
    float3 cameraDir;
    float3 lightDir;

    lightDir = lightPos - vin.worldPos;

    cameraDir = normalize(-vin.viewPos);
    lightDir = normalize(lightDir);
    vin.norm = normalize(vin.norm);

    diffuse = dot(vin.norm, lightDir);
    halfVec = normalize((lightDir + cameraDir) / 2);
    spec = dot(halfVec, vin.norm);
    spec = pow(spec, 30);

    outCol = diffuse * 0.4 + spec * 0.9;

    return float4(outCol, 1);
}


Medjutim, ima i interesantnijih stvari koje je moguce uraditi sa shaderima, recimo efekat prezasicenja od jakih svetlosnih izvora (eksplozije, rakete, laser, itd.). U novim igrama ovaj efekat se pojavljuje prakticno svuda jer je jako impresivan kada se koristi prava grafika, a ne ovaj nesrecan cajnik:



Sors + EXE + objasnjenje za ovaj efekat sam postavio u ovoj temi: http://www.elitesecurity.org/tema/32351
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.vdial.verat.net

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Uvod u pixel i vertex shadere02.03.2004. u 20:34 - pre 245 meseci
Dao si mi lep potstrek da pogledam malo te "novine" ipak posto sam ja nekako vezan za openGL zbog portabilnosti naleteo sam na ovo

http://www.opengl.org/documentation/oglsl.html
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.sbb.co.yu



Profil

icon Re: Uvod u pixel i vertex shadere08.03.2004. u 19:03 - pre 245 meseci
Da bi malo bolje shvatili cemu sluze potrudicu se da jednostavno objasnim...
Postoje dve vrste shadera ili programa, vertex i pixel (zove se jos i fragment).

Vertex shader je program koji pise programer, a izvrsava ga graficka kartica za svaki
vertex koji se prosledi kartici. Kada programer napise vertex program i izvrsi sve
neophodne pripreme da bi ga kartica izvrsila, zapocinje crtanje primitive.

Izlaz iz vertex programa je pozicija vertexa i jos neki atributi (boja, texcoords, ...).

Fragment program takodje pise programer i izvrsava sa za svaki pixel pre nego sto
kartica smesti rezultujucu boju u framebuffer. Izlaz iz fragment programa je rezultujuca boja pixela i ekranska dubina pixela (zbuffera).

Primer:

Code:

glBegin(GL_TRIANGLES);
 glVertex3f(...);
 glVertex3f(...);
 glVertex3f(...);
glEnd();


Za svaki glVertex poziv kartica izvrsava zadani vertex program. Posle izvrsena 3
poziva, kartica je dobila dovoljno informacija za iscrtavanje primitive (u nasem
slucaju trougao), i zapocinje proces rasterizacije.

Rasterizacija je iscrtavanje primitive red po red. Za svaki red na ekranu kartica racuna
poziciju prvog i zadnjeg pixela u jednoj horizontalnoj liniji (redu) na ekranu.
Sada, za svaki pixel u toj liniji kartica poziva pixel (fragment) program ciji je zadatak
da "smucka" rezultujucu boju i rezultat preda kartici kako bi doticni pixel dobio svoju
boju.

Primer:
Code:

Vertex shader/program:

uniform float scale;
void main(void)
{
    // pomeri vertex po njegovoj normali za neki koeficijent scale
    vec4 temp = gl_Vertex + gl_Normal*scale;

    // transformisi vertex temp preko proizvode modelview i projection matrice.
    gl_Position     = gl_ModelViewProjectionMatrix * temp;
}


Pixel/fragment program:

void main(void)
{
    gl_FragColor = gl_Color;
}


Programi mogu imati i parametre za izvrsavanje. U primeru sam naveo jedan parametar
scale. Parametri su konstante koje programer salje kartici i na taj nacin utice
na rezultat rada programa. U primeru se modifikovanjem parametra scale model
koji se salje kartici "udeblja" ili "smrsa" u zavisnosti da li je scale vece ili manje od 0.

Prednost ovog programa je ocigledna, jer programer nemora da menja geometriju
koju iscrtava da bi postigao efekat koji zeli.

Primer koji sam naveo zahteva kartice novije generacije (ATI 9700, nVidia FX ili
3dLabs Wildcat VP). Primeri su napisani koriscenjem OpenGL shading language (GLSL).
Specifikaciju jezika mozete naci na www.opengl.org.

Za one koji zele da uce da programiraju u GLSL preporucujem da pogledaju
ShaderDesigner na www.typhoonlabs.com

yooyo
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.sbb.co.yu



Profil

icon Re: Uvod u pixel i vertex shadere08.03.2004. u 22:18 - pre 245 meseci
Jos jedna sitnica... GLSL je deo OpenGL 2.0 implementacije, ali su proizvodjaci
hw-a odlucili da ga ipak ubace u OpenGL 1.5. Za sada jedino 3dLabs Wildcat VP
oficijelno podrzava GLSL. ATI i nVidia imaju ovu implementaciju u svojim driverima
za sada u beta fazi. ATI, pocev od drajvera Catalyst 4.1 podrzava GLSL, a nVidia
pocev od Forceware 56.55. Za nVidiu je potreban jos i jedan registry patch
koji bi omogucio GLSL:
Code:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation\Global\OpenGL]

[HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation\Global\OpenGL\Debug]
"ShaderObjects"=dword:00000001
"WriteProgramObjectAssembly"=dword:00000000


nVidia beta drivere mozete naci na www.guru3d.com. Ofocijelni drajveri se ocekuju
ovih dana.

Ipak, ako ne zelite da se petljate sa beta verzijama, postoje extenzije
ARB_vertex_program i ARB_fragment_program, pomocu kojih mozete
da programirate shadere u "univerzalnom" asembleru za graficke kartice.

yooyo
 
Odgovor na temu

bkaradzic
Branimir Karadžić
ArenaNet
Seattle, WA

Član broj: 14953
Poruke: 1630
*.jaleco.com

Sajt: https://github.com/bkarad..


+11 Profil

icon Re: Uvod u pixel i vertex shadere11.03.2004. u 01:31 - pre 245 meseci
Citat:
NastyBoy:
1. "Real-time shader programming", Ron Fosner
2. "Learn Vertex and Pixel Shader programming with DirectX9", James C. Leiterman


Ja bih za HLSL preporucio:

The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics
by Randima Fernando, Mark J. Kilgard

Takodje uskoro izlazi:

GPU Gems : Programming Techniques, Tips and Tricks for Real-Time Graphics
by Randima Fernando

Branimir

 
Odgovor na temu

bkaradzic
Branimir Karadžić
ArenaNet
Seattle, WA

Član broj: 14953
Poruke: 1630
*.jaleco.com

Sajt: https://github.com/bkarad..


+11 Profil

icon Re: Uvod u pixel i vertex shadere11.03.2004. u 01:46 - pre 245 meseci
Citat:
Dejan Lozanovic:
Sve je to lepo ali ja i dalje ne znam sto su oni bolji od recimo klasicnog nacina tipa ucitam mesh i texture i ostale parametre napravim kompajliranu listu i smestim ju u graficku. Nemojte me krivo shvatiti ali jednostavno ne razumem se mnogo u shadere zato i pitam ovako :).


Pa na novijem hardware-u sve ide preko vertex i pixel shadera bez obzira da li se odlucis za fixed pipeline ili ne. Fixed pipeline ti prakticno daje manji set mogucnosti i previse je generalizovan pa da je vrlo moguce da se proizvodjaci hardwarea nisu previse trudili oko optimizacije (jedini razlog zasto jos uvek postoji je kompatibilnost sa starim sistemom). Znaci ako se odlucis za stari metod, tj. fixed pipeline moguce je da u startu gubis na perfromansama. Takodje koriscenjem vertex shadera prenosis taj rad sa CPU na GPU, tj. imas vise CPU snage da koristis za naprednu AI ili fiziku. Ovaj koncept ce biti jos vazniji u buducnosti sa DX10 i novom generacijom konzola.

Branimir

 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: Uvod u pixel i vertex shadere11.03.2004. u 08:01 - pre 245 meseci
U principu stvar se svodi na ovo: ako stvarno pises nesto sto ce da se prodaje u narednih 6 meseci, onda ok, treba da podrzis i fixed function pipeline. Ali ako radis stvari 'za dusu' i/ili zato sto zelis da naucis vise o 3D grafici, onda nemoj da se zamaras FFPom, nego kreni da radis sa shaderima.

Jako malo ljudi u industriji ima luksuz da moze sebi da priusti (ne finansijski, naravno!) da se bavi iskljucivo novim stvarima. Ako vec nemas ogranicenje od marketing departmenta da moras da podrzavas GeForce2 MX, onda barem eksperimentisi sa najnovijom tehnologijom - sigurno ce ti biti zabavnije, a i ulazes u znanje koje ce ti duze trajati.
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.vdial.verat.net

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Uvod u pixel i vertex shadere11.03.2004. u 13:25 - pre 245 meseci
Citat:
Reljam:
Jako malo ljudi u industriji ima luksuz da moze sebi da priusti (ne finansijski, naravno!) da se bavi iskljucivo novim stvarima. Ako vec nemas ogranicenje od marketing departmenta da moras da podrzavas GeForce2 MX, onda barem eksperimentisi sa najnovijom tehnologijom - sigurno ce ti biti zabavnije, a i ulazes u znanje koje ce ti duze trajati.

Pa ja sebe mogu da ubrojim u te (ne)srecne vlasnike geforce 2 :), tako da na zalost ne mogu da isprobam sve te stvarcice valjano :(, nego jel mogu da pitam sta je sa kompajliranim listama, da li i one prolaze kroz shader-e(primera radi znam da glScale*() utice na dimenzije). Posto koliko vidim razlika u performansama je poprilicna ako se koriste display liste umesto direktnog iscrtavanja u frame buffer.
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: Uvod u pixel i vertex shadere11.03.2004. u 17:07 - pre 245 meseci
Ja sam se zadnji put bavio OpenGLom daaavno, i tada nije bilo shadera, ali sam prilicno siguran da i kompajlirane liste prolaze kroz shadere. Nadam se da ce neko ko se vise razume u OpenGL da me ispravi ako sam lupio.

Sto se tice graficke kartice - necu da te ubedjujem da je menjas, ali cisto da znas da recimo Radeon 9600 SE potpuno podrzava shadere 2.0, cak je i relativno brz, ima 128 MB, TV out i da kosta ~$70. Cisto da znas da ne pricam ovde o monstrumima od $400. Naravno, ti najbolje sam znas sta te interesuje a sta ne, i gde zelis da potrosis pare. Ponavljam, ovo sam samo hteo da napomenem da bi i ostali znali da jake kartice nisu mnogo skupe - to se cesto desava, i ljudi zbog toga ni ne pocinju da se bave grafikom.
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.vdial.verat.net

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Uvod u pixel i vertex shadere11.03.2004. u 18:59 - pre 245 meseci
Citat:
Reljam:
Ja sam se zadnji put bavio OpenGLom daaavno, i tada nije bilo shadera, ali sam prilicno siguran da i kompajlirane liste prolaze kroz shadere. Nadam se da ce neko ko se vise razume u OpenGL da me ispravi ako sam lupio.

Verovatno je u pitanju ista prica.

Citat:

Sto se tice graficke kartice - necu da te ubedjujem da je menjas, ali cisto da znas da recimo Radeon 9600 SE potpuno podrzava shadere 2.0, cak je i relativno brz, ima 128 MB, TV out i da kosta ~$70. Cisto da znas da ne pricam ovde o monstrumima od $400. Naravno, ti najbolje sam znas sta te interesuje a sta ne, i gde zelis da potrosis pare. Ponavljam, ovo sam samo hteo da napomenem da bi i ostali znali da jake kartice nisu mnogo skupe - to se cesto desava, i ljudi zbog toga ni ne pocinju da se bave grafikom.


Sve ja to znam ali u principu ja treba celo kuciste da promenim, jer imam nekog bajatog celerona na 433 MHz.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.winn.dial.virgin.net



+4 Profil

icon Re: Uvod u pixel i vertex shadere13.03.2004. u 01:31 - pre 245 meseci
Koliko se secam (ako nisam u pravu nek me neko ispravi) sa vertex-shaderima (ne i sa pixel-sh) mozhesh da se igrash i na GeForce2. Drajveri imaju emu-layer koji ce shader odraditi na CPU. Nije brzo, ali za vezhbu mozhe da prodje.
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.sbb.co.yu



Profil

icon Re: Uvod u pixel i vertex shadere17.03.2004. u 12:19 - pre 244 meseci
Posetite ovaj link:
http://www.clockworkcoders.com/oglsl/index.html

Ima dobar tutorial za GLSL.

yooyo
 
Odgovor na temu

[es] :: 3D programiranje :: Uvod u pixel i vertex shadere

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

Postavi temu Odgovori

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