licht & material - informatik.uni-oldenburg.detrigger/content/opengl/opengl... · johannes...
TRANSCRIPT
C A R LV O N
O S S I E T Z K Y
Licht & Material
Johannes Diemke
Ubung im Modul OpenGL mit JavaWintersemester 2010/2011
Motivation
Licht & Material
Geometrisch gut aussehende Modelle allein sind nicht ausreichend
Ein realistisches visuelles Erscheinungsbild benotigt mehr
I LichtquellenI MaterialienI TexturenI NebelI TransparenzI SchattenI . . .
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/26
Motivation
Licht & Material
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/26
Grundlagen
LichtquellenMenschen sehen Objekte, indem Photonen ihr Auge erreichen
I Prallen von der Oberflache abI Werden von der Oberflache emittiert
Photonen stammen von anderen Objekten oder LichtquellenI Directional LightsI Point LightsI Spot Lights
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/26
Grundlagen
Lichtquellen (Forts.)Alle drei Lichtquellen haben Gemeinsamkeiten
I IntensitatI Farbe (RGB Werte)
Weitere Unterteilung moglichI Ambiente FarbintensitatI Diffuse FarbintensitatI Spiegelnde Farbintensitat
Notation Beschreibungsamb ambiente Intensitat
sdiff diffuse Intensitat
sspec spiegelnde Intensitat
spos Position der Lichtquelle (vierelementig)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/26
Grundlagen
Lichtquellen (Forts.)Unterteilung ist nicht physikalisch korrekt
I Gibt aber viel Kontrolle uber Erscheinungsbild
Spot Lights besitzen weitere Parameter
I RichtungsvektorI Cutt-Off WinkelI Spot Exponent
Notation Beschreibungsdir Richtung des Spot Lights
scut Cutt-Off Winkel des Lichtkegels
sexp Spot Exponent zur Kontrolle der Dampfung
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/26
Grundlagen
Material
In Echtzeit-Computergrafik Systemen besitzen Materialien folgendeParameter
Notation Beschreibungmamb Ambiente Materialfarbe
mdiff Diffuse Materialfarbe
mspec Spiegelnde Materialfarbe
mshi Shininess Parameter (Skalar)
memi Emissive Materialfarbe
Die Farbe einer Oberflache wird durch dessen Materialeigenschaften,den Eigenschaften der Lichtquelle und dem Beleuchtungsmodellbestimmt
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/26
Grundlagen
BeleuchtungBezeichnet Interaktion zwischen Material, Licht und Geometrie
ShadingProzess der Beleuchtungsberechnung und Bestimmung der darausresultierenden Farben eines PixelsDrei verschiedene Shading Typen
I Flat, Gouraud und Phong
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/26
Grundlagen
Beleuchtungsmodelle
Die Beleuchtung wird mittels eines Beleuchtungsmodells berechnet
Unterteilung in KomponentenI AmbientI DiffusI Spiegelnd
Hat nicht viel mit der Realitat zu tun
itot = iamb + idiff + ispec
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/26
Grundlagen
Einschub: komponentenweise Multiplikation von Vektoren
Ausschließlich fur Farbvektor-Operationen sinnvoll
Farben werden durch vierelementige Vektoren reprasentiert in denenjedes Element im Intervall [0, 1] liegt
u ⊗ v =
u1u2u3u4
⊗
v1v2v3v4
:=
u1 · v1u2 · v2u3 · v3u4 · v4
mdiff ⊗ sdiff beschreibt bspw. die Tatsache, das Oberflachen nurPhotonen mit der Farbe der Oberflache diffus reflektieren konnen
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/26
Grundlagen
Ambiente Komponente
Ad hoc Versuch Licht zu berucksichtigen, das von anderenOberflachen kommt
Indirekte Beleuchtung durch Lichtreflexion zwischen Objekten
iamb = mamb ⊗ samb
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/26
Grundlagen
Diffuse KomponenteBasiert auf Lamberts Gesetz
Photonen streuen gleichmaßig in alle Richtungen
idiff = max((n · l), 0)mdiff ⊗ sdiff
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/26
Grundlagen
Spiegelnde KomponenteBasiert 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
Grundlagen
Spiegelnde Komponente (Forts.)
mshi beschreibt wie glanzend ein Material erscheint
Je großer mshi ist, desto glanzender das Material
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/26
Licht & Material
Licht in OpenGL
Maximal 8 Lichter in der Fixed Function Pipeline
Verwendet Variante des Phong Beleuchtungsmodells
I Blinn–Phong
Beleuchtungsberechnung pro Vertex
Mogliche Shading Typen
I FlatI Gouraud
Mogliche Licht Typen
I Directional LightsI Point LightsI Spot Lights
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/26
Licht & Material
Licht in OpenGL (Forts.)
Ein- und Ausschalten der Beleuchtungsberechnung
gl.glEnable(GL2.GL_LIGHTING);
gl.glDisable(GL2.GL_LIGHTING);
Jedes der 8 moglichen Lichter muss einzeln ein- und ausgeschaltetwerden
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
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
Licht & Material
Point LightsLicht strahlt gleichmaßig in alle Richtungen
Wird definiert durch Setzen der w -Komponente der Lichtpositionauf 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
Licht & Material
Directional LightsSimulation von Lichtquellen mit unendlicher EntfernungAlle Lichtstrahlen verlaufen parallelWird definiert durch Setzen der w -Komponente der Lichtpositionauf w = 0
I 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
Licht & Material
Spot LightsSimulation von Scheinwerferlicht
Definition analog zu Pointlights mit w = 1Spezielle Spotlightparameter
I Spotlight Cutoff (≥ 180 ergibt wieder ein Pointlight)I Spotlight DirectionI Spotlight Exponent
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 20/26
Licht & Material
Spot Lights (Forts.)
Setzen der Spot Light Parameter
float[] spotDirection = {0.0f, 0.0f, -1.0f};
float spotExponent = 0.0f;
float spotCutoff = 30.0f;
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);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/26
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
Licht & Material
MaterialBestimmt Materialeigenschaften
I Reflexion des ambienten, diffusen und spiegelnden LichtsI Eigene Lichtemission und Glanzen
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
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
Literatur
� Dave ShreinerOpenGL Programming Guidehttp://www.opengl-redbook.com/
� Richard S. Wright, Benjamin Lipchak und Nicholas HaemelOpenGL SuperBibelhttp://www.starstonesoftware.com/OpenGL/
� Randi J. RostOpenGL Shading Languagehttp://www.3dshaders.com/
� Tomas Akenine-Moller, Eric Haines und Naty HoffmanReal-Time Renderinghttp://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 25/26
Literatur
� Edward AngelInteractive Computer Graphicshttp://www.cs.unm.edu/˜angel/
� Gerald Farin und Dianne HansfordPractical Linear Algebrahttp://www.farinhansford.com/books/pla/
� Fletcher Dunn und Ian Parberry3D Math Primer for Graphics and Game Developmentwww.gamemath.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 26/26