Shadery su pokrocila renderovacia technika, ale tento tutorial som sa rozhodol napisat pre kazdeho, kto sa rozhodol len prave teraz do sveta GPU ponorit. Preto teraz uvediem definicie pojmov, ktore vam mozu byt nezname.
- VERTEX POSITION- ako som uz spomenul, vertex je nejaky vrchol 3d modelu, teda kocka ma napriklad 8 vertexov. Povedzme, ze mame 3d model kocky. vertex position je len informacia o suradniciach kazdeho jedneho vertexu. Z vertexu vsak vertex shader moze prijat dalsiu nemenje dolezitu informaciu....
- TEXTUROVE SURADNICE- model ma na sebe zvycajne texturu (v sucasnosti zvycajne 2 paralelne). Texturove suradnice vertexu su 2d suradnice tohto vertexu v samotnej texture (obrazku).Teda vertexy A,B,C a D na obrazku
maju nasledovne suradnice v pouzitej texture
vertexy C a B maju rovnake texturove suradnice, vsimnite si ze pri vertexi C v 3d modely je rovnake okienko ako u B. Takto sa vlastne definuje sposob "natiahnuta" textury na 3d model.
Tak toto su vsetky 2 esencialne vstupne parametre pre vertex shader. Vertex shader vsak do svojho vstupu berie vertex pozicie iba zo smotneho suroveho suboru 3d modelu na disku, cize su to suradnice vertexov "relativne naseba", suradnice budu rovnake aj vtedy ked budeme kocku otacat alebo posuvat alebo zvacsovat.Hovorime o zakladnom, tzv. OBJECT priestore.
Pre nas je nezmyselne pocytat kazdy frame nieco co sa nemeni. Na to aby sme mohli ziskat suradnice vertexov aj v inych priestoroch, nez OBJECT priestore, musime vertexove suradnice vynasobit tzv. TRANSFORMACNOU MATICOU tychto priestorov. Tieto priestory su tri, WORLD priestor, VIEW priestor a posledny, PROJECTION priestor, co je 2d priestor vasej obrazovky.Tieto tri matice vam vas 3d engine, nech uz pouzivate akykolvek, musi vediet vratit kedykolvek. V dalsich kapitolach budem ako 3d engine pouzivat engine Irrlicht, ako ziskat semanticke matice v DirectX alebo OpenGL si uz zistite pripadne sami. Takze podme napisat prvy vertex shader:
float4x4 matWorld;
float4x4 matWorldViewProjection;
struct VS_INPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
};
VS_OUTPUT vertexMain( VS_INPUT Input )
{
VS_OUTPUT Output;
Output.Position =
mul( Input.Position,matWorldViewProjection );
Output.Texcoord = Input.Texcoord;
return( Output );
}
na zaciatku mame 2 premenne typu float4x4 co su matice 4x4 float cisel.
- Prva ma meno matWorld, ta je z hladiska semantiky matica WORLD priestoru(vo vertex shaderi navidiet co je to za matica, tu mu kazdy frame odovzdava konkretny 3d engine v tzv "call backu", cize funkcii co sa vola kazdy frame a odovzdava informacie vertex shaderu, po pripade aj pixel shaderu, o tom neskor) .
- Druha matica, matWorldViewProjection, je matica vsetkych troch priestorov, cize matica co vznikla vynasobenim WORLD matica * VIEW matica * PROJECTION matica. Ak touto maticou vynasobime nejaky vertex, posunieme ho rovno do priestoru obrazovky.
- Ak chceme vertex mat napriklad v priestore kamery (vzhladom na kameru, teda pozorovatela) vynasobime ho maticou ktora vznikne vynasobenim WORLD matica * VIEW matica. Ak chceme mat vertex iba v priestore v ktorom sme (cize vo svete), vynasobime ho maticou WORLD priamo. Na nasledujucom obrazku je znazornene, do akych priestorov sa posuva vertex pri nasobeni
v nasledujucej tabulke je prehlad "vybudovania" matic:
ToProjection = WORLD * VIEW * PROJECTION | matica ToProjection posunie object vertex rovno do projekcie
ToView = WORLD * VIEW | matica ToView posunie object vertex rovno do kamera priestoru
ToWorld = WORLD | matica ToWorld posunie object vertex rovno do sveta
- Tieto matice sa konstruuju vami v call backu, az samotne vysledky nasobeni odovzdate shaderu. Kod HLSL shaderu pokracuje
struct VS_INPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
};
vidime ze structury VS_INPUT a VS_OUTPUT sa zhoduju. Mozu a nemusia. V structure VS_INPUT vidime premenne, ktore si vertex shader zoberie proste sam na zaciatku, nemusite mu ich davat v callbacku.
- Prva polozka je typu POSITION0, co su spomenute VERTEXOVE SURADNICE v object priestore.
- Druha polozka je typu TEXCOORD0, co su TEXTUROVE SURADNICE vertexu v texture 1. Ak by ste chceli suradnice v druhej texture, pouzili by ste typ TEXCOORD1 (na tretiu texturu TEXCOORD2).
Struktura VS_OUTPUT je vystup vertex shaderu, a zaroven vstup do pixel shaderu. Preco sa teda zhoduju? vertex shader totiz transformuje vertexy 3d modelu do nasich potrebnych priestorov, kde sa nase veci pohybuju, vdaka maticiam matWorld a matWorldViewProjection. Podme sa teda pozriet, co sa deje v tele main funkcie vertex shaderu...
VS_OUTPUT vertexMain( VS_INPUT Input )
{
VS_OUTPUT Output;
.... tu sa zastavme, vidime ze funkcia vertexMain je typu VS_OUTPUT, cize vracia tuto strukturu, a ako parameter si berie Input co je premenna nasho typu VS_INPUT . Dalej nasleduje VS_OUTPUT Output; co je vytvorenie vystupnej struktury, tu naplnime transformavanymi parametrami a vratime z funkcie von . Pokracujme.....
Output.Position = mul( Input.Position,matWorldViewProjection );
Output.Texcoord = Input.Texcoord;
.....polozka Position nasej vystupnej struktury Output sa rovna suradniciam vertexu v priestore obrazovky.Tieto suradnice sme dostali vynasobenim ojektovych suradnic Input.Position s maticou matWorldViewProjection, nasobenie vykonala funkcia mul() (multiply-vynasob). Polozka Texcoord nasej vystupnej struktury Output sa rovna povodnym suradniciam Input.Texcoord. Texturove suradnice sa transformovat nemusia, pretoze sa nemenia nikdy. Struktura Output je hotova a uz len ju vratime a ukoncime vertex shader....
return( Output );
}
v tomoto bode sme sa dostali, so vsetkym transformovanym a pripravenim, pred Pixel shader.
Neviem, asi som to zle pochopil. Mne sa zda, ze na oznaceni vrcholov "A,B,C,D" by malo byt "B=D" a nie "B=C".
urcite nie, pozri sa lepsie
Hlboka omluva. Mas pravdu, je to spravne. Ono ide o smer textury a jej suradnice. Ja som si to premietal z prednej strany na zadnu plochu (ale to som nemal robit). Musim byt nabuduce pozornejsi ;-).
Inak sa tesim na kazde pokracovanie. Len tak dalej. A nech to ma aspon 50 lekcii :-)
paradicka! aj ked som do 3d este nesahal, paci sa mi to :) videl som ten jazyk raz pouzity v jednej rocnikovej praci :)
---
Riadit pracu programatorov je ako past macky.