technikák optikai és interferometriai háttere
5. Első lépések az OpenGL-ben
6.8. Megvilágítások
A térben elhelyezett felületi objektumokat megvilágíthatjuk, illetve megadhatjuk, hogyan verik vissza a fényt.
Ha a fényforrásokat engedélyezni szeretnénk, akkor a glEnable(GL_LIGHTING) függvényhívást kell alkalmaznunk.
Legfeljebb 8 fényforrást definiálhatunk GL_LIGHT0-GL_LIGHT7-ig sorszámozva, melyek közül a GL_LIGHT0 -nak kitüntetett szerepe van. A fényforrások adatait az alábbi függvényekkel állíthatjuk be:
void glLightf (GLenum light, GLenum pname,GLfloat param );
void glLighti (GLenum light, GLenum pname,GLint param );
void glLightfv (GLenum light,GLenum pname,const GLfloat *params);
void glLightiv (GLenum light,GLenum pname,const GLint *params );
Mint ismeretes azokat a függvényeket, amelyek az i típusjelzőt hordozzák nevükben int adatokkal hívjuk, míg az f típusjelző float adatokra utal. Vannak olyan fényforrás beállítások, melyeket több adat is jellemez. Ilyenkor a jellemzők tömbjét használjuk argumentumként, ha a v típusjelzőt hordozó nevű függvényt hívjuk.
A függvények light paramétere a fényforrás sorszámát. a pname paraméter pedig a fényforrás típusát, illetve a fényforrást definiáló adat típusát rögzíti.
GL_AMBIENT Négy paraméter a környezeti szórt fény RGBA intenzitását definiálja. Az alapérték (0,0,0,1.0).
GL_DIFFUSE Négy paraméter a sugárzó fény RGBA intenzitását adja. Az alapérték a GL_LIGHT0 esetén (1.0, 1.0, 1.0,1.0), különben (0, 0, 0, 1.0).
GL_SPECULAR A négy paraméter a tükröződő fény RGBA intenzitása.
Az alapérték a GL_LIGHT0 esetén (1.0,1.0,1.0,1.0), különben (0,0,0,1.0).
GL_POSITION A fényforrás homogén-koordinákban megadott térbeli helye. A négy paraméter alapértéke (0, 0, 1.0, 0).
GL_SPOT_DIRECTION A fényforrás térkoordinátákban megadott iránya. A
OpenGL
három koordináta alapértéke (0, 0, -1.0).
GL_SPOT_EXPONENT A fényforrás fókuszáltsága, azaz mennyivel csökken a visszaverődés intenzitása a beesési merőlegestől távolodva. A paraméter értéke 0-128 között kell, hogy legyen. Minél nagyobb az érték, annál inkább fókuszált a fény. Az alapérték 0.
GL_SPOT_CUTOFF A megvilágítás terjedési szöge fokokban. A paraméter alapértéke 180.
GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION
A fényforrás távolsággal való intenzítás-csökkenése egy másodfokú polinom reciprokaként változik.
f=1/(c+l*d+q*d2)
A megadható paraméterek: a konstans (c), a lineáris (l) és a másodfokú tag (q) együtthatója. Az alapértékek (1, 0, 0).
A megvilágítási modell paramétereit az alábbi egész vagy valós, egyparaméteres vagy paramétervektort alkalmazó függvényekkel is beállíthatjuk:
void glLightModelf (GLenum pname, GLfloat param);
void glLightModeli (GLenum pname, GLint param);
void glLightModelfv (GLenum pname, const GLfloat *params);
void glLightModeliv (GLenum pname, const GLint *params);
A paraméterek értelmezése:
GL_LIGHT_MODEL_AMBIENT A négy paraméter a teljes modell szórt megvilágításának [0,1.0] közti RGBA értékét definiálja. Az alapérték (0.2, 0.2, 0.2, 1.0)
GL_LIGHT_MODEL_LOCAL_VIEWER Egyetlen egész, vagy valós paraméter szabályozza, hogyan használja a rendszer ránézési irányt. 0 esetén a ránézési irány a –Z-tengely, egyébként a kamerát és az aktuális pontot összekötő egyenes. Az alapérték 0.
GL_LIGHT_MODEL_TWO_SIDE Egyetlen egész, vagy valós paraméter szabályozza, hogy a felületek megvilágításakor egy vagy két oldalt vegyen figyelembe a rendszer. Az alapérték 0.
Érdemes megjegyezni, hogy akár ködös képet is készíthetünk a glEnable(GL_FOG) hívással. A glFogi(), glFogf(), glFogiv() és a glFogfv() függvényeket használhatjuk a köd paramétereinek beállítására.
6.9. Anyagok
A felületek megjelenése nemcsak a megvilágítás tulajdonságaitól függ, hanem attól is, milyen
„anyagtulajdonságai” vannak a megvilágított felületeknek.
A felületek normálisának fontos szerepe van a felületek oldalainak megkülönböztetésében, illetve a visszaverődés adatainak számításakor. A felületelem definiálásakor - a glBegin() és a glEnd() között - az aktuális elem normálvektora beállítható glNormal3típus() függvényekkel a vektor három koordinátáját megadva, illetve a glNormal3típusv() függvényekkel, melyek paramétere a normálvektort tartalmazó tömb kezdőcíme.
A megjelenítéskor az anyagtulajdonságokkal rendelkező elemek színe az alábbi tényezőkből számítva keletkezik:
szín=színanyag + megvilágításkörnyezet * megvilágításanyag + fényforrások(l, n, v)
A megjelenítés színe tehát függ az anyag színétől, a környezeti megvilágítástól, és attól, hogyan veri vissza az anyag a fényforrások felől érkező fénysugarakat. A fényforrások hatásában vehetjük figyelembe, hogy azok reflektorszerűek is lehetnek, azaz a megvilágítás iránya (d), a normálvektor (n), és a fényforrást és a pontot összekötő vektor (v), valamint a nézőpontot és a pontot összekötő vektor (l) hogyan határozzák meg a fény visszaverődését. Az alábbi tájékoztató jellegű képletben a vektorok egységvektorok és a „(,)” jelzés a skaláris szorzást jelenti amennyiben a visszaverődés értelmezett.
fényforrások(l, n, v) = intenzításfényforrások *
(v,d) * (megvilágításkörnyezet * megvilágításanyag +
(v,n)*szórtfényforrások * szórtanyag + (v+l,n)*tükrfényforrások * tükranyag)
Az anyag reflexiós tulajdonságainak beállításához egész és valós paraméterekkel rendelkező függvényeket használhatunk:
void glMateriali (GLenum face, GLenum pname, GLint param);
void glMaterialf (GLenum face, GLenum pname, GLfloat param);
A függvények paramétereit az alábbi táblázat segítségével értelmezhetjük:
face Megadhatjuk, hogy a felület első (GL_FRONT), hátsó (GL_BACK), vagy mindkét oldalára (GL_FRONT_AND_BACK) érvényes-e a beállítás.
pname Az anyag reflexiós tulajdonsága:
GL_AMBIENT azonos fényesség a felületen, GL_DIFFUSE minden irányban szórt fény, GL_ AMBIENT_AND_DIFFUSE a fenti két elem összege, GL_SPECULAR tükröződő anyag,
GL_SHINESS a fényesség nem függ a megvilágítás irányától,
Pontosabb beállításokhoz többparaméteres függvényeket használhatunk, ahol a params a beállítási adatokat tartalmazó vektor kezdőcíme.
void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
void glMaterialiv (GLenum face, GLenum pname, const GLint *params);
OpenGL
Ha a glEnable(GL_COLOR_MATERIAL) függvényt meghívjuk, akkor az anyagtulajdonságokat a színek határozzák meg. Ilyenkor szín adatai alapján az anyag reflexiós tulajdonságait a
void glColorMaterial (GLenum face, GLenum mode);
függvénnyel állíthatjuk be. A face paraméter lehetséges értékei itt is a felület kérdéses oldalát jelölik. A mode paraméter értéke pedig a GL_EMISSION, GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, vagy a GL_AMBIENT_AND_DIFFUSE értékek egyike lehet (az utolsó az alapértelmezett).
Az alábbi GLUT példa mozgó, tartópontokkal modellezett, árnyalt Bezier felületet mutat.
A mozgatáshoz szükséges adatok:
Az onInit() függvényben gondoskodunk a felület megvilágításáról és fényvisszaverés tulajdonságairól.
void onInit()
glMaterialfv(GL_FRONT,GL_DIFFUSE,szort); // szórt fény glMaterialfv(GL_FRONT,GL_SPECULAR,tukros); // tükröződés glMaterialfv(GL_FRONT,GL_SHININESS,fenyes); // fényesség // A default megvilágítás
// A felület normálvaktorainak számítása tükröződéshez glEnable(GL_AUTO_NORMAL);
int now = glutGet(GLUT_ELAPSED_TIME);
float dt = (now - lastTime) / 1000.0f;
if (dt>0.1)
A kirajzolást az onDisplay() függvény végzi.
void onDisplay() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
int u,v; // A tartópontok véletlen meghatározása
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
glTranslated(0.0, 0.0, -tav);
glRotated(-30, 1.0, 0.0, 0.0);
glScalef(.5,.5,.5);
glPolygonMode(GL_FRONT_AND_BACK , GL_FILL);
GLfloat csp[8]={0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0};
// A NURBS felület létrehozása
glutInitWindowSize(640, 480);
glutInitWindowPosition(0, 0);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("Árnyalás");
OpenGL