Zad´ an´ı projektu – Texturov´ an´ı Z´aklady poˇc´ıtaˇcov´e grafiky (IZG) ak. rok 2013/2014 ˇ Michal Spanˇ el,
[email protected] 24.2.2014
1
Prvn´ı sezn´ amen´ı
C´ılem projektu je pochopen´ı praktick´ ych souvislost´ı t´emat pˇredn´aˇsek a cviˇcen´ı. Z´ akladem projektu je pˇripraven´a funkˇcn´ı kostra programu, kter´ y realizuje softwarov´ y rendering jednoduch´eho polygon´aln´ıho modelu.
Obr´ azek 1: Uk´ azka zobrazen´ı modelu bunny.tri pˇred vypracov´an´ım projektu (vlevo) a po vypracov´an´ı projektu (vpravo). Doplnˇeno texturov´ an´ı s vyuˇzit´ım pomocn´eho tˇelesa - koule. • Aplikace naˇc´ıt´ a zobrazovan´ y model z textov´ ych soubor˚ u s pˇr´ıponou .tri. Pro testov´ an´ı m´ate na v´ ybˇer nˇekolik model˚ u. 1
• Standardnˇe zobrazovan´ y model (bunny.tri) lze zmˇenit zad´an´ım jin´eho n´ azvu na pˇr´ıkazov´e ˇr´ adce: Pˇ r´ıklad: izg proj skull.tri • Z´ akladn´ım zobrazovan´ ym primitivem je troj´ uheln´ık. • Aplikace ˇreˇs´ı cel´ y proces vykreslov´an´ı vˇcetnˇe rasterizace troj´ uheln´ıku softwarovˇe (bez grafick´e karty, bez OpenGL). • Pro manipulaci se sc´enou je implementov´an primitivn´ı manipul´ator, kter´ y pouze ot´ aˇc´ı a zvˇetˇsuje/zmenˇsuje zobrazovan´ y model. Pozice kamery je fixn´ı. • Renderer ˇreˇs´ı veˇsker´e transformace modelu vˇcetnˇe perspektivn´ı projekce. S naprostou vˇetˇsinou algoritm˚ u, kter´e jsou v projektu pouˇzity (transformace, rasterizace, osvˇetlen´ı, apod.) se postupnˇe sezn´am´ıte na pˇredn´aˇsk´ach a cviˇcen´ıch.
2
Zdrojov´ y k´ od
Kostra programu je obdobou frameworku, kter´ y pouˇz´ıv´ate ve cviˇcen´ı a je naps´ ana v ˇcist´em C. • Kresl´ıme do vlastn´ıho alokovan´eho frame bufferu. • Pro vykreslen´ı frame bufferu na obrazovku a reakce na ud´alosti (myˇsov´an´ı, apod.) se pouˇz´ıv´ a knihovna SDL (Simple Directmedia Layer ). http://www.libsdl.org/
Pˇredkompilovan´e bal´ıˇcky knihovny SDL (testov´ano s verz´ı 1.2.15 ) najdete na webu: http://www.libsdl.org/download-1.2.php
2
Pˇreklad ve zkratce: • Windows/MinGW – Na windows lze pouˇz´ıt pˇrekladaˇc MinGW (GCC portovan´e na windows) a pˇriloˇzen´ y Makefile. V uˇcebn´ach fakulty mi funguje: – Otevˇr´ıt okno s pˇr´ıkazovou ˇr´adkou. – Nastavit cesty k MinGW pˇrekladaˇci spuˇstˇen´ım: q:/mingw/set mingw.bat (alternativnˇe: set path=q:/mingw/mingw/bin;%path%) – Spustit pˇreklad: mingw32-make – V tomto pˇr´ıpadˇe se pouˇzije jiˇz instalovan´a knihovna SDL z adres´ aˇre q:/mingw/SDL. • Windows/MSVC – Otevˇrete dodan´ y solution v MS Visual Studiu a nechte probˇehnout pˇr´ıpadnou konverzi solution a projektu. SDL knihovnu nainstalujete takto: – St´ ahnˇete si bal´ıˇcek bin´arn´ıch knihoven pro MSVC: http://www.libsdl.org/release/SDL-devel-1.2.15-VC.zip – A rozbalte jej do adres´aˇre ”vedle”projektu, tzn.: . .. SDL-1.2.15 izg proj – F7 spust´ı pˇreklad • Linux/GCC – Pro pˇreklad na linuxu je pˇripraven´ y Makefile staˇc´ı tedy: make. SDL knihovna b´ yv´a souˇc´ast´ı vˇetˇsiny Linuxov´ ych distribuc´ı, pokud ne: – St´ ahnˇete si zdrojov´e k´ody z http://www.libsdl.org/release/SDL-1.2.15.zip – Zadejte typickou sekvenci ./configure; make; make install – Na Ubuntu funguje tak´e: sudo apt-get install libsdl1.2-dev
3
V pˇr´ıpadˇe pot´ıˇz´ı s pˇrekladem (v uveden´em poˇrad´ı)... 1. hledejte chybu na vaˇsem konci kl´avesnice, 2. zeptejte se kamar´ ada, 3. nahl´ednˇete do diskusn´ıho f´ora IZG a pˇr´ıpadnˇe poˇslete dotaz, 4. zatancujte kolem sv´eho poˇc´ıtaˇce, proneste nˇekolik magick´ ych manter a pak zkuste pˇreklad znovu, 5. napiˇstˇe mi email.
4
3
Bodovan´ yu ´ kol
C´ılem je doplnit do pˇripraven´eho studentsk´eho“ rendereru n´asleduj´ıc´ı algo” ritmy/funkce: • podporu texturov´ an´ı s vyuˇzit´ım koule jako pomocn´eho tˇelesa • nan´est na model texturu ˇsachovnice. Studenti pracuj´ı na ˇreˇsen´ı projektu samostatnˇe a kaˇzd´ y odevzd´a sv´e vlastn´ı ˇreˇsen´ı. Porad’te si, ale ˇreˇsen´ı vypracujte samostatnˇe!
3.1
Krok ˇ c.1 – Generov´ an´ı textury ˇ sachovnice
Do vaˇseho studentsk´eho rendereru pˇridejte podporu pro vytvoˇren´ı a uloˇzen´ı 2D textury a v r´ amci inicializace rendereru procedur´alnˇe vygenerujte texturu imituj´ıc´ı ˇsachovnici.
Obr´ azek 2: Uk´azka spr´avnˇe pˇripraven´e textury. Textura bude pole S RGBA hodnot, podobnˇe jako frame buffer. Zachovejte rozmˇer textury v pixelech dan´ y konstantou TEXTURE SIZE a poˇcet pol´ıˇcek NUM OF TILESxNUM OF TILES. Pro tmav´a pole pouˇzijte barvu BLACK TILE a pro svˇetl´ a WHITE TILE. Co bude tˇreba udˇelat? • Do struktury S StudentRenderer doplnit vlastn´ı reprezentaci 2D textury s vyuˇzit´ım typu S RGBA - tzv. aktivn´ı kresl´ıc´ı textura. • Upravit fce studrenCreate() a studrenRelease() - pˇridat vytvoˇren´ı a nakonec uvolnˇen´ı textury. 5
• Funkce studrenCreate() – doplnit k´od, kter´ y vytvoˇr´ı texturu se vzorem ˇsachovnice.
3.2
Krok ˇ c.2 – Pˇ riˇ razen´ı texturovac´ıch souˇ radnic vrchol˚ um
Pro vˇsechny vrcholy naˇcten´eho polygon´aln´ıho modelu automaticky vygenerovat a pˇriˇradit texturovac´ı souˇradnice s vyuˇzit´ım mapovani pˇres pomocn´e tˇeleso - kouli. Vzorce pro v´ ypoˇcet texturovac´ıch souˇradnic u, v jsou odvozen´e ze sf´erick´ ych souˇradnic a lze naj´ıt v´ıce r˚ uzn´ ych variant. M˚ uˇzete pˇredpokl´adat, ˇze model je um´ıstˇen v poˇc´ atku souˇradn´eho syst´emu a posunut´ı stˇredu koule nen´ı tˇreba ˇreˇsit. Je-li (x, y, z) normalizovan´ y vektor ze stˇredu souˇr. syst´emu do vrcholu, pak m˚ uˇzete texturovac´ı souˇradnice urˇcit takto: arctan( xz ) , 2π arcsin(y) v = 0.5 − . π
u = 0.5 +
Jak je v grafice zvykem, vygenerovan´e texturovac´ı souˇradnice budou v intervalu < 0, 1 >, kter´ y vˇzdy odpov´ıd´a aktu´aln´ım rozmˇer˚ um textury. • K´ od pro pˇriˇrazen´ı texturovac´ıch souˇradnic doplˇ nte do fce onInit(). • Pro uchov´ an´ı texturovac´ıch souˇradnic je urˇceno pole texcoords ve struktuˇre S Model.
3.3
Krok ˇ c.3 – Z´ısk´ an´ı hodnoty textury s biline´ arn´ı interpolac´ı
Pro z´ısk´ an´ı hodnoty z textury na souˇradnic´ıch u, v vyuˇzijte biline´arn´ı interpolaci ˇctyˇr nejbliˇzˇs´ıch pixel˚ u. Hodnoty u, v v intervalu < 0, 1 > odpov´ıd´aj´ı rozmˇer˚ um textury v pixelech. Pokud v´ am korektnˇe funguje generov´an´ı texturovac´ıch souˇradnic, nen´ı tˇreba ˇreˇsit pˇr´ıpadn´e opakov´an´ı textury, protoˇze texturovac´ı souˇradnice nebudou mimo tento interval. • K´ od dopl´ nte do studrenTextureValue(). • Alpha sloˇzku v´ ysledn´e barvy nebudeme vyuˇz´ıvat, m˚ uˇzete ji nastavit na 255. 6
3.4
Krok ˇ c.4 – Podpora texturov´ an´ı pˇ ri rasterizaci
Posledn´ım krokem implementace texturov´an´ı je u ´prava samotn´e rasterizace troj´ uheln´ıku, kdy je nutn´e interpolovat texturovac´ı souˇradnice pomoc´ı barycentrick´ ych souˇradnic a n´aslednˇe zkombinovat barvu z´ıskanou v´ ypoˇctem osvˇetlovac´ıho modelu s hodnotou textury v dan´em bodˇe pomoc´ı modulace. Modulace je princip aplikace textury, kdy textura d´ale strukturuje povrch objektu dan´ y materi´ alem: R = Rl ∗ Rt , G = Gl ∗ Gt , B = Bl ∗ Bt . kde Rl Gl Bl je barva urˇcen´ a osvˇetlovac´ım modelem a Rt Gt Bt hodnota textury (Rt , Gt , Bt ∈< 0, 1 >).
Obr´ azek 3: V´ ystup po implementaci texturov´an´ı. Bude tedy tˇreba: • Upravit fci studrenProjectTriangle() – proti p˚ uvodn´ı verzi pˇridat vol´ an´ı vaˇs´ı upraven´e fce studrenDrawTriangle(). 7
• Upravit fci studrenDrawTriangle() – doplnit interpolaci texturovac´ıch souˇradnic pomoc´ı barycentrick´ ych souˇradnic podobnˇe jako se ve st´ avaj´ıc´ı funkci interpoluje souˇradnice z. • Hodnotu textury z´ıskat pomoc´ı vaˇs´ı fce studrenTextureValue(). • Doplnit modulaci barvy troj´ uheln´ıku pomoc´ı textury. Pozn.: Nen´ı tˇreba ˇreˇsit perspektivn´ı korekci textury.
3.5
Pozn´ amky k ˇ reˇ sen´ı
Pro vaˇse modifikace je pˇripraven´a oddˇelen´a varianta rendereru v souborech student.h a student.c. S projektem experimentujte dle libosti (mˇen ˇte a modifikujte co chcete), ale pamatujte, ˇze odevzdan´e soubory student.h a student.c mus´ı b´ yt funkˇcn´ı s origin´aln´ım frameworkem! Pro odevzdan´e ˇreˇsen´ı je povoleno modifikovat pouze tyto dva soubory. Jak pˇ repnout na zobrazov´ an´ı pomoc´ı studentsk´ eho rendereru? Konkr´etn´ı renderer se vytv´aˇr´ı ve fci main() v souboru main.c. Poˇc´ateˇcn´ı volbu lze ovlivnit definov´ an´ım makra USE STUDENT RENDERER na zaˇc´ atku main.c a opˇetovn´ ym pˇrekladem. Renderer lze tak´e pˇrepnout za bˇehu pomoc´ı kl´ aves O a P.
Obr´ azek 4: Uk´azky dalˇs´ıch model˚ u...
8
4
Tipy pro vypracov´ an´ı • Doporuˇcuji prostudovat princip z´akladn´ıho rendereru (soubory render.h a render.c), velk´a ˇc´ast projektu je o menˇs´ıch modifikac´ıch jiˇz existuj´ıc´ıch funkc´ı... • Pro kontrolu, zda m´ ate texturu spr´avnˇe inicializovanou, m˚ uˇzete vyuˇz´ıt fci saveBitmap() z bmp.h.
Souˇcasn´ a verze rendereru a reprezentace 3D model˚ u neumoˇzn ˇuje snadno a korektnˇe vyˇreˇsit pˇriˇrazen´ı texturovac´ıch souˇradnic troj´ uheln´ık˚ um, jejichˇz hrany pˇrech´ azej´ı pˇres hranu textury 1 − 0. N´asledn´a interpolace u a v v rasterizaci zp˚ usobuje pot´ıˇze viditeln´e na Obr´azku 5. Toto nebude povaˇzov´ano za chybu!
Obr´ azek 5: Uk´azka povolen´a chyba“. ”
5
Odevzd´ an´ı
viz. web
6
Z´ avˇ erem
At’ se d´ılo daˇ r´ı a at’ v´ as grafika alespoˇ n trochu bav´ı!!! 9