játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5448
FZoli:    4892
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2520

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2188
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1625
syam:    1491
Shaderek használata DarkBASIC Pro-ban - II. rész: Per-pixel lighting 2006.10.23 06:29


Miért van szükség más módszer használatára?

A vertex-lighting sajnos nem mindig ad megfelelő eredményeket komplexen bevilágított helyszinek, vagy erős fények esetén, főként nem, ha low-poly modellekkel dolgozunk. Ennek az eljárásnak a lényege, hogy a modellre ható fényeket csak a vertexek pontjaiban számolja ki, a vertexeket összekötő triangle-ken pedig pixelenként interpolálással számol. Tehát egyetlen háromszög esetén csak a csúcspontokban van pontos, megvilágításra vonatkozó eredményünk, a háromszög felületének fényviszonyait a három csúcspont alapján átlagolja.

Nézzük meg a következő példaprogramot!

Kód:
backdrop on
color backdrop 0

set ambient light 0

sync on
sync rate 30

autocam off
position camera 0,0,0

make object plain 1,400,300
position object 1,0,0,300
color object 1,rgb(90,90,120)

make light 1
set point light 1,0,0,200
set light range 1,250

do
position light 1,light position x(1)+mousemovex(),light position y(1)-mousemovey(),200

sync
loop

A programban az egérrel irányíthatunk egy pont tipusú fényforrást, mely egy lapra irányul. Jól látszik a vertex-lighting hibája.



Nézzük meg ugyanezt a programot per-pixel lightinggal! Ehhez elsőként szükségünk lesz az ehhez tartozó .fx fájlra, mely a cikksorozat I. részében említett shader csomagban is megtalálható ( / 2 - Objects - Lighting19 / Per Pixel lighting (Evolved) (SM1.4) & (SM2.0) könyvtár), vagy letölthetitek innen. Tegyük a fájlt a kódunkkal egy könyvtárba.

Érdemes tanulmányozás céljából megnyitni ezt a shadert mondjuk jegyzettömbbel. Láthatjuk hogy szöveges fájlról van szó, a szerző szerencsére ellátta annyi kommenttel hogy mi is átláthassuk, és az elején láthatunk egy olyan részt hogy TWEAKS. Az itt lévő változókat mi magunk is módosíthatjuk DBP alól, és fogjuk is, hiszen ezek a változók írják le pl. a fények erejét, pozícióját és szinét. Ezeken kívül az .fx fájlban másra nem lesz szükségünk, elég hát ennyit megjegyezni ;)

Az előző példát kicsit átjavítva, íme az immáron shaderrel dolgozó és a megvilágításhoz per-pixel lightingot használó kódunk:

Kód:
backdrop on
color backdrop 0

sync on
sync rate 30

autocam off
position camera 0,0,0

make object plain 1,400,300
position object 1,0,0,300

color object 1,rgb(90,90,120)
load effect "PixelLighting.fx",1,0
set object effect 1,1
light_pos=make vector4(1)

light_x#=0
light_y#=0
light_z#=200

do

inc light_x#,mousemovex()
dec light_y#,mousemovey()

set vector4 1,light_x#,light_y#,light_z#,0
set effect constant vector 1,"LightPosition",1

sync
loop


Láthatjuk, hogy a kódunk kb. ugyanakkora maradt és nem is sokat bonyolódott, mégis az eredmény sokkal ígéretesebb.



Menjünk most végig az új parancsokon:

Kód:
load effect "PixelLighting.fx",1,0

Ezzel töltjük be az .fx fájlunkat és innentől kezdve a sorszámával (második paraméter) tudunk hivatkozni rá. Az utolsó paraméter értéke ha 0, akkor a shader nem fogja bántani a model textúrját és a jelenlegivel fog dolgozni. Az 1-et akkor használjuk ha a shader saját maga textúrázza le a modelt, ez esetben felül írhatja az előzőt.

Kód:
set object effect 1,1

Ezzel adjuk hozzá az effektet ténylegesen egy modellünkhöz. Itt a shader sorszámát és a model számát kell megadnunk.

Kód:
light_pos=make vector4(1)

Ezzel egy vektort hozunk létre, melyben négy float változó értékét tudjuk majd tárolni.

Kód:
set vector4 1,light_x#,light_y#,light_z#,0

A vektornak megadjuk a fény koordinátáit.

Kód:
set effect constant vector 1,"LightPosition",1

ez a parancs adja meg a shadernek a fény új koordinátáit amivel számolnia kell.

Tulajdonképpen ennyi is lenne. Akor most beszéljünk kicsit az elérhető változókról. Az .fx fájlban a következőket tudjuk DBP alatt is módosítani:

float4 LightPosition = {150.0f, 150.0f, 0.0f, 1.0f};
float4 LightColor = {1.0f, 1.0f, 1.0f, 1.0f};
float LightRange = 250.0f;
float4 Ambient = {0.1f, 0.1f, 0.1f, 1.0f};
float U = 1.0f;
float V = 1.0f;


A float4 típusúakhoz előtte létre kell hoznunk a kódon belül egy vektort, úgy ahogy ez a példaprogiban is szerepel. A sima float változóhoz ez nem szükséges, ennek az értékét egyszerűen, a set effect constant float paranccsal tehetjük meg. A fény hatótávolságát pl a következő paranccsal változtathatjuk 1000-re:

Kód:
set effect constant float 1,"LightRange",1000


a shaderünkben lévő U és V változók az objektum UV textúradataira vonatkoznak, ha változtatnunk kell ezeken és shadert használunk, azt mindenképp a shaderen belül tegyük ne a scale object texture paranccsal! A megmaradt változók értékét az eddig elmondottak alapján tudjuk megváltoztatni.

Ezzel a végére is értem a tutorialnak, remélem kellő segítség volt az alapok megértéséhez, a következő részben meg ígérem kicsit kreatívabb (és összetettebb) példaprogramokkal rukkolok elő, de addig is jó fejlesztést kívánok mindenkinek!

Értékelés: 8.42

Új hozzászólás
Seeting          2006.10.23 13:28
Ezaz, tömbök
FZoli          2006.10.23 13:14
őőőőő
hazak(x)

FZoli.
Addict          2006.10.23 10:02
De nekem inkább 1,2,3,4,5,6,7,8,9.... mint SargaHaz,KekHaz,ZoldHaz,PirosHaz... ugyanis az első magától értetődő dolog (asszem ), míg a második nem éppen
kicsy          2006.10.23 09:59
Hát könnyebben megjegyzem azt h SargaHaz mint h 328
Addict          2006.10.23 09:49
És a változó nevét ki jegyzi meg? Szvsz inkább egy szám az egyszerűb
Seeting          2006.10.23 09:42
Vagy eltárolni egy változóban
Addict          2006.10.23 09:16
Vissza kell olvasni
kicsy          2006.10.23 09:02
Huh, DB-ben mindenre számmal kell hivatkozni? Hogy lehet fejben tartani mi micsoda?
FZoli          2006.10.23 08:26
Köszi!

FZoli.
Seeting          2006.10.23 08:23
Nagyon jó lett a cikk
monostoria          2006.10.23 07:29
Nem az a téma amiről nagyon "nedvesen" lehetne beszélni De a többi érdekesebb az tuti
FZoli          2006.10.23 07:08
Köszönöm, bár kicsit száraz lett, terveim szerint a következő tutorial kicsit érdekesebb lesz.

FZoli.
monostoria          2006.10.23 07:02
Egész jó kis leírás lett kapott 10 pöttyöt
monostoria          2006.10.23 06:53
Óh, a második rész
köcönjük