Vorstellung des Roboterfußball-Teams TORF (Vortrag)
2010-JOGL-06-Licht-und-Material
1. CARL
VON
OSSIETZKY
Licht & Material
Johannes Diemke
¨
Ubung im Modul OpenGL mit Java
Wintersemester 2010/2011
2. Motivation
Licht & Material
Geometrisch gut aussehende Modelle allein sind nicht ausreichend
Ein realistisches visuelles Erscheinungsbild ben¨tigt mehr
o
Lichtquellen
Materialien
Texturen
Nebel
Transparenz
Schatten
...
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/26
4. Grundlagen
Lichtquellen
Menschen sehen Objekte, indem Photonen ihr Auge erreichen
Prallen von der Ober߬che ab
a
Werden von der Ober߬che emittiert
a
Photonen stammen von anderen Objekten oder Lichtquellen
Directional Lights
Point Lights
Spot Lights
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/26
5. Grundlagen
Lichtquellen (Forts.)
Alle drei Lichtquellen haben Gemeinsamkeiten
Intensit¨t
a
Farbe (RGB Werte)
Weitere Unterteilung m¨glich
o
Ambiente Farbintensit¨t
a
Diffuse Farbintensit¨t
a
Spiegelnde Farbintensit¨t
a
Notation Beschreibung
samb ambiente Intensit¨t
a
sdiff diffuse Intensit¨t
a
sspec spiegelnde Intensit¨t
a
spos Position der Lichtquelle (vierelementig)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/26
6. Grundlagen
Lichtquellen (Forts.)
Unterteilung ist nicht physikalisch korrekt
Gibt aber viel Kontrolle uber Erscheinungsbild
¨
Spot Lights besitzen weitere Parameter
Richtungsvektor
Cutt-Off Winkel
Spot Exponent
Notation Beschreibung
sdir Richtung des Spot Lights
scut Cutt-Off Winkel des Lichtkegels
sexp Spot Exponent zur Kontrolle der D¨mpfung
a
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/26
7. Grundlagen
Material
In Echtzeit-Computergrafik Systemen besitzen Materialien folgende
Parameter
Notation Beschreibung
mamb Ambiente Materialfarbe
mdiff Diffuse Materialfarbe
mspec Spiegelnde Materialfarbe
mshi Shininess Parameter (Skalar)
memi Emissive Materialfarbe
Die Farbe einer Ober߬che wird durch dessen Materialeigenschaften,
a
den Eigenschaften der Lichtquelle und dem Beleuchtungsmodell
bestimmt
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/26
8. Grundlagen
Beleuchtung
Bezeichnet Interaktion zwischen Material, Licht und Geometrie
Shading
Prozess der Beleuchtungsberechnung und Bestimmung der daraus
resultierenden Farben eines Pixels
Drei verschiedene Shading Typen
Flat, Gouraud und Phong
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/26
9. Grundlagen
Beleuchtungsmodelle
Die Beleuchtung wird mittels eines Beleuchtungsmodells berechnet
Unterteilung in Komponenten
Ambient
Diffus
Spiegelnd
Hat nicht viel mit der Realit¨t zu tun
a
itot = iamb + idiff + ispec
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/26
10. Grundlagen
Einschub: komponentenweise Multiplikation von Vektoren
Ausschließlich f¨r Farbvektor-Operationen sinnvoll
u
Farben werden durch vierelementige Vektoren repr¨sentiert in denen
a
jedes Element im Intervall [0, 1] liegt
u1 v1 u1 · v1
:= u2 · v2
u2 v2
u⊗v=
u3 ⊗ v3
u3 · v3
u4 v4 u4 · v4
mdiff ⊗ sdiff beschreibt bspw. die Tatsache, das Oberfl¨chen nur
a
Photonen mit der Farbe der Oberfl¨che diffus reflektieren k¨nnen
a o
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/26
11. Grundlagen
Ambiente Komponente
Ad hoc Versuch Licht zu ber¨cksichtigen, das von anderen
u
Ober߬chen kommt
a
Indirekte Beleuchtung durch Lichtreflexion zwischen Objekten
iamb = mamb ⊗ samb
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/26
12. Grundlagen
Diffuse Komponente
Basiert auf Lamberts Gesetz
Photonen streuen gleichm¨ßig in alle Richtungen
a
idiff = max((n · l), 0)mdiff ⊗ sdiff
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/26
13. Grundlagen
Spiegelnde Komponente
Basiert auf dem Phong Beleuchtungsmodell (nicht Phong Shading)
Simuliert Glanzlicht
ispec = max((r · v), 0)mshi mspec ⊗ sspec , r = 2(n · l)n − l
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/26
14. Grundlagen
Spiegelnde Komponente (Forts.)
mshi beschreibt wie gl¨nzend ein Material erscheint
a
Je gr¨ßer mshi ist, desto gl¨nzender das Material
o a
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/26
15. Licht & Material
Licht in OpenGL
Maximal 8 Lichter in der Fixed Function Pipeline
Verwendet Variante des Phong Beleuchtungsmodells
Blinn–Phong
Beleuchtungsberechnung pro Vertex
M¨gliche Shading Typen
o
Flat
Gouraud
M¨gliche Licht Typen
o
Directional Lights
Point Lights
Spot Lights
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/26
16. Licht & Material
Licht in OpenGL (Forts.)
Ein- und Ausschalten der Beleuchtungsberechnung
gl.glEnable(GL2.GL_LIGHTING);
gl.glDisable(GL2.GL_LIGHTING);
Jedes der 8 m¨glichen Lichter muss einzeln ein- und ausgeschaltet
o
werden
gl.glEnable(GL2.GL_LIGHT0);
gl.glEnable(GL2.GL_LIGHT7);
// draw fully lit deathstar
gl.glDisable(GL2.GL_LIGHT0);
gl.glDisable(GL2.GL_LIGHT7);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 16/26
17. Licht & Material
Licht in OpenGL (Forts.)
Setzen der Parameter einer Lichtquelle
gl.glEnable(GL2.GL_LIGHTING);
gl.glEnable(GL2.GL_LIGHT0);
float[] ambientLight = {0.0f, 0.0f, 0.0f, 1.0f};
float[] diffuseLight = {1.0f, 1.0f, 1.0f, 1.0f};
float[] specularLight = {1.0f, 1.0f, 1.0f, 1.0f};
float[] lightPosition = {0.0f, 0.0f, 0.0f, 1.0f};
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, specularLight, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0);
Aber das ist noch lange nicht alles . . .
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/26
18. Licht & Material
Point Lights
Licht strahlt gleichm¨ßig in alle Richtungen
a
Wird definiert durch Setzen der w -Komponente der Lichtposition
auf w = 1
float[] lightPosition = {point.x, point.y, point.z, 1.0f};
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 18/26
19. Licht & Material
Directional Lights
Simulation von Lichtquellen mit unendlicher Entfernung
Alle Lichtstrahlen verlaufen parallel
Wird definiert durch Setzen der w -Komponente der Lichtposition
auf w = 0
Position wird dann als Vektor in Richtung der Lichtquelle interpretiert
float[] lightPosition = {vector.x, vector.y, vector.z, 0.0f};
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 19/26
20. Licht & Material
Spot Lights
Simulation von Scheinwerferlicht
Definition analog zu Pointlights mit w = 1
Spezielle Spotlightparameter
Spotlight Cutoff (≥ 180 ergibt wieder ein Pointlight)
Spotlight Direction
Spotlight Exponent
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 20/26
22. Licht & Material
¨
Alle Parameter im Uberblick
Setzen aller Parameter einer Lichtquelle
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, specularLight, 0);
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_CONSTANT_ATTENUATION, constantAttenuation);
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_LINEAR_ATTENUATION, linearAttenuation);
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_QUADRATIC_ATTENUATION, quadraticAttenuation);
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_SPOT_CUTOFF, spotCutoff);
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_SPOT_EXPONENT, spotExponent);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPOT_DIRECTION, spotDirection, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 22/26
23. Licht & Material
Material
Bestimmt Materialeigenschaften
Reflexion des ambienten, diffusen und spiegelnden Lichts
Eigene Lichtemission und Gl¨nzen
a
float[] matAmbient = {0.0f, 0.0f, 0.0f, 1.0f};
float[] matDiffuse = {0.0f, 0.0f, 0.0f, 1.0f};
float[] matSpecular = {0.0f, 0.0f, 0.0f, 1.0f};
float[] matEmission = {0.0f, 0.0f, 0.0f, 1.0f};
float matShininess = 0.0f;
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT, matAmbient, 0);
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_DIFFUSE, matDiffuse, 0);
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SPECULAR, matSpecular, 0);
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_EMISSION, matEmission, 0);
gl.glMaterialf(GL2.GL_FRONT, GL2.GL_SHININESS, matShininess);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 23/26
24. Licht & Material
Material (Forts.)
Zusammenfassen der Materialparameter zu einer Klasse
Material material = new Material();
material.setAmbient(0.2f, 0.2f, 0.2f, 1.0f);
material.setDiffuse(0.5f, 0.56f, 0.5f, 1.0f);
material.setSpecular(Color.ORANGE);
material.setEmission(0,0,0,0);
material.setShininess(12.0f);
material.bind(gl);
deathstar.draw(gl);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 24/26
25. Literatur
Dave Shreiner
OpenGL Programming Guide
http://www.opengl-redbook.com/
Richard S. Wright, Benjamin Lipchak und Nicholas Haemel
OpenGL SuperBibel
http://www.starstonesoftware.com/OpenGL/
Randi J. Rost
OpenGL Shading Language
http://www.3dshaders.com/
Tomas Akenine-M¨ller, Eric Haines und Naty Hoffman
o
Real-Time Rendering
http://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 25/26
26. Literatur
Edward Angel
Interactive Computer Graphics
http://www.cs.unm.edu/˜angel/
Gerald Farin und Dianne Hansford
Practical Linear Algebra
http://www.farinhansford.com/books/pla/
Fletcher Dunn und Ian Parberry
3D Math Primer for Graphics and Game Development
www.gamemath.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 26/26