Licht & Material
Licht & Material
Licht & Material
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
C A R L<br />
V O N<br />
O S S I E T Z K Y<br />
<strong>Licht</strong> & <strong>Material</strong><br />
Johannes Diemke<br />
Übung im Modul OpenGL mit Java<br />
Wintersemester 2010/2011
Motivation<br />
<strong>Licht</strong> & <strong>Material</strong><br />
Geometrisch gut aussehende Modelle allein sind nicht ausreichend<br />
Ein realistisches visuelles Erscheinungsbild benötigt mehr<br />
◮ <strong>Licht</strong>quellen<br />
◮ <strong>Material</strong>ien<br />
◮ Texturen<br />
◮ Nebel<br />
◮ Transparenz<br />
◮ Schatten<br />
◮ . . .<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/26
Motivation<br />
<strong>Licht</strong> & <strong>Material</strong><br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/26
Grundlagen<br />
<strong>Licht</strong>quellen<br />
Menschen sehen Objekte, indem Photonen ihr Auge erreichen<br />
◮ Prallen von der Oberfläche ab<br />
◮ Werden von der Oberfläche emittiert<br />
Photonen stammen von anderen Objekten oder <strong>Licht</strong>quellen<br />
◮ Directional Lights<br />
◮ Point Lights<br />
◮ Spot Lights<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/26
Grundlagen<br />
<strong>Licht</strong>quellen (Forts.)<br />
Alle drei <strong>Licht</strong>quellen haben Gemeinsamkeiten<br />
◮ Intensität<br />
◮ Farbe (RGB Werte)<br />
Weitere Unterteilung möglich<br />
◮ Ambiente Farbintensität<br />
◮ Diffuse Farbintensität<br />
◮ Spiegelnde Farbintensität<br />
Notation<br />
s amb<br />
s diff<br />
s spec<br />
s pos<br />
Beschreibung<br />
ambiente Intensität<br />
diffuse Intensität<br />
spiegelnde Intensität<br />
Position der <strong>Licht</strong>quelle (vierelementig)<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/26
Grundlagen<br />
<strong>Licht</strong>quellen (Forts.)<br />
Unterteilung ist nicht physikalisch korrekt<br />
◮ Gibt aber viel Kontrolle über Erscheinungsbild<br />
Spot Lights besitzen weitere Parameter<br />
◮ Richtungsvektor<br />
◮ Cutt-Off Winkel<br />
◮ Spot Exponent<br />
Notation<br />
s dir<br />
s cut<br />
s exp<br />
Beschreibung<br />
Richtung des Spot Lights<br />
Cutt-Off Winkel des <strong>Licht</strong>kegels<br />
Spot Exponent zur Kontrolle der Dämpfung<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/26
Grundlagen<br />
<strong>Material</strong><br />
In Echtzeit-Computergrafik Systemen besitzen <strong>Material</strong>ien folgende<br />
Parameter<br />
Notation<br />
m amb<br />
m diff<br />
m spec<br />
m shi<br />
m emi<br />
Beschreibung<br />
Ambiente <strong>Material</strong>farbe<br />
Diffuse <strong>Material</strong>farbe<br />
Spiegelnde <strong>Material</strong>farbe<br />
Shininess Parameter (Skalar)<br />
Emissive <strong>Material</strong>farbe<br />
Die Farbe einer Oberfläche wird durch dessen <strong>Material</strong>eigenschaften,<br />
den Eigenschaften der <strong>Licht</strong>quelle und dem Beleuchtungsmodell<br />
bestimmt<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/26
Grundlagen<br />
Beleuchtung<br />
Bezeichnet Interaktion zwischen <strong>Material</strong>, <strong>Licht</strong> und Geometrie<br />
Shading<br />
Prozess der Beleuchtungsberechnung und Bestimmung der daraus<br />
resultierenden Farben eines Pixels<br />
Drei verschiedene Shading Typen<br />
◮ Flat, Gouraud und Phong<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/26
Grundlagen<br />
Beleuchtungsmodelle<br />
Die Beleuchtung wird mittels eines Beleuchtungsmodells berechnet<br />
Unterteilung in Komponenten<br />
◮ Ambient<br />
◮ Diffus<br />
◮ Spiegelnd<br />
Hat nicht viel mit der Realität zu tun<br />
i tot = i amb + i diff + i spec<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/26
Grundlagen<br />
Einschub: komponentenweise Multiplikation von Vektoren<br />
Ausschließlich für Farbvektor-Operationen sinnvoll<br />
Farben werden durch vierelementige Vektoren repräsentiert in denen<br />
jedes Element im Intervall [0, 1] liegt<br />
u ⊗ v =<br />
⎛<br />
⎜<br />
⎝<br />
⎞ ⎛<br />
u 1<br />
u 2<br />
⎟<br />
u 3<br />
⎠ ⊗ ⎜<br />
⎝<br />
u 4<br />
⎞ ⎛<br />
v 1<br />
v 2<br />
⎟<br />
v 3<br />
⎠ := ⎜<br />
⎝<br />
v 4<br />
⎞<br />
u 1 · v 1<br />
u 2 · v 2<br />
⎟<br />
u 3 · v 3<br />
⎠<br />
u 4 · v 4<br />
m diff ⊗ s diff beschreibt bspw. die Tatsache, das Oberflächen nur<br />
Photonen mit der Farbe der Oberfläche diffus reflektieren können<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/26
Grundlagen<br />
Ambiente Komponente<br />
Ad hoc Versuch <strong>Licht</strong> zu berücksichtigen, das von anderen<br />
Oberflächen kommt<br />
Indirekte Beleuchtung durch <strong>Licht</strong>reflexion zwischen Objekten<br />
i amb = m amb ⊗ s amb<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/26
Grundlagen<br />
Diffuse Komponente<br />
Basiert auf Lamberts Gesetz<br />
Photonen streuen gleichmäßig in alle Richtungen<br />
i diff = max((n · l), 0)m diff ⊗ s diff<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/26
Grundlagen<br />
Spiegelnde Komponente<br />
Basiert auf dem Phong Beleuchtungsmodell (nicht Phong Shading)<br />
Simuliert Glanzlicht<br />
i spec = max((r · v), 0) m shi<br />
m spec ⊗ s spec ,<br />
r = 2(n · l)n − l<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/26
Grundlagen<br />
Spiegelnde Komponente (Forts.)<br />
m shi beschreibt wie glänzend ein <strong>Material</strong> erscheint<br />
Je größer m shi ist, desto glänzender das <strong>Material</strong><br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/26
<strong>Licht</strong> & <strong>Material</strong><br />
<strong>Licht</strong> in OpenGL<br />
Maximal 8 <strong>Licht</strong>er in der Fixed Function Pipeline<br />
Verwendet Variante des Phong Beleuchtungsmodells<br />
◮ Blinn–Phong<br />
Beleuchtungsberechnung pro Vertex<br />
Mögliche Shading Typen<br />
◮ Flat<br />
◮ Gouraud<br />
Mögliche <strong>Licht</strong> Typen<br />
◮ Directional Lights<br />
◮ Point Lights<br />
◮ Spot Lights<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/26
<strong>Licht</strong> & <strong>Material</strong><br />
<strong>Licht</strong> in OpenGL (Forts.)<br />
Ein- und Ausschalten der Beleuchtungsberechnung<br />
gl.glEnable(GL2.GL_LIGHTING);<br />
gl.glDisable(GL2.GL_LIGHTING);<br />
Jedes der 8 möglichen <strong>Licht</strong>er muss einzeln ein- und ausgeschaltet<br />
werden<br />
gl.glEnable(GL2.GL_LIGHT0);<br />
gl.glEnable(GL2.GL_LIGHT7);<br />
// draw fully lit deathstar<br />
gl.glDisable(GL2.GL_LIGHT0);<br />
gl.glDisable(GL2.GL_LIGHT7);<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 16/26
<strong>Licht</strong> & <strong>Material</strong><br />
<strong>Licht</strong> in OpenGL (Forts.)<br />
Setzen der Parameter einer <strong>Licht</strong>quelle<br />
gl.glEnable(GL2.GL_LIGHTING);<br />
gl.glEnable(GL2.GL_LIGHT0);<br />
float[] ambientLight = {0.0f, 0.0f, 0.0f, 1.0f};<br />
float[] diffuseLight = {1.0f, 1.0f, 1.0f, 1.0f};<br />
float[] specularLight = {1.0f, 1.0f, 1.0f, 1.0f};<br />
float[] lightPosition = {0.0f, 0.0f, 0.0f, 1.0f};<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, specularLight, 0);<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0);<br />
Aber das ist noch lange nicht alles . . .<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/26
<strong>Licht</strong> & <strong>Material</strong><br />
Point Lights<br />
<strong>Licht</strong> strahlt gleichmäßig in alle Richtungen<br />
Wird definiert durch Setzen der w-Komponente der <strong>Licht</strong>position<br />
auf w = 1<br />
float[] lightPosition = {point.x, point.y, point.z, 1.0f};<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0);<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 18/26
<strong>Licht</strong> & <strong>Material</strong><br />
Directional Lights<br />
Simulation von <strong>Licht</strong>quellen mit unendlicher Entfernung<br />
Alle <strong>Licht</strong>strahlen verlaufen parallel<br />
Wird definiert durch Setzen der w-Komponente der <strong>Licht</strong>position<br />
auf w = 0<br />
◮ Position wird dann als Vektor in Richtung der <strong>Licht</strong>quelle interpretiert<br />
float[] lightPosition = {vector.x, vector.y, vector.z, 0.0f};<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0);<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 19/26
<strong>Licht</strong> & <strong>Material</strong><br />
Spot Lights<br />
Simulation von Scheinwerferlicht<br />
Definition analog zu Pointlights mit w = 1<br />
Spezielle Spotlightparameter<br />
◮ Spotlight Cutoff (≥ 180 ergibt wieder ein Pointlight)<br />
◮ Spotlight Direction<br />
◮ Spotlight Exponent<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 20/26
<strong>Licht</strong> & <strong>Material</strong><br />
Spot Lights (Forts.)<br />
Setzen der Spot Light Parameter<br />
float[] spotDirection = {0.0f, 0.0f, -1.0f};<br />
float spotExponent = 0.0f;<br />
float spotCutoff = 30.0f;<br />
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_SPOT_CUTOFF, spotCutoff);<br />
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_SPOT_EXPONENT, spotExponent);<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPOT_DIRECTION, spotDirection, 0);<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/26
<strong>Licht</strong> & <strong>Material</strong><br />
Alle Parameter im Überblick<br />
Setzen aller Parameter einer <strong>Licht</strong>quelle<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, specularLight, 0);<br />
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_CONSTANT_ATTENUATION, constantAttenuation);<br />
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_LINEAR_ATTENUATION, linearAttenuation);<br />
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_QUADRATIC_ATTENUATION, quadraticAttenuation);<br />
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_SPOT_CUTOFF, spotCutoff);<br />
gl.glLightf(GL2.GL_LIGHT0, GL2.GL_SPOT_EXPONENT, spotExponent);<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPOT_DIRECTION, spotDirection, 0);<br />
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0);<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 22/26
<strong>Licht</strong> & <strong>Material</strong><br />
<strong>Material</strong><br />
Bestimmt <strong>Material</strong>eigenschaften<br />
◮ Reflexion des ambienten, diffusen und spiegelnden <strong>Licht</strong>s<br />
◮ Eigene <strong>Licht</strong>emission und Glänzen<br />
float[] matAmbient = {0.0f, 0.0f, 0.0f, 1.0f};<br />
float[] matDiffuse = {0.0f, 0.0f, 0.0f, 1.0f};<br />
float[] matSpecular = {0.0f, 0.0f, 0.0f, 1.0f};<br />
float[] matEmission = {0.0f, 0.0f, 0.0f, 1.0f};<br />
float matShininess<br />
= 0.0f;<br />
gl.gl<strong>Material</strong>fv(GL2.GL_FRONT, GL2.GL_AMBIENT, matAmbient, 0);<br />
gl.gl<strong>Material</strong>fv(GL2.GL_FRONT, GL2.GL_DIFFUSE, matDiffuse, 0);<br />
gl.gl<strong>Material</strong>fv(GL2.GL_FRONT, GL2.GL_SPECULAR, matSpecular, 0);<br />
gl.gl<strong>Material</strong>fv(GL2.GL_FRONT, GL2.GL_EMISSION, matEmission, 0);<br />
gl.gl<strong>Material</strong>f(GL2.GL_FRONT, GL2.GL_SHININESS, matShininess);<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 23/26
<strong>Licht</strong> & <strong>Material</strong><br />
<strong>Material</strong> (Forts.)<br />
Zusammenfassen der <strong>Material</strong>parameter zu einer Klasse<br />
<strong>Material</strong> material = new <strong>Material</strong>();<br />
material.setAmbient(0.2f, 0.2f, 0.2f, 1.0f);<br />
material.setDiffuse(0.5f, 0.56f, 0.5f, 1.0f);<br />
material.setSpecular(Color.ORANGE);<br />
material.setEmission(0,0,0,0);<br />
material.setShininess(12.0f);<br />
material.bind(gl);<br />
deathstar.draw(gl);<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 24/26
Literatur<br />
<br />
<br />
<br />
<br />
Dave Shreiner<br />
OpenGL Programming Guide<br />
http://www.opengl-redbook.com/<br />
Richard S. Wright, Benjamin Lipchak und Nicholas Haemel<br />
OpenGL SuperBibel<br />
http://www.starstonesoftware.com/OpenGL/<br />
Randi J. Rost<br />
OpenGL Shading Language<br />
http://www.3dshaders.com/<br />
Tomas Akenine-Möller, Eric Haines und Naty Hoffman<br />
Real-Time Rendering<br />
http://www.realtimerendering.com/<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 25/26
Literatur<br />
<br />
<br />
<br />
Edward Angel<br />
Interactive Computer Graphics<br />
http://www.cs.unm.edu/˜angel/<br />
Gerald Farin und Dianne Hansford<br />
Practical Linear Algebra<br />
http://www.farinhansford.com/books/pla/<br />
Fletcher Dunn und Ian Parberry<br />
3D Math Primer for Graphics and Game Development<br />
www.gamemath.com/<br />
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 26/26