„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)
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 ==