„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
Hozzáadtam a nem kettő hatvány textúrák részt. |
|||
| 1 780. sor: | 1 780. sor: | ||
http://i.imgur.com/fyp9WcK.png http://i.imgur.com/XE7dZAl.png | http://i.imgur.com/fyp9WcK.png http://i.imgur.com/XE7dZAl.png | ||
==== Nem kettő hatvány textúrák ==== | |||
Gyakran felmerülhet az igény nem kettő hatvány méretű textúrára. Például az előző példák kockájából egy dobókockát akarunk csinálni. Egy ilyet: | |||
http://i.imgur.com/3benYFM.png | |||
De ez a mintázat egy 7*7-es textúrát igényel, pl az öt így néz ki: | |||
<br/> <syntaxhighlight lang="c"> | |||
"......." | |||
".*...*." | |||
"......." | |||
"...*..." | |||
"......." | |||
".*...*." | |||
"......." | |||
</syntaxhighlight> <br/> | |||
A hét köztudottan nem kettő hatvány. Ha megpróbáljuk ugyan úgy használni, mint ahogy a 8x8-as textúrával tettük, vajon működni fog? | |||
Természetesen nem... | |||
http://i.imgur.com/NsKm5AK.png | |||
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 textúrába. 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: | |||
* Í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] | |||
* RGB textúra helyett használjunk RGBA textúrát. | |||
De várjunk csak, nem arról volt szó, hogy az OpenGL csak kettő hatvány méretű textúrákkal tud dolgozni? De.. ez szabvány szerint igaz... csak a mi gépünk nem tud róla... A 90-es években még problémát okozott a videókártyáknak a nem kettő hatvány méretű textúrák kezelése, de már több mint tíz éve tetszőleges méretű textúrával is ugyan olyan hatékonyan tud dolgozni az összes videókártya. Ez viszont sovány vigasz a beadón... ahol a nem kettő hatvány méretű textúrák nincsenek implementálva. | |||
A beadón működő megoldás: | |||
* 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. | |||
* Ennek a megoldásnak a kódja: [http://pastebin.com/d8cBXgw6 Dobókocka] | |||
== Utóhang == | == Utóhang == | ||