• Nem Talált Eredményt

Megvilágítások

In document 3D megjelenítési technikák (Pldal 179-184)

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

In document 3D megjelenítési technikák (Pldal 179-184)