„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés

Rohamcsiga (vitalap | szerkesztései)
Rohamcsiga (vitalap | szerkesztései)
1 346. sor: 1 346. sor:
</syntaxhighlight> <br/>
</syntaxhighlight> <br/>


* Az eredménye: [http://pastebin.com/EzY6erh1 Egy négyzet]
* Az eredménye: [[Média:Grapp4_negyzet.cpp‎|Egy négyzet]]
http://i.imgur.com/iWkEuQj.png
http://i.imgur.com/iWkEuQj.png
* Na várjunk csak, mi egy kockát rajzoltattunk ki, akkor miért egy négyzetet látunk? Azért mert kameránál a "fényképezést", mint transzformációt leíró mátrix (a GL_PROJECTION) egy egységmátrix, így a fényképezés egyszerűen a z koordináta eldobására korlátozódik. A kockának mindössze két oldala van, aminek az XY síkra vett vetülete nem nulla területű, de mindkét vetület egy-egy négyzet. Mi a kettő közül a később kirajzolt oldalnak a vetületét látjuk.
* Na várjunk csak, mi egy kockát rajzoltattunk ki, akkor miért egy négyzetet látunk? Azért mert kameránál a "fényképezést", mint transzformációt leíró mátrix (a GL_PROJECTION) egy egységmátrix, így a fényképezés egyszerűen a z koordináta eldobására korlátozódik. A kockának mindössze két oldala van, aminek az XY síkra vett vetülete nem nulla területű, de mindkét vetület egy-egy négyzet. Mi a kettő közül a később kirajzolt oldalnak a vetületét látjuk.
1 367. sor: 1 367. sor:
</syntaxhighlight> <br/>
</syntaxhighlight> <br/>


* A kockát kirajzoló (kirajzolni próbáló) program eredménye ezzel a pár sorral kibővítve: [http://pastebin.com/CGsSTUEY Egy teljesen fehér kép]
* A kockát kirajzoló (kirajzolni próbáló) program eredménye ezzel a pár sorral kibővítve: [[Média:Grafpp4_feher_kep.cpp|Egy teljesen fehér kép]]
http://i.imgur.com/2B4efRi.png
http://i.imgur.com/2B4efRi.png


1 390. sor: 1 390. sor:
</syntaxhighlight> <br/>
</syntaxhighlight> <br/>


Az eredménye: [http://pastebin.com/YV7RpeRk kocka?]
Az eredménye: [[Média:Grafpp4_nem_kocka.cpp‎|egy kocka?]]


http://i.imgur.com/o8dUcNz.png
http://i.imgur.com/o8dUcNz.png
1 398. sor: 1 398. sor:
*** Fontos, hogy ha ez be van kapcsolva akkor a képernyőt a <code> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); </code> függvénnyel töröld le. Ha a GL_DEPTH_BUFFER_BIT konstanst lehagyod, akkor nem fogsz látni semmit.
*** Fontos, hogy ha ez be van kapcsolva akkor a képernyőt a <code> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); </code> függvénnyel töröld le. Ha a GL_DEPTH_BUFFER_BIT konstanst lehagyod, akkor nem fogsz látni semmit.


* Az eredmény: [http://pastebin.com/wWLR3qt6 Végre egy kocka!]
* Az eredmény: [[Média:Grafpp4_vegre_egy_kocka.cpp‎|Végre egy kocka!]]
http://i.imgur.com/z0QQfCD.png
http://i.imgur.com/z0QQfCD.png


1 439. sor: 1 439. sor:
</syntaxhighlight> <br/>
</syntaxhighlight> <br/>


Az eredménye: [http://pastebin.com/JikPBAFT Megvilágított kocka]:
Az eredménye: [[Média:Grafpp4_megvilagitott_kocka.cpp‎|Megvilágított kocka]]


http://i.imgur.com/W7BpUW4.png <br/>
http://i.imgur.com/W7BpUW4.png <br/>
1 597. sor: 1 597. sor:
* Az OpenGL-be a <code>glShadeModel(GL_SMOOTH);</code> függvénnyel lehet bekapcsolni, hogy figyelembe vegye az árnyaló normálokat.
* Az OpenGL-be a <code>glShadeModel(GL_SMOOTH);</code> függvénnyel lehet bekapcsolni, hogy figyelembe vegye az árnyaló normálokat.
* Én ennek a demonstrálásához a glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); függvényt használom, de ezt házikba nem lehet használni.
* Én ennek a demonstrálásához a glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); függvényt használom, de ezt házikba nem lehet használni.
** [http://pastebin.com/nyA2eztg A példaprogram]: glShadeModel(GL_FLAT); vs. glShadeModel(GL_SMOOTH);
* A példaprogram: [[Média:Grafpp4_gomb_sima_arnyalassal.cpp|Gömb sima árnyalással]]  
 
________<code>glShadeModel(GL_FLAT)</code>__________ vs. __________<code>glShadeModel(GL_SMOOTH)</code>________
 
http://i.imgur.com/9luiuQI.png http://i.imgur.com/IWMFbU4.png
http://i.imgur.com/9luiuQI.png http://i.imgur.com/IWMFbU4.png


1 628. sor: 1 631. sor:
Először egy egyszerű 6 db quadból álló kockán fogom megmutatni, hogy a textúrázás hogyan működik. A cél, hogy minden oldalra kiírjak egy számot, hogy azt az oldalt hányadikként rajzoltam ki. Ezt csak kódból fogom megoldani, nem használok hozzá külső programmal, pl. photoshoppal előállított képet, mert azt a házikhoz se lehet. Néhány szám esetleg fordítva fog állni, de ez engem nem zavar. Ilyen eredményt fogunk kapni:
Először egy egyszerű 6 db quadból álló kockán fogom megmutatni, hogy a textúrázás hogyan működik. A cél, hogy minden oldalra kiírjak egy számot, hogy azt az oldalt hányadikként rajzoltam ki. Ezt csak kódból fogom megoldani, nem használok hozzá külső programmal, pl. photoshoppal előállított képet, mert azt a házikhoz se lehet. Néhány szám esetleg fordítva fog állni, de ez engem nem zavar. Ilyen eredményt fogunk kapni:


http://i.imgur.com/e5RXe8e.png http://i.imgur.com/0lSPkjh.png
http://i.imgur.com/Bh5G5f8.png http://i.imgur.com/0lSPkjh.png


Először is, mi is az a textúra? A textúra egy színeket tartalmazó tömb. OpenGL 1.1-be egy vagy két dimenziós lehet, és szabvány szerint kettőhatvány méretűnek kell lennie. Annak ellenére, hogy a textúra színeket tartalmaz, és a színeket az OpenGL floatként szereti kezelni, nagyon ritkán szoktunk float textúrákat használni, és azokat se színek leírására. Itt tényleg csak (0-1) tarmotány beli LDR színekre vagyunk kíváncsiak, itt float helyett elég egy fix pontos szám is, pl komponensenként egy byte. De gyakran mindhárom komponenst le tudjuk írni mindössze egy bájtban. A float textúrák sokkal több helyet foglalnak, külön megizzasztják a memóriát, ami már enélkül is szűk keresztmetszet, ráadásul égvilágon semmi előnyünk nem származik abból, hogy floatként írjuk le a színeket. Hangsúlyozom, hogy ez csak a textúrákra igaz. A videókártya, amint egy értéket kiolvas a textúrából, azt azonnal floattá is kasztolja, hogy műveleteket tudjon végezni vele. Külön hardware van erre, ez annyira gyakori művelet.
Először is, mi is az a textúra? A textúra egy színeket tartalmazó tömb. OpenGL 1.1-be egy vagy két dimenziós lehet, és szabvány szerint kettőhatvány méretűnek kell lennie. Annak ellenére, hogy a textúra színeket tartalmaz, és a színeket az OpenGL floatként szereti kezelni, nagyon ritkán szoktunk float textúrákat használni, és azokat se színek leírására. Itt tényleg csak (0-1) tarmotány beli LDR színekre vagyunk kíváncsiak, itt float helyett elég egy fix pontos szám is, pl komponensenként egy byte. De gyakran mindhárom komponenst le tudjuk írni mindössze egy bájtban. A float textúrák sokkal több helyet foglalnak, külön megizzasztják a memóriát, ami már enélkül is szűk keresztmetszet, ráadásul égvilágon semmi előnyünk nem származik abból, hogy floatként írjuk le a színeket. Hangsúlyozom, hogy ez csak a textúrákra igaz. A videókártya, amint egy értéket kiolvas a textúrából, azt azonnal floattá is kasztolja, hogy műveleteket tudjon végezni vele. Külön hardware van erre, ez annyira gyakori művelet.
1 637. sor: 1 640. sor:
"........"          "........"          "........"          "........"          "........"          "........"
"........"          "........"          "........"          "........"          "........"          "........"
"...**..."          "..***+.."          "..***+.."          "....*..."          "..****.."          "........"
"...**..."          "..***+.."          "..***+.."          "....*..."          "..****.."          "........"
"....*..."          "....+*.."          "....+*.."          "...+*..."          "..*....."          "..++**.."
"....*..."          "....+*.."          "....+*.."          "...+*..."          "..*....."          "..+**..."
"....*..."          "....+*.."          "....+*.."          "..+**..."          "..***+.."          "..*....."
"....*..."          "....+*.."          "....+*.."          "..+**..."          "..***+.."          "..*....."
"....*..."          "...+*+.."          "...**+.."          "..+.*..."          "....+*.."          "..*+*+.."
"....*..."          "...+*+.."          "...**+.."          "..+.*..."          "....+*.."          "..***+.."
"....*..."          "..+*+..."          "....+*.."          "..****.."          "....+*.."          "..*..*.."
"....*..."          "..+*+..."          "....+*.."          "..****.."          "....+*.."          "..*..*.."
"...***.."          "..****.."          "..***+.."          "....*..."          "..***+.."          "..+**+.."
"...***.."          "..****.."          "..***+.."          "....*..."          "..***+.."          "..+**+.."
1 645. sor: 1 648. sor:
</syntaxhighlight> <br/>
</syntaxhighlight> <br/>


Technikailag már ezek a stringek is lehetnének unsigned char tömbök. És három szín van összesen, amit egy byte-on is bőven le lehetne írni. Viszont én az egyszerűség kedvéért inkább maradok a komponensenként egy bytenál, és nem kezdek el bitműveletekkel játszani a GL_R3_G3_B2-höz.
Technikailag már ezek a stringek is lehetnének unsigned char tömbök. És három szín van összesen, amit egy byte-on is bőven le lehetne írni. Viszont én az egyszerűség kedvéért inkább maradok a komponensenként egy byte-nál, a 3 komponensre összesen egy byte helyett, és nem kezdek el bitműveletekkel játszani a GL_R3_G3_B2-höz.


Termesztésen ezekből a szín előállítása egyszerűen két egymásba ágyazott for ciklus. Pl:
Termesztésen ezekből a szín előállítása egyszerűen két egymásba ágyazott for ciklus. Pl:
1 784. sor: 1 787. sor:
</syntaxhighlight> <br/>
</syntaxhighlight> <br/>


A teljes forráskód: [http://pastebin.com/8wCqMcky Textúrázott kocka]
A teljes forráskód: [[Média:Grafpp4_texturazas.cpp‎|Textúrázott kocka]]


==== A textúrák és a megvilágítás ====
==== A textúrák és a megvilágítás ====
1 792. sor: 1 795. sor:
Ne feledjük, hogy ahhoz, hogy a megvilágításnak szép eredménye legyen továbbra sem elég, ha a kocka oldali egyetlen quadból állnak. De a textúrázás bemutatásához önmagában az elég volt.
Ne feledjük, hogy ahhoz, hogy a megvilágításnak szép eredménye legyen továbbra sem elég, ha a kocka oldali egyetlen quadból állnak. De a textúrázás bemutatásához önmagában az elég volt.


Például: [http://pastebin.com/X04w0wUD Megvilágított, textúrázott kocka]
Példaprogram: [[Média:Graf4_megvilagitas_es_texturazas.cpp‎|Megvilágított, textúrázott kocka]]


http://i.imgur.com/fyp9WcK.png http://i.imgur.com/XE7dZAl.png
http://i.imgur.com/xT1d1ur.png http://i.imgur.com/XE7dZAl.png


==== Nem kettőhatvány méretű textúrák ====
==== Nem kettőhatvány méretű textúrák ====
1 821. sor: 1 824. sor:


De ennek a problémának az eddigi ismereteink alapján nem szabadna meglepőnek lennie, még akkor se ha nem tudtuk, hogy csak kettőhatvány textúrákat lehet használni.
De ennek a problémának az eddigi ismereteink alapján nem szabadna meglepőnek lennie, még akkor se ha nem tudtuk, hogy csak kettőhatvány textúrákat lehet használni.
Természtesen itt azzal van a gond, hogy az OpenGL szóhatárra illeszkedő sorokat vár, viszont mi 7*3 = 21 bájtos sorokat töltöttünk fel. Az OpenGL viszont úgy fogja értelmezni a textúránkat, mintha az 7*8-as lenne, aminek hatására jó pár szín elcsúszik, és egy kevés memóriaszemét is kerül a színek közé (az utolsó sorba). Ennek megoldására én három egyszerű megoldást tudok, és az egyszerű megoldásokon kívül egy olyat amit a beadón is lehet használni.
Természetesen itt azzal van a gond, hogy az OpenGL szóhatárra illeszkedő sorokat vár, viszont mi 7*3 = 21 byteos sorokat töltöttünk fel. Az OpenGL viszont úgy fogja értelmezni a textúránkat, mintha az 7*8-as lenne, aminek hatására jó pár szín elcsúszik, és egy kevés memóriaszemét is kerül a színek közé (az utolsó sorba). Ennek megoldására én három egyszerű megoldást tudok, és az egyszerű megoldásokon kívül egy olyat amit a beadón is lehet használni.
Az egyszerű megoldások:
Az egyszerű megoldások:
* Írjuk be az onInitbe az alábbi sort: <code>glPixelStorei(GL_UNPACK_ALIGNMENT, 1);</code> - Ennek hatására az OpenGL egy bájtos határra ileszkedő sorokat vár.
* Írjuk be az onInitbe az alábbi sort: <code>glPixelStorei(GL_UNPACK_ALIGNMENT, 1);</code> - Ennek hatására az OpenGL egy bájtos határra ileszkedő sorokat vár.
* Minden sor végére rakjunk be egy plusz karaktert, és egy 7*8-as tömbre mutató pointer adjunk oda a glTexImage2D-nek. De fontos, hogy továbbra is azt mondjuk neki, hogy 7x7-es textúrát töltünk fel. Ez valószínűleg a legnehezebben emészthető megoldás, úgyhogy erről tölöttem fel kódot: [http://pastebin.com/rc2Jm5hJ Dobókocka]
* Minden sor végére rakjunk be egy plusz karaktert, és egy 7*8-as tömbre mutató pointer adjunk oda a glTexImage2D-nek. De fontos, hogy továbbra is azt mondjuk neki, hogy 7x7-es textúrát töltünk fel. Ez valószínűleg a legnehezebben emészthető megoldás, úgyhogy erről töltöttem fel kódot: [[Média:Grafpp4_7x8_dobokocka.cpp‎|Dobókocka 7x8-as textúrával]].
* RGB textúra helyett használjunk RGBA textúrát.
* RGB textúra helyett használjunk RGBA textúrát.


1 832. sor: 1 835. sor:
* Egészítsük ki 8x8-asra a textúrát. A szélére másoljuk be a legközelebbi valid szomszédokat, mert bilineáris szűréskor ezeknek az értékeknek is látjuk a hatását.
* Egészítsük ki 8x8-asra a textúrát. A szélére másoljuk be a legközelebbi valid szomszédokat, mert bilineáris szűréskor ezeknek az értékeknek is látjuk a hatását.
* Buheráljuk meg a textúrakoordinátákat, úgy, hogy 0-tól 7/8-ig menjenek. Ezzel persze elvesztjük azt az előnyt, hogy a textúrakoordináták függetlenek magának a textúrának a paramétereitől, és a textúra lecserélése a textúrakoordináták lecserélését is magával vonja.  
* Buheráljuk meg a textúrakoordinátákat, úgy, hogy 0-tól 7/8-ig menjenek. Ezzel persze elvesztjük azt az előnyt, hogy a textúrakoordináták függetlenek magának a textúrának a paramétereitől, és a textúra lecserélése a textúrakoordináták lecserélését is magával vonja.  
* Ennek a megoldásnak a kódja: [http://pastebin.com/d8cBXgw6 Dobókocka]
* Ennek a megoldásnak a kódja: [[Média:Grafpp4_8x8_dobokocka.cpp‎|Dobókocka]]


http://i.imgur.com/vGETS3t.png http://i.imgur.com/3benYFM.png
http://i.imgur.com/vGETS3t.png http://i.imgur.com/3benYFM.png