En taro Adun!
Potaknut svim silnim pitanjima o tome kako se radi igra na forumu, odlucio sam sastaviti osnovni tutorial koji objasnjava zasto profesionalne igre izgledaju, eh, profesionalno.
Kratki odgovor na to je programabilni pipeline video adaptera, nasuprot fiksnom, puno algebre, matrica, teorije o aproksimaciji svijetla i sjena.
Tutorial nije namijenjen pocetnicima, nego ljudima koji znaju napraviti sandbox OpenGL aplikaciju, amjestiti scenu, bindati teksture i izrendati. Ovo ce samo pomoci da ta scena izgleda nesto bolje. Takodjer ce pomoci svim pocetnicima da uvide koliko u izradi igre ima posla i znanja. Ne planiram obeshrabriti nikoga, nego pomoci ljudima da razbiju neke iluzije o izradi igara i onda ih navesti da eventualno razmisle jos jednom o svim izborima koje su donijeli u vezi svojeg projekta. Ne planiram postati OpenGL sandbox kod, nego samo isjecke iz shadera. Bezobrazan sam namjerno jer zelim da ljudi sjednu i iskoriste mozak radeci na ovome, ne da iskopiraju gotov kod -cak i kopiranje tih isjecaka i njihovo ljepljenje skupa ce biti dovoljno.
Jedan VELIKI DISLAIMER:
molim SVAKOGA da mi ne pise nista na PM trazeci pomoc osobno; pored toga sto mi se ne da odgovarati na PM koji podrzava znakova koliko i SMS poruka, postavite pitanje ovdje tako da i drugi mogu beneficirati od odgovora koji mogu napisati ili ja ili netko drugi. To je, inace, namjena foruma.
Teme koje cemo obraditi:
- perpixel vs. pervertex shading
- Lambertova jednadzba difuznog osvijetljenja
- phong spekularna refleksija
- normal mapping
- ambient occlusion mapping
Alati koji vam trebaju:
- Blender (besplatni profesionalni staticki 3D renderer i modeler)
- OpenGL SDK
- Algebra
- Zivci
- Moj blender file koji sadrzi highpoly i lowpoly verziju modela iz primjera (download)
Evo nekoliko slika da vizuelno objasne tech:
a) Fixed pipeline (lambert/blinn shading):
b) Shaderi u igri, perpixel sjencanje: lambertova jednadzba za diffuzno svijetlo i phong jednadzba za specular. Razlika se najvise vidi na desnoj obrvi i lijevom uhu, gdje je spekularno svijetlo doslo do izrazaja zbog pozicije kamere. Kako je ovo vrlo low poly model, da bolje prikaze vizualnu razliku medju efektima, perpixel shading se puno bolje vidi kad dodamo normal mape (c)
c) normal mapping. Textura je 512x512, bakeana u blenderu iz highpoly modela. Za slucaj da nije jasno - broj poligona se NIJE povecao! Model je potpuno jednak modelu iz prethodne dvije slike.
d) ambient occlusion mapping. Textura je 512x512, takodjer bakeana s blenderom. Primjetite razlike u podrucjima gdje konture lica normalno osjencavaju model. Ova tehnika je u Crytek engineu i Mirror's edge engineu implementirana u realtimeu. Kalkulacija ambient occlusiona je teska za GPU, a tehnika koju ja razradjujem ovdje je puno jednostavnija i zahtijeva teksturu, no drawback je sto moze biti primjenjena samo za neanimirane modele.Usput, ekstremno crna podrucja su artifakti nastali mojim nedostatkom volje da popravljam UV mapping.
e) Finalni model - perpixel lambert/phong, normal mapping, ambient occlusions i difuzna mapa, nacrtana by yours truly. Kao sto vidite, i ovdje sam lijeno sve pobojao u prekrasnu smedju boju, i cak se nisam trudio ni traziti poligone u teksturi koji odgovaraju dijelovima oka (tako da je uho ispalo malo obojano).
Slijedeci post krece s kratkim objasnjenjem o tome sto su shaderi, kakva je razlika izmedju vertex i fragment shadera, i kako implementirati perpixel lambert difuzno sjencanje.