# Megvilágítás modellezése

## Nate Robins tutorial

- | Windows: `lightmaterial.exe` Linux: `/pub/szgrafika/szamitogepes_grafika/Tutors.linux/lightmaterial` Bal egérgomb: paramétermódosítás. Jobb egérgomb: opciók (mindhárom panelen!).

- | Windows: `lightposition.exe` Linux: `/pub/szgrafika/szamitogepes_grafika/Tutors.linux/lightposition` Bal egérgomb: paramétermódosítás. Jobb egérgomb: opciók (mindhárom panelen!).

## Eddigi programjaink átírása

- ### Fényforrás(ok) megadása

  - Megvilágítás engedélyezése/kikapcsolása

        glEnable( GL_LIGHTING ); // megvilágítás be
        glDisable( GL_LIGHTING ); // megvilágítás ki

  - Globális ambiens fény megadása.

        GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f };
        ...
        glLightModelfv( GL_LIGHT_MODEL_AMBIENT, ambientLight );

  - Legalább 1 fényforrás engedélyezése/kikapcsolása

        glEnable( GL_LIGHT0 ); /* GL_LIGHT0, ..., GL_LIGHT7, GL_MAX_LIGHTS */
        glDisable( GL_LIGHT0 ); /* GL_LIGHT0, ..., GL_LIGHT7, GL_MAX_LIGHTS */

  - Fényforrás tulajdonságainak megadása (pozíció, ambiens, diffúz, spekuláris fényjellemzők, reflektor tulajdonságok, gyengülési együtthatók, stb.).

        glLightfv( GLenum light, GLenum pname, const GLfloat *params );

    light paraméter | pname paraméter | params paraméter
    --- | --- | ---
    GL_LIGHT0 ... GL_LIGHT7 ... GL_MAX_LIGHTS | GL_AMBIENT GL_DIFFUSE GL_SPECULAR | 4 elemű GLfloat tömb a színértékekkel
    GL_POSITION | 4 elemű GLfloat tömb a fényforrás helyével. Utolsó elem: ha 1, akkor térbeli pozíciót, ha 0, akkor térbeli irányt definiál a vektor.
    GL_SPOT_DIRECTION | 3 elemű GLfloat tömb, a reflektor irányát adja.
    GL_SPOT_CUTOFF GL_SPOT_EXPONENT | Skalár értékek, a reflektor nyílásszöge és gyengülési együtthatója.
    GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION | Skalár értékek, a fény gyengülési együtthatói.

- ### Anyagjellemzők megadása a csúcspontokhoz

  - Közvetlen megadás (ajánlott)

        glMaterialfv( GLenum face, GLenum pname, const GLfloat *params );

    face paraméter | pname paraméter | params paraméter
    --- | --- | ---
    GL_FRONT GL_BACK GL_FRONT_AND_BACK | GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_AMBIENT_AND_DIFFUSE | 4 elemű GLfloat tömb a visszatükrözési arányokkal
    GL_EMISSION | 4 elemű GLfloat tömb, az objektum saját fénye (Más objektumot nem világít meg.)
    GL_SHININESS | Skalár érték, csillogási paraméter.

  - `glColor()` segítségével (kevesebb beállítási lehetőség)

        glEnable( GL_COLOR_MATERIAL ); // anyagjellemzők a glColor()-ból
        glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ); // ambiens és diffúz jellemzők
        ...
        glColor3f( ... );

- ### Normálvektorok megadása a csúcspontokhoz

  - A GLUT modellező függvényei beállítják a normálvektorokat a csúcspontokban.
  - `glEnable( GL_NORMALIZE ); // ha skálázó/nyíró geometriai trafót is használunk`
  - Ha nem GLUT függvénnyel modellezünk, akkor a normálvektorok beállítása (`glNormal3f( ... )`).
    - Magunk határozzuk meg a normálvektort (pl. gömb esetén a középpontból a csúcspontba húzott sugár iránya).
    - 3 pont által definiált sík normálisa (`calcNormal();`).

Fontos: A megvilágítási egyenletek csak a csúcspontokban (`glVertex()`) értékelődnek ki, a poligonok kitöltése a shading-nek megfelelően történik. Emiatt:

- Mindig az alapértelmezett színátmenetes kitöltést (GL_SMOOTH) használjunk.
- Ha szükséges, növeljük a csúcspontok számát a realisztikusabb látvány eléréséhez. Pl.: téglalapokat osszuk fel négyszögcsíkokra.

Megjegyzés: A megvilágítási egyenletek nem veszik figyelembe azt, hogy a fényforrás(ok) és az objektumpont között más objektumok vannak-e, vagyis árnyékoló hatást nem fogunk látni.

## Feladatok

- GLUTObjects2 példaprogram kiegészítése diffúz megvilágítással.
- Hengerpalást modellezése normálvektorok megjelenítésével, reflektorfénnyel megvilágítva.

## Kapcsolódó előadás anyag