2.10 Lichtquellen und void glshademodel(glenum model) - Setzt das angegebene Shading Model (GL_FLAT oder GL_SMOOTH) 2-1
2.10 Lichtquellen und Lokales smodell in OpenGL für n Lichtquellen k s 2-2
2.10 Lichtquellen und Normalenvektoren - Modelview-Transformation kann unter Umständen die Länge der Normalenvektoren beeinflussen - Abhilfe: - glenable(gl_normalize) garantiert normalisierte Normalen aufwendig - glenable(gl_rescale_normal) skaliert Normalen in Abhängigkeit der Modelview- Transformationsmatrix funktioniert nur korrekt, wenn Normalen vorher normalisiert waren 2-3
2.10 Lichtquellen und Definition der Lichtquellen - Bestimmung der Lichtquellenparameter void gllighti(glenum light, GLenum paramname, GLint param); void gllightf(glenum light, GLenum paramname, GLfloat param); void gllightiv(glenum light, GLenum paramname, GLint *param); void gllightfv(glenum light, GLenum paramname, GLfloat *param); - Definiert die Parameter der entsprechenden Lichtquelle light - light kann die Werte GL_LIGHT0 bis GL_LIGHT7 annehmen 2-4
2.10 Lichtquellen und Lichtquellenparameter - GL_AMBIENT ambiente Intensität der Lichtquelle Defaultwert: (0.0, 0.0, 0.0, 1.0) - GL_DIFFUSE diffuse Intensität der Lichtquelle Defaultwert: Weiß für Licht 0, schwarz für alle anderen - GL_SPECULAR spiegelnde Intensität der Lichtquelle Defaultwert: Weiß für Licht 0, schwarz für alle anderen - GL_POSITION Position der Lichtquelle Defaultwert: (0.0, 0.0, 1.0, 0.0) - GL_SPOT_DIRECTION Hauptrichtung eines Spotlights Defaultwert: (0.0, 0.0, -1.0) - GL_SPOT_EXPONENT Spot-Exponent Defaultwert: 0 - GL_SPOT_CUTOFF Abstrahlungswinkel des Spots zu einer Seite Defaultwert: 180 2-5
2.10 Lichtquellen und Abschwächungsparameter einer Lichtquelle - GL_CONSTANT_ATTENUATION konstanter Abschwächungsfaktor Defaultwert: 1.0 - GL_LINEAR_ATTENUATION linearer Abschwächungsfaktor Defaultwert: 0.0 - GL_QUADRATIC_ATTENUATION quadratischer Abschwächungsfaktor Defaultwert: 0.0 2-6
2.10 Lichtquellen und Beispiel GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; gllightfv(gl_light0, GL_AMBIENT, light_ambient); gllightfv(gl_light0, GL_DIFFUSE, light_diffuse); gllightfv(gl_light0, GL_SPECULAR, light_specular); gllightfv(gl_light0, GL_POSITION, light_position); 2-7
2.10 Lichtquellen und Positionierung der Lichtquellen GLfloat light_position[] = { x, y, z, w }; gllightfv(gl_light0, GL_POSITION, light_position); - Homogene Koordinate entscheidet über den Typ der Lichquelle: - Richtungs-Lichtquelle (directional light) Die Lichtquelle ist unendlich weit entfernt, ihre Strahlen verlaufen parallel - Positions-Lichtquelle (positional light) Die Lichtquelle hat eine genaue Position in der Szene und wird als Punktlichtquelle betrachtet 2-8
2.10 Lichtquellen und Abschwächungsfaktoren der Lichtquellen d: Entfernung zwischen Lichtquelle und beleuchtetem Objekt gllightf(gl_light0, GL_CONSTANT_ATTENUATION, 2.0); gllightf(gl_light0, GL_LINEAR_ATTENUATION, 1.0); gllightf(gl_light0, GL_QUADRATIC_ATTENUATION, 0.3); 2-9
2.10 Lichtquellen und Spotlights GL_SPOT_CUTOFF GL_SPOT_EXPONENT GL_SPOT_DIRECTION k 2-10
2.10 Lichtquellen und Definition mehrerer Lichtquellen Analog können die Parameter mehrerer Lichtquellen gesetzt werden gllightfv(gl_light0, GL_AMBIENT, light0_ambient); gllightfv(gl_light0, GL_DIFFUSE, light0_diffuse); gllightfv(gl_light0, GL_SPECULAR, light0_specular); gllightfv(gl_light0, GL_POSITION, light0_position); gllightfv(gl_light1, GL_AMBIENT, light1_ambient); gllightfv(gl_light1, GL_DIFFUSE, light1_diffuse); gllightfv(gl_light1, GL_SPECULAR, light1_specular); gllightfv(gl_light1, GL_POSITION, light1_position); 2-11
2.10 Lichtquellen und Bewegung von Lichtquellen - Lichtquellen werden in OpenGL wie grafische Primitive behandelt - Ihre Position wird durch die Modelview-Matrix analog zur Position anderer Primitive verändert - Beispiel: GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 }; glclear (GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT); glpushmatrix (); glulookat (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glpushmatrix (); glrotated ((GLdouble) spin, 1.0, 0.0, 0.0); gllightfv (GL_LIGHT0, GL_POSITION, position); glpopmatrix (); glutsolidtorus (0.275, 0.85, 8, 15); glpopmatrix (); glflush (); 2-12
2.10 Lichtquellen und Bewegung von Lichtquellen relativ zum Auge - Wird erreicht durch Positionierung der Lichtquelle vor der Definition der Viewing-Transformation - Position der Lichtquelle wird in Aug-Koordinaten gespeichert 2-13
2.10 Lichtquellen und Bewegung von Lichtquellen relativ zum Auge - Beispiel der Initialisierung: GLfloat light_position[]={0.0, 0.0, 0.0, 1.0}; glviewport(0, 0, (GLint) w, (GLint) h); glmatrixmode(gl_projection); glloadidentity(); gluperspective(40.0, (GLfloat) w / (GLfloat) h, 1.0, 100.0); glmatrixmode(gl_modelview; glloadidentity(); gllightfv(gl_light0, GL_POSITION, light_position); 2-14
2.10 Lichtquellen und Bewegung von Lichtquellen relativ zum Auge - Beispiel der Display-Routine: static GLdouble ex, ey, ez, upx, upy, upz; void display(void) { glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glpushmatrix(); glulookat(ex, ey, ez, 0.0, 0.0, 0.0, upx, upy, upz); glutsolidtorus (0.275, 0.85, 8, 15); glpopmatrix(); glflush(); } 2-15
2.10 Lichtquellen und Beispielprogramm - movelight.c - eyelight.c (Siehe Website) 2-16
2.10 Lichtquellen und Das OpenGL smodell - Eigenschaften - Intensität des globalen Umgebungslichts - Augpunkt-Position in der Szene oder unendlich weit entfernt - Unterschiedliche s-berechnungen für Vorder- und Rückseiten der Oberflächen - Berechnung der spiegelnden Reflexion / Farbe getrennt von ambienter und diffuser Reflexion nach der Texturierung 2-17
2.10 Lichtquellen und Definition eines OpenGL smodells - Definition der Parameter des smodells void gllightmodeli(glenum parametername, GLint parameter) void gllightmodelf(glenum parametername, GLfloat parameter) void gllightmodeliv(glenum parametername, GLint *parameter) void gllightmodelfv(glenum parametername, GLfloat *parameter) - Legt die entsprechenden Parameter des smodells fest 2-18
2.10 Lichtquellen und Parameter des OpenGL smodells - GL_LIGHT_MODEL_AMBIENT Intensität des globalen Umgebungslichts Defaultwert: (0.2, 0.2, 0.2, 1.0) als RGBA-Wert - GL_LIGHT_MODEL_LOCAL_VIEWER Augpunkt-Position zur Berechnung der Reflexionswinkel bei Defaultwert: 0.0 oder GL_FALSE Spiegelung - GL_LIGHT_MODEL_TWO_SIDE Unterschiedliche für Vorder- und Defaultwert: 0.0 oder GL_FALSE Rückseiten - GL_LIGHT_MODEL_COLOR_CONTROL Getrennte Berechnung Defaultwert: GL_SINGLE_COLOR spiegelnder Reflexion 2-19
2.10 Lichtquellen und Globales Umgebungslicht - Ambientes Licht in der Szene, das nicht direkt von einzelnen Lichtquellen stammt - Anwendung: GLfloat lmodel_ambient[]={0.3, 0.1, 0.2, 1.0}; gllightmodelfv(gl_light_model_ambient, lmodel_ambient); 2-20
2.10 Lichtquellen und Lokaler oder unendlich weit entfernter Augpunkt - Beeinflusst die Berechnung von Spiegelungen / Highlights - Annahme über den Augpunkt bei der Berechnung des Vektors von einer Polygon-Ecke zum Augpunkt - Unendlich entfernter Augpunkt: Vektor von Polygon-Ecke zum Augpunkt wird als konstant angenommen und nur einmal berechnet - Lokaler Augpunkt: Vektor wird für jede Ecke und für aktuellen Augpunkt neu berechnet Realistischere Resultate Kostet mehr Rechenleistung - Anwendung: gllightmodeli(gl_light_model_local_viewer, GL_TRUE); 2-21
2.10 Lichtquellen und Zweiseitige - Bietet die Möglichkeit, für Vorder- und Rückseiten der Polygone unterschiedliche Materialeigenschaften zu verwenden - Vorteil: Vielfältigere Darstellungsmöglichkeiten - Nachteil: Rechenintensiver - Defaulteinstellung: ausgeschaltet - Anwendung: gllightmodeli(gl_light_model_two_side, GL_TRUE); 2-22
2.10 Lichtquellen und Sekundäre spiegelnde Farbe - Emissive, ambiente, diffuse und spiegelnde Farbe werden typischerweise getrennt berechnet und anschließend aufaddiert - Per Default wird Texture-Mapping nach der soperation ausgeführt - Spiegelnde Highlights werden möglicherweise verdeckt - Abhilfe: Getrennte Berechnung der spiegelnden Beiträge der nach dem Texture-Mapping - Anwendung: gllightmodeli(gl_light_model_color_control, GL_SEPARATE_SPECULAR_COLOR); bzw. gllightmodeli(gl_light_model_color_control, GL_SINGLE_COLOR); 2-23
2.10 Lichtquellen und Aktivieren der - glenable(gl_lighting); Aktivieren der einzelnen Lichtquellen - glenable(gl_light<i>); 2-24
Aufgabe Bewegte Lichtquellen - Spezifizieren Sie eine einfache Szene bestehend aus einem Torus - Definieren Sie eine feststehende rote Lichtquelle - Lassen Sie eine grüne Lichtquelle um den Torus rotieren 2-25
2.11 Materialeigenschaften Materialeigenschaften / Reflexionsverhalten von Materialien - Ambiente Reflexion - Diffuse Reflexion - Spiegelnde Reflexion - Emission 2-26
2.11 Materialeigenschaften Lokales smodell in OpenGL für n Lichtquellen k s 2-27
2.11 Materialeigenschaften Definition des Reflexionsverhaltens - Festlegung der Materialparameter void glmateriali(glenum face, GLenum pname, GLint parameter) void glmaterialf(glenum face, GLenum pname, GLfloat parameter) void glmaterialiv(glenum face, GLenum pname, GLint *parameter) void glmaterialfv(glenum face, GLenum pname, GLfloat *parameter) - Legt die emissive, ambiente, diffuse und spiegelnde Farbe des Materials fest - Der Parameter face legt fest, auf welche Seite sich die Materialeigenschaften beziehen - GL_FRONT - GL_BACK - GL_FRONT_AND_BACK 2-28
2.11 Materialeigenschaften Materialparameter - GL_AMBIENT Ambiente Farbe des Materials Defaultwert: (0.2, 0.2, 0.2, 1.0) als RGBA-Wert - GL_DIFFUSE Diffuse Farbe des Materials Defaultwert: (0.8, 0.8, 0.8, 1.0) - GL_AMBIENT_AND_DIFFUSE Gleichzeitige Definition des ambienten und diffusen Reflexionsverhaltens - GL_SPECULAR Farbe des Materials bei Defaultwert: (0.0, 0.0, 0.0, 1.0) spiegelnder Reflexion - GL_SHININESS Exponent der spiegelnden Defaultwert: 0.0 Reflexion - GL_EMISSION Emissive Farbe des Materials Defaultwert: (0.0, 0.0, 0.0, 1.0) 2-29
2.11 Materialeigenschaften Diffuse und ambiente Reflexion - Diffuse und ambiente Reflexionseigenschaften des Materials können sowohl getrennt als auch gemeinsam gesetzt werden - Diffuse und ambiente Reflexion liefern typischerweise die gleiche Farbe - Anwendung: GLfloat mat_amb_diff[]={0.1, 0.7, 0.54, 1.0}; glmaterialfv(gl_front_and_back, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff); 2-30
2.11 Materialeigenschaften Spiegelnde Reflexion - Erzeugt spiegelnde Highlights - Hängt von Position der Lichtquelle und Augpunkt ab - Spiegelnder Anteil des smodells: s - GL_SPECULAR bestimmt spiegelndes Reflexionsverhalten K s - GL_SHININESS den Exponenten in der sformel - Anwendung: GLfloat mat_specular[]={1.0, 1.0, 0.1, 1.0}; GLfloat shininess = 5.0; glmaterialfv(gl_front, GL_SPECULAR, mat_specular); glmaterialf(gl_front, GL_SHININESS, shininess); 2-31
2.11 Materialeigenschaften Emission - Definiert ein Eigenleuchten der entsprechenden Materialien - Wird genutzt um Lampen oder ähnliches zu simulieren - Achtung: Die Objekte wirken NICHT als Lichtquellen auf andere Objekte! - Anwendung: GLfloat mat_emission[]={1.0, 0.3, 0.1, 1.0}; glmaterialfv(gl_front, GL_EMISSION, mat_emission); 2-32
2.11 Materialeigenschaften Beispielprogramm - material.c (Siehe Website) 2-33
2.11 Materialeigenschaften Color Material Modus - Methode zur Performance-Steigerung - Wendet die jeweils durch glcolor..() definierte Farbe auf einen Materialmodus an void glcolormaterial(glenum face, GLenum mode); - face kann folgende Werte annehmen: - GL_FRONT, GL_BACK, GL_FRONT_AND_BACK (Default) - mode kann die entsprechenden Werte für die verschiedenen Reflexionseigenschaften eines Materials annehmen: - GL_AMBIENT, GL_DIFFUSE, GL_AMBIENT_AND_DIFFUSE (Default), GL_SPECULAR, GL_EMISSION - Zu jeder Zeit ist nur ein Modus aktiv 2-34
2.11 Materialeigenschaften Beispiel glenable(gl_color_material); glcolormaterial(gl_front, GL_DIFFUSE); glcolor3f(0.2, 0.5, 0.7); // draw some objects... glcolormaterial(gl_front, GL_SPECULAR); glcolor3f(0.9, 0.1, 0.1); // draw some other objects with same diffuse material // properties but different specular properties gldisable(gl_color_material); 2-35
2.11 Materialeigenschaften Beispielprogramm - colormat.c (Siehe Website) 2-36
Aufgabe Materialien für Objekte in der Szene Ihres Projektes - Definieren Sie geeignete Materialeigenschaften für die Oberflächen der Objekte Ihres Projektes - Definieren Sie einige Lichtquellen, um die Szene zu beleuchten - Bewegen Sie eine Lichtquelle mit dem Augpunkt - Bewegen Sie eine Lichtquelle (z.b. per Maus oder Tastatur) um die Szene 2-37