31.01.2014 Aufrufe

Licht & Material

Licht & Material

Licht & Material

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!