„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
| 1 587. sor: | 1 587. sor: | ||
** [http://pastebin.com/nyA2eztg A példaprogram]: glShadeModel(GL_FLAT); vs. glShadeModel(GL_SMOOTH); | ** [http://pastebin.com/nyA2eztg A példaprogram]: glShadeModel(GL_FLAT); vs. glShadeModel(GL_SMOOTH); | ||
http://i.imgur.com/9luiuQI.png http://i.imgur.com/IWMFbU4.png | http://i.imgur.com/9luiuQI.png http://i.imgur.com/IWMFbU4.png | ||
=== A transzformációk hatása az árnyaló normálokra === | |||
Amikor a világot transzformáljuk, akkor a normálokkal mi történjen? Az eltolás kérdése egyszerű, a normál az egy irányvektor, az eltolás nem hat rá. A forgatás természetesen ugyanúgy hat rá mint a helyvektorokra. A nagyítással kapcsolatban viszont már más a helyzet. | |||
Ezzel kapcsolatban módosítsuk az utolsó példaprogramot, kérjünk fele akkora gömböt a GLUT-tól, és azt nagyítsuk kétszeresére <code>glScalef()</code>-el. Az eredménye az, hogy a gömb fele olyan világos lesz: | |||
http://i.imgur.com/yy8eRvZ.png | |||
A világítás számításakor csak a normál változott meg, és nem nehéz kitalálni, hogy fele olyan hosszú lett. De nem kétszeresére nagyítottuk a világot? Akkor a normál miért lett fele akkora. Ha ugyan az maradt volna a normál, akkor működne jól. De akkor az OpenGL miért rontotta el? | |||
Ahhoz, hogy ezt megértsük, vegyünk nem uniform nagyítást, ami a tengelyek irányába különböző mértékben nagyít. Pl. nagyítsuk a (3, 1, 1) vektorral. Ez nyilván drasztikusabb alakváltozással, és így a normálok lényegesebb megváltozásával is jár. Ennek az eredménye egy ellipszis lesz: | |||
http://i.imgur.com/RG9NlDC.png | |||
Az ellipszisen egyrészt nagyon jól látszódik, hogy az a tesszellációs felbontás, ami a gömbhöz elég volt, itt már csúnya képet eredményez. De most nem ezen van a lényeg, hanem az árnyaló normálokon. Miben másak az ellipszis normáljai, mint a gömbé? Az X tengely mentén ugyan annyi változás 3-szor akkora távon következik be, ezért értelemszerűen, amíg a Y és a Z tengely mentén a egységnyit változik a felületi pont helye, addig az X tengely mentén ez az érték 1/3. Termesztésen ez a pongyola megfogalmazás a parciális deriváltak számszerű értékére vonatkozott. És a gradiens, a parc. deriváltakból álló vektor a felületi normál amit mi kerestünk. Tehát a normálon a (3, 1, 1) nagyítás hatására (1/3, 1, 1) nagyítás történik. Ez általánosságban is igaz, hogy a normálokra a nagyítások inverz transzformációja hat. | |||
Szerencsére ezt az OpenGL automatikusan megcsinálja helyettünk. A gond viszont ezzel ez, hogy az ilyen transzformációk után a normál már nem feltétlen lesz egységvektor, mint ahogy azt a korábbi példákba is láttuk. De erre a megoldás egyszerű, a <code>glEnable(GL_NORMALIZE);</code> függvény megkéri az OpenGL-t, hogy a világítás számolásakor normalizálja a normálokat. | |||
== Utóhang == | == Utóhang == | ||