„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
| 1 346. sor: | 1 346. sor: | ||
</syntaxhighlight> <br/> | </syntaxhighlight> <br/> | ||
* Az eredménye: [ | * 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: [ | * 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: [ | 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: [ | * 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: [ | 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. | ||
* | * 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/ | 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 | 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: [ | 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éldaprogram: [[Média:Graf4_megvilagitas_es_texturazas.cpp|Megvilágított, textúrázott kocka]] | |||
http://i.imgur.com/ | 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é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 | * 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: [ | * 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 | ||