|
|
| 1 428. sor: |
1 428. sor: |
| </syntaxhighlight> <br/> | | </syntaxhighlight> <br/> |
|
| |
|
| Az eredménye: [http://pastebin.com/JikPBAFT Megvilágított kocka] | | Az eredménye: [http://pastebin.com/JikPBAFT Megvilágított kocka]: |
| | |
| http://i.imgur.com/W7BpUW4.png | | http://i.imgur.com/W7BpUW4.png |
|
| |
| === A megvilágítás ===
| |
|
| |
| A megvilágítás bekapcsolása nagyon egyszerű: <code> glEnable(GL_LIGHTING); </code>
| |
| Amit ez eredményez: egy majdnem teljesen fekete képernyő.
| |
|
| |
| http://i.imgur.com/Rj0AC5p.png
| |
|
| |
| A probléma az, hogy a megvilágításkor nem a glColor3f()-el megadott színeket használja fel. Hogy pontosan mit, arra majd később visszatérünk, egyelőre kérjük meg, hogy a glColor3f() színeket használja a megvilágításhoz is. Ezt a <code> glEnable(GL_COLOR_MATERIAL); </code> függvénnyel tehetjük meg. Ennek hatására egy ilyen képet látunk:
| |
|
| |
| http://i.imgur.com/FAm0t1G.png
| |
|
| |
| Ez még mindig nem az igazi. A gond az, hogy egyetlen fényforrásunk sincs, mindössze egy (0.2f, 0.2f, 0.2f) színű környezeti háttérvilágítás befolyásolja alapból a jelenetünket. A környezeti háttérvilágításon kívül az OpenGLben 8 darab fényforrás van. Ezek a GL_LIGHT0, GL_LIGHT1, ... GL_LIGHT7 neveket kapták. A fényforrás típusok nagyon hasonlítanak ahhoz, mint amiket a sugárkövetésnél használtunk. A fényforrás a pozíciója alapján lehet pont vagy irányfényforrás. A pozíciót 4D heterogén koordinátákkal kell megadni. Ha a negyedik koordináta nulla, akkor a pont végtelen távol van, ezt az OpenGL irányfényforrásként fogja kezelni. Ha a negyedik koordináta nem nulla (ilyenkor tipikusan 1), akkor pedig pont fényforrásról van szó. A pont fényforrás viselkedhet spotlámpaként, ehhez meg kell adni, hogy melyik irányba néz, és mekkora térszöget világít be. Továbbá az összes fényforrásnak lehet ambiens tagja is. De van egy globális ambiens fény is, ami a 8 fényforrástól független, mindig be van kapcsolva, (0.2f, 0.2f, 0.2f) a default értéke, és ehhez a házikba általában nem szabad hozzányúlni.
| |
|
| |
| A fényforrások külön-külön ki-be kapcsolgathatóak. Pl: <code> glEnable(GL_LIGHT0); </code>.
| |
| Ez önmagában semmi változást nem okoz, aminek az egyik oka az, hogy mint azt a sugárkövetésnél is láttuk, a világítás számolásához szükség van a felületi normálokra.
| |
| Ezt a glNormal3f() függvénnyel adhatjuk meg, egy glVertex hívás előtt. Pl:
| |
|
| |
| <br/> <syntaxhighlight lang="c">
| |
| void glQuad(const Vector& a, const Vector& b, const Vector& c, const Vector& d) {
| |
| Vector normal = cross(b-a, c-a).normalize();
| |
| glColor3f(fabs(normal.x), fabs(normal.y), fabs(normal.z));
| |
| glNormal3f(normal.x, normal.y, normal.z);
| |
| glVertex3f(a); glVertex3f(b); glVertex3f(c); glVertex3f(d);
| |
| }
| |
| </syntaxhighlight> <br/>
| |
|
| |
| Megjegyzés: ebben az esetben szebb megoldás lenne a <code> glNormal3fv(&normal.x); </code> bár a float vektort váró függvények nem mindig vannak megengedve a házikhoz.
| |
|
| |
| Ha megfelelő oldalát nézzük a kockának, akkor észrevehetjük, hogy a GL_LIGHT0 bekapcsolása hatására lett a jelenetben egy irányfényforrás (ami a -z irányba világít). Ezt eredményezi, hogy a (0, 0, 1) normálú oldal (ami kék) lesz világos:
| |
|
| |
| http://i.imgur.com/4YtuOeg.png
| |
|
| |
|
| == Utóhang == | | == Utóhang == |