• Keine Ergebnisse gefunden

(13) Licht und Materialien

N/A
N/A
Protected

Academic year: 2022

Aktie "(13) Licht und Materialien"

Copied!
61
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

(13) Licht und Materialien

Vorlesung

„Computergraphik I“

S. Müller

(2)

x

z

y

0

u

C A

y

xz

y

xz

-f (r,t)

-n (l,b)

(

1,1,1

)

(-1,-1,-1)

y

x

z

Modell/Weltkoordinaten Kamerakoordinaten

View Frustum Kanonisches Volumen

p R T S T

V M

M M

p

MODELVIEW

PROJECTION M

M

L R PERSP

ORTHO

 

 

 

 

 

 

'

= ⋅ ⋅

⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅

(3)

Viewport: OpenGL

1 1

-1

xy

-1 b/2

h/2

-h/2

xy

-b/2

2 2

'

2 2

'

h p

h p

b p

b p

y y

x x

+

=

+

=

0 b

p'

x

− 1

x

=

p p

x

= 1

x y

0 b

h

( 1 )

2

'

z

= 1 ⋅ p

z

+

p

(4)

OpenGL Rendering Pipeline

p R T S T

V p

MODELVIEW

M

 

 

 

 

 ' = ⋅ ⋅ ⋅ ⋅ ⋅ ⋅

'

'' M M M p

p

PROJECTION

M

L R PERSP

ORTHO

 

 

 = ⋅ ⋅

Division durch homogene Koordinate

Kamera im Ursprung, Blickrichtung entlang der negativen z-Achse (Rechtssystem)

Linkssystem: z-Achse nicht-linear skaliert, kanonisches Volumen vor perspektivischer Division, hier wird geclippt.

Kanonisches Volumen

Bildschirm- bzw.

Fensterkoordinaten, z-Wert zwischen (0,1), Rasterisierung

Viewport-Transformation

(5)

Clipping

(6)

Clipping

Wo?

-n

-f

(l,t)

(r,b)

1

x

y

z (w,w,w)

(-w,-w,-w)

2

x

y

z (1,1,1)

(-1,-1,-1)

3

(7)

Problem mit Option 1

Ebenengleichungen der Clippingebenen nicht so einfach zu bestimmen, bzw. Tests komplexer

-n

-f

(l,t)

(r,b)

(8)

Option 3?

x y

z

(-1,-1,-1)

(1,1,1)

0 1

0 0

1 0

1 1 1

0

=

 =

 

 

 

 

 

 

 −

 

 

=

y z

y x

n AX

 

Bestimmung der Ebenengleichungen der Clipebenen:

0 1

0 1

0 1

0 1

0 1

0 1

= +

= +

= +

=

=

=

z y x z y

Ergebnis:

x

Sieht einfach aus, aber…

(9)

z

z

n f nf p

p ' = + −

Problem mit Option 3

Unstetigkeit in der z-Transformation:

pz

p'z

f n

f n

n+f z-Werte kleiner 0 werden auf z‘- Werte größer n+f „geflippt“, was Clipping schwierig macht.

(10)

The winner is…(in OpenGL)

Clipping in homogenen Koordinaten (Option 2)

Wie berechnet man da die Clippingebenen?

(

l,t, n

)

(

l,b,n

)

(

r,b, n

) (

r,t, n

)



 

 ⋅ ⋅ f

n t f n

l f , ,



 

 ⋅ ⋅ f

n t f n

r f , ,



 

 ⋅ ⋅ f

n b f n

r f , ,

 

 

 

 

+ −

= ⋅



 



 

n p

n f f p n

p p

w p p p

z z

y x

z y x

' ' '

Ursprüngliches Frustum Perspekt. Transformation

(11)

Clipebenen im homogenen Raum

( l , t , n , 1 )

( l , b , n , 1 )

( r , b , n , 1 )

( r , t , n , 1 )

 

 

 ⋅ ⋅ ⋅

n f n f f n t f n

l f , , ,

 

 

 ⋅ ⋅ ⋅

n f n f f n t f n

r f , , ,

 

 

 ⋅ ⋅ ⋅

n f n f f n b f n

r f , , ,

Beispiel Ebene 2:

0 .

; − =

= wt bzw y wt

y

1 2

Beispiel Ebene 1:

0 .

; − =

= wr bzw x wr

x

l=b=n= -1; r=t=f= 1

(12)

Ergebnis

Clipebenen

0 )

6

0 )

5

0 )

4

0 )

3

0 )

2

0 )

1

= +

= +

= +

=

=

=

w z

w y

w x

w z

w y

w x

(4D Raum hier etwas „vereinfacht“ dargestellt, da w nicht konstant…)

xy

z

(-w,-w,-w)

(w,w,w)

2

6 1

(13)

Begründung 1

(l,t,n)

(l,b,n)

(r,b,n) (r,t,n)

f

n t f n l f , ,

f

n t f n r f , ,

f

n b f n

r f , , n

a b

1) Ausgangssituation: Viewing Frustum

 −

= 0 0 l r a

=

n f

n t t f

n l l f

b

( )( )

( ) Div durch(r l)(nf n)

l r n t t f

l r n f a

b

n

=

×

= .

0

= t n n

0

Linkssystem (!):

2) Berechnung der Normalen

(l,t,n,1)

(l,b,n,1)

(r,b,n,1) (r,t,n,1)

n f n f f n t f n

l f , , ,

n f n f f n t f n

r f , , ,

n f n f f n b f n

r f , , ,

+

=





n p

n f f p n

p p

w p p p

z z

y x

z y x

' ' '

3) Perspektivische Projektion liefert:

(14)

Begründung 2

4) Transformation der Normalen

( ) 



+

fn f n

fn n

n

1 0 0

1 0

0 0

0 0

1 0

0 0

0 1





0 0 t n





= t 0 1 0

Transponierte Inverse der Projektionsmatrix

Richtungsvektor:

hom. Koord. 0

(l,t,n,1)

(l,b,n,1)

(r,b,n,1) (r,t,n,1)

n f n f f n t f n

l f , , ,

n f n f f n t f n

r f , , ,

n f n f f n b f n

r f , , ,

n

= 0 n AX

= 0

wt

y

Beispiel: obere Ebene: ein Punkt X ist dann Teil der Ebene, wenn gilt:

0 0 1 0

1

=













t n

t l

w z y x

5) Bestimmung der Ebenengleichung

6) Nach der orthographischen Projektion (analog für andere Ebenen) (Vorsicht: 4D Raum hier etwas vereinfacht dargestellt…)

0 0 0 0 0 0

= +

= +

= +

=

=

=

w z

w y

w x

w z

w y

w x

x y

z

(-w,-w,-w)

(w,w,w)

(15)

Beispiel 1

Nach der perspektivischen Projektion (vor der perspektivischen Division) seien zwei Punkte A und B gegeben. Gesucht ist die geclippte Linie:

+ +

+

+ +

+

+ +

+

+

w z

w y

w x

w z

w y

w x





2 1 0 0





2 1 4 0

1) Clip-Test (Vorzeichentest) an den Clipebenen









+





=

2 1 0 0

2 1 4 0

2 1 0 0

λ X





+





=





0 0 4 0

2 1 0 0

λ w

z y x

2) Berechnung des Schnittpunkts Geradengleichung

AB A

X = + λ

2 1

0 2 4

0

=

=

=

λ λ

w y

In die Ebenengleichung





= 2 1 2 0

C





= 2 1 0 0 A





= 2 1 4 0 B

A B

C

Umsetzung mit Cohen- Sutherland Bereichscode (6 Bit)

(16)

OpenGL Rendering Pipeline

p R T S T

V p

MODELVIEW

M

 

 

 

 

 ' = ⋅ ⋅ ⋅ ⋅ ⋅ ⋅

'

'' M M M p

p

PROJECTION

M

L R PERSP

ORTHO

 

 

 = ⋅ ⋅

Division durch homogene Koordinate

Kamera im Ursprung, Blickrichtung entlang der negativen z-Achse (Rechtssystem)

Linkssystem: z-Achse nicht-linear skaliert, kanonisches Volumen vor perspektivischer Division, hier wird geclippt.

Kanonisches Volumen

Bildschirm- bzw.

Fensterkoordinaten, z-Wert zwischen (0,1), Rasterisierung

Viewport-Transformation

(17)

Typische Programmstruktur

void display(void) {

glClear (GL_COLOR_BUFFER_BIT);

glColor3f (0.0, 0.0, 0.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(0,0,1, 0,0,0, 0,1,0);

glTranslatef(0,0,-1);

glRotatef(alpha, 1.0, 0.0, 0.0);

glRotatef(beta, 0.0, 1.0, 0.0);

glRotatef(gamma, 0.0, 0.0, 1.0);

glutWireTeapot(0.5);

glFlush ();

}

void reshape (int w, int h) {

glViewport(0,0,(GLsizei) w, (GLsizei) h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(90.0, (float) w/h, 1, 120);

glMatrixMode(GL_MODELVIEW);

}

sphere_pers.c

(18)

Nachtrag: Perspektive

Am Beispiel der Kugel wird das Problem sehr schön deutlich

Blick auf die Kugel entspricht einem Kegel

Projektion auf Bildebene entspricht einem

Kegelschnitt

Ellipse

Je größer der

Kameraöffnungswinkel

gewählt wird, desto schiefer („ellipsiger“) werden die

Kugeln

Das gleiche beim RayTracer

Bildebene Augpunkt

Blickrichtung

(19)

Vorsicht bei Perspektive:

Öffnungswinkel nicht zu groß wählen!

90° 60° 45°

(20)

Rasterisierung

Wie bekommt man die z-Koordinate innerhalb einer Fläche?

Genauso wie die Farbe, durch lineare Interpolation (Gouraud- Shading):

( )

1

2 1 l L

L l

A= ⋅ + − ⋅

( )

1

2 1 r R

R r

E = ⋅ + − ⋅

(

t

)

A

E t

P = ⋅ + 1− ⋅

L

1

L

2

R

1

R

2

A P E

wobei

- L1,L2,R1,R2,A,E,P in 2D-

Bildschirmkoordinaten gegeben sind

- mit Hilfe der r,l,t Werte die

entsprechenden Werte (Farbe, Tiefenwert) interpoliert werden

(21)

Nichtlin. Skalierung p '

z

= n + f nf p

z

n f

n f

p'

z

p

z

L

1

L

2

R

1

R

2

A P E

Dürfen diese Tiefenwerte im Bild linear interpoliert werden?

(22)

Genauere Betrachtung

1 1

-1

xz

y

-1

0

Perspektivische Projektion

verändert auch die Koordinaten!

A‘

E‘

P‘ t‘

1-t‘ P t

E

t

t ' ≠

(23)

Wie hängt t und t‘ zusammen?

 

 

 +

 

⋅ 

 =

 

y x y

x y

x

a t a

e t e p

p

' ) '

' 1 ' (

' ' '

'

 

 

 =

 

z y

z x

y x

p np

p np

p p ' '

 

 

 +

 

⋅ 

 =

 

⋅ 

y x y z

x y z

x

z

a

a a

t n e

e e

t n p

p p

n ' ( 1 ' )

A‘

E‘

P‘t‘

1-t‘ P t

E

 

 

 +

 

⋅ 

 =

 

y x z

z y

x z

z y

x

a a a

t p e

e e

t p p

p ' ( 1 ' )

t 1 − t

Gerade im Bild

… entstand aus perspekt. Projektion

z z

e t p t = ' ⋅

z z

a t p

t = − ⋅

− ) ( 1 ' )

1 (

Wichtig später für Texturen !

(24)

Bedeutung

Bei der Rasterisierung gehen wir im Bild die Scanlines durch (dies entspricht dem Parameter t‘) und erhalten den Punkte p‘ im Bild.

Der dazugehörige Punkt p im Raum ist nicht mit dem gleichen Parameter t‘ zu erreichen. (Längenverhält- nisse sind bei perspektivischen Projektionen nicht invariant).

Hierfür müssen wir den Parameter rückprojizieren mit:

z z

e t p t = ' ⋅

z z

a t p

t = − ⋅

− ) ( 1 ' )

1 (

e p

w t w t = ' ⋅

a p

w t w

t = − ⋅

− ) ( 1 ' )

1

(

bzw.

(25)

Was passiert genau mit z ?

Der gültige z-Wert ergibt sich durch die Interpolation im 3D

A‘

E‘

P‘t‘

1-t‘ P t

z E

z

z

t e t a

p = ⋅ + ( 1 − ) ⋅

Gerade im 3D

Ersetzen durch t‘ im Bild

ergibt:

Umformung lie- fert schließlich:

z z

e t p

t = ' ⋅

(1-t)… wäre ge-

nauso möglich

z z

z z z

z z

a

e t p e e

t p

p = ' ⋅ ⋅ + ( 1 − ' ⋅ ) ⋅

( )

z z

z

t a

t e p

' 1 1 1

1 '

− +

=

(26)

Bedeutung

Wir dürfen die z-Werte der Eckpunkte im Bild nicht linear interpolieren!

Tatsächlich ergibt sich der entsprechende z-Wert eines Punktes p durch lineare Interpolation der 1/z Werte der Eckpunkte.

( )

z z

z

t a

t e p

' 1 1 1

1 '

− +

=

(27)

Tiefenwert in OpenGL…

…darf direkt linear interpoliert werden.

A‘

E‘

P‘t‘

1-t‘ P t

E

z z

z

t e t a

p ' = ' ⋅ ' + ( 1 − ' ) ⋅ '

Gerade im Bild

Denn für den Tiefen- wert tragen wir nicht z ein, sondern:

z

z

n f nf p

p ' = + −

(

z

) (

z

)

z

t n f nf e t n f nf a

p nf f

n + − = ' ⋅ + − + ( 1 − ' ) ⋅ + −

z z

z

t a

t e p

) 1 ' 1 1 (

1 '

− +

=

Einsetzen:

liefert:

(28)

Das heißt …

In OpenGL dürfen die

Tiefenwerte der Eckpunkte direkt interpoliert werden.

Hier liefert die lineare

Interpolation der Tiefenwerte bei der Rasterisierung die

perspektivisch korrekten z-Werte.

Wir sparen uns also die Division durch die z-Koordinaten pro Pixel bei der Rasterisierung

Bei den Texturen ist dagegen eine Rückprojektion der

Parameter (pro Pixel) notwendig:

A‘

E‘

P‘t‘

1-t‘ P t

z E

z

z

t e t a

p ' = ' ⋅ ' + ( 1 − ' ) ⋅ '

z z

z

t a

t e p

) 1 ' 1 1 (

1 '

− +

=

e p

w t w t = ' ⋅

a p

w t w

t = − ⋅

− ) ( 1 ' )

1 (

entspricht:

(29)

Beispiel

Teapot und umgebender Würfel bei z = -2

Perspektivische Projektion mit Öffnungswinkel 60° auf ein quadratisches Fenster im Tiefenbereich von 1 bis 3

xz

y

0

(30)

Ergebnis

Perspektivischer Blick von vorne Orthographische

Projektion von vorne

x z

y

0

(31)

Was passiert, …

Frage: was passiert, wenn man Rotation auf Projektionsmatrix ausführt?

glViewport(0,0,300,300);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glRotatef(alpha, 0.0, 1.0, 0.0);

gluPerspective(60,1,1,3);

draw();

(32)

Rotation der Projektionsmatrix

Orthogr. Transformation mit Rotation:

Der Blick von der Seite auf das Viewfrustum mit äquidistanten z-Werten

Persp. Transformation mit Rotation:

Der Blick von der Seite auf das kanonische Volumen (nicht-lineare Skalierung der z-Werte)

(ursprüngliche Blickrichtung) (ursprüngliche Blickrichtung)

(33)

Weiteres Beispiel

xz

y

0

Rechteck, unterteilt in gleiche Quadrate, füllt das View

Frustum wie gezeichnet aus.

(34)

Ergebnis

Resultat: man sieht, dass die Koordinaten im Bild nicht direkt als Texturkoordinaten interpretiert werden dürfen.

Der (orthographische) Blick von der Seite auf das View Frustum mit äquidistanten z-Werten

(urspr. Blickrichtung)

(35)

View Frustum von der Seite

Persp. Transformation:

Der Blick von der Seite auf das kanonische Volumen

„gestauchtes“ Frustum (urspr. Blickrichtung)

 

 

 =

 

 

z z y

z x

z y x

p p np

p np

p p p ' ' '

 

 

− +

 =

 

 

z z y

z x

z y x

p nf f

n

p np

p np

p p p ' ' '

(urspr. Blickrichtung)

„gestauchtes“ Frustum mit nicht-linearer z-Skalierung

(36)

Das letzte Beispiel zeigt…

… warum die Tiefenwerte (1/z-Werte) bei der

Rasterisierung linear interpoliert werden dürfen/müssen

Die Texturkoordinaten aber noch perspektivisch verzerrt werden müssen

persp_volume2.c

(37)

Fazit

Bei OpenGL werden im Tiefenpuffer die 1/z-Werte eingetragen

Nach einer perspektivischen Projektion werden

die Tiefenwerte bei der Rasterisierung linear interpoliert (ähnlich den Farben, etc.)

• effiziente Lösung, da wir nicht bei der Rasterisierung durch z teilen müssen

bei den Texturkoordinaten muß hier noch p

z

/a

z

bzw. w

z

/w

a

korrigiert werden, da sonst perspektivisch nicht korrekt

verzerrt.

(38)

Materialien und Beleuchtung

(39)

Zusätzliche Eckpunktattribute

State machine: an jedem Eckpunkt wird der aktuelle Zustand verwendet, d.h. erst muß die Farbe etc.

definiert werden, dann der Eckpunkt glBegin(GL_POLYGON);

glColor3f(1,0,0);

glVertex3f(0,0,0);

glVertex3f(1,0,0);

glVertex3f(.5,1,0);

glEnd();

(40)

Zusätzliche Eckpunktattribute

Änderungen pro Eckpunkt möglich glBegin(GL_POLYGON);

glColor3f(0,0,1);

glVertex3f(0,0,0);

glColor3f(0,0,1);

glVertex3f(1,0,0);

glColor3f(1,0,0);

glVertex3f(.5,1,0);

glEnd();

(41)

Farbinterpolation

Die Farbe muß nicht interpoliert werden

glShadeModel( {GL_FLAT,GL_SMOOTH} ); bestimmt, ob interpoliert wird

bei GL_FLAT bestimmt die Farbe des letzten Eckpunktes (Ausnahme GL_POLYGON: erster)

1.

5.

4.

3.

2.

6.

1.

5.

4.

3.

2.

6.

GL_FLAT

GL_SMOOTH

(42)

Beleuchtung

Ohne Beleuchtung wirken die Objekte sehr flach, Formen sind schwer zu erkennen

OpenGL verwendet klassisches Beleuchtungsmodell:

allgemeines Umgebungslicht

Lichtquellen und Materialien mit

• Umgebungslicht (ambient)

• diffuser Reflexion (diffuse)

• spiegelnder Reflexion (specular)

• Eigenausstrahlung von Materialien (emission)

(43)

Diffuse Oberfläche (Lambert…)

In der Computergraphik werden Oberflächen- materialien oft als „ideal diffus“ betrachtet.

Egal von welcher Richtung man auf die Fläche sieht:

sie wirkt immer gleich hell.

Beispiel: Blatt Papier

M

d

(44)

Diffuse Oberfläche (Lambert…)

Entscheidend ist aber der Einfallswinkel des Lichts

ϕ

M

d

ϕ M

d

ϕ M

d

Senkrechter Lichteinfall:

Sehr hell Waagrechter Lichteinfall:

Sehr dunkel

(45)

Lambert-Gesetz

ϕ

M

d

ϕ

M

d

ϕ

M

d

Die „sichtbare“ Fläche nimmt mit dem cos des Einfallswinkels ab:

ϕ

⋅ cos

 

 

 ⋅

 

 

b g r

b g r

L L L M

M M

Materialfarbe · Lichtfarbe

·

cosϕ ϕ: Winkel zwischen Oberflächen- normalen und Lichteinfall

ϕ A

n

ϕ

⋅ cos A

(46)

Bemerkung

Bei den Farben handelt es sich um rgb-Vektoren

Die Multiplikation ist eine „komponentenweise“

Multiplikation (Licht hat seine eigene Mathematik …)

Beispiel:

Material rot, Licht 1 ist weiß (Resultat: rotes Licht)

Material rot, Licht 2 ist grün (Resultat: schwarz)

ϕ

⋅ cos

 

 

 ⋅

 

 

b g r

b g r

L L L M

M

M

(47)

Spiegelnder Term (Phong …)

Glanz/Spiegelung tritt entlang des reflektierten Lichtvektors auf

Blickt man in die „Spiegelung“ des Lichtvektors, ist der Glanz sehr hell.

ψ

ψ

n

b g r

b g r

L L L M

M M

⋅ cos

 

 

 ⋅

 

 

n: Glanzzahl

ψ: Winkel zw. reflektiertem

Lichtstrahl und Blickrichtung

(48)

Glanzzahl

= 0

n n = 1

= 5

n n = 100

N = 5 N = 15

ψ

cos

n

ψ

(49)

Phong-Beleuchtungsmodell

Materialien bestehen aus

Diffuser Komponente

Spiegelnder Komponente

Problem

„Abgewandte“ Flächen sind schwarz

Lösung:

Ambienter Term

Wird immer aufaddiert

( )

i

Lq i

i n s

i d

a

d

L M M L

M

L = ⋅ + ∑ ⋅ + ⋅

=

# 1

cos

cos ϕ ψ

(50)

Phong-Beleuchtungsmodell

M

d

: diffuse Materialfarbe

M

s

: spiegelnde Materialfarbe L

a

: ambiente Lichtfarbe

L

i

: Farbe der Lichtquelle i n: Glanzahl

Alle Terme (M, L) sind rgb- Farben

Für den zu beleuchtenden Oberflächenpunkt muss die Normale bekannt sein

Freiheit: die Materialfarbe kann von der spiegelnden Materialfarbe verschieden sein

Problem: Die Summe aller Farben kann größer 1

( )

i

Lq i

i n s

i d

a

d

L M M L

M

L = ⋅ + ∑ ⋅ + ⋅

=

# 1

cos

cos ϕ ψ

(51)

OpenGL-Beleuchtung

Klassisches

Beleuchtungsmodell

Viele Freiheiten

Die einzelnen Anteile werden dann aufsummiert um die Farbe des Punktes zu erhalten

Werte größer 1 werden auf 1 geclampt

Global

Ambiente Lichtfarbe

Materialien

Emissionsfarbe

Ambiente Reflexion(sfarbe)

Diffuse Reflexion(sfarbe)

Spiegelnde Reflexion(sfarbe)

Glanzzahl

Für jede Lichtquelle

Position

Ambiente Lichtfarbe

Diffuse Lichtfarbe

Spiegelnde Lichtfarbe

( )

=

⋅ +

⋅ +

⋅ +

⋅ +

=

Lq

i

i s i

n s

i d i

d i

a a

a a

e

M L M L M L M L

M L

# 1

, ,

,

cos ϕ cos ψ

(52)

Materialemission

Emission dient zur Simulation selbstleuchtender Materialien, die allerdings keine anderen Objekte beleuchten. Die Emissionsfarbe wird einfach als Basishelligkeit genommen.

Parameter: Emissionsfarbe M

e

( )

=

⋅ +

⋅ +

⋅ +

⋅ +

= Lq

i

i s i n s

i d i d

i a a a

a

e M L M L M L M L

M L

# 1

, ,

, cosϕ cos ψ

(53)

Ambiente Beleuchtung

Simuliert gestreutes Umgebungslicht

völlig unabhängig von der Geometrie

Parameter: Ambiente Reflexion(sfarbe) M

a

, ambiente Lichtfarbe L

a

Gibt es als globalen Wert und pro Lichtquelle

( )

=

⋅ +

⋅ +

⋅ +

⋅ +

= Lq

i

i s i n s

i d i d

i a a a

a

e M L M L M L M L

M L

# 1

, ,

, cosϕ cos ψ

(54)

Diffuse Beleuchtung

Entspricht der Abstrahlung matter Oberflächen

abhängig von Oberflächennormale und Lichteinfall

Parameter: Diffuse Reflexion(sfarbe) M

d

, Lichtfarbe L

d

ϕ

M

d

( )

=

⋅ +

⋅ +

⋅ +

⋅ +

= Lq

i

i s i n s

i d i d

i a a a

a

e M L M L M L M L

M L

# 1

, ,

, cosϕ cos ψ

(55)

Spiegelnde “Beleuchtung”

simuliert Spiegelungseffekte

abhängig von Blickrichtung und reflekt. Lichtrichtung

Parameter: Spiegelnde Reflexion(sfarbe) M

s

&

Lichtfarbe L

s

, Glanzzahl n

ψ

N = 5 N = 15

( )

=

⋅ +

⋅ +

⋅ +

⋅ +

= Lq

i

i s i n s

i d i d

i a a a

a

e M L M L M L M L

M L

# 1

, ,

, cosϕ cos ψ

(56)

Materialien

Ähnlich wie bei den Lichtquellen über eine Funktion:

glMaterial{if}[v](side, name, value);

side: GL_FRONT, GL_BACK oder GL_FRONT_AND_BACK

name: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR,

GL_EMISSION, GL_AMBIENT_AND_DIFFUSE erwarten eine RGBA-Farbe

Die Glanzzahl kann über GL_SHININESS gesetzt werden

lightmaterial.exe

Nate Robin

(57)

Lichtquellen

von einigen Features gibt es mehr als eine Instanz, z.B. Lichtquellen, Clip-Planes etc.

diese werden meist über eine Funktion, die als ersten Parameter eine Kennzeichnung der Instanz hat,

manipuliert, z.B.

glLightf( GL_LIGHT0, …, … );

setzt einen Wert für die 1. Lichtquelle

die Konstanten sind fortlaufend nummeriert

GL_<CONST>i = GL_<CONST>0 + i

(58)

Lichtquellenparameter

Alle Parameter werden gesetzt durch

glLight{if}[v](GL_LIGHTi, GLenum name, value);

die maximale Lichtquellen-Anzahl kann durch

glGet(GL_MAX_LIGHTS) abgefragt werden (typischerweise 8 Lichtquellen)

jede Lichtquelle hat 3 Farbwerte (jeweils RGBA):

ambiente Stärke (GL_AMBIENT)

diffuse Stärke (GL_DIFFUSE)

spekulare Stärke (GL_SPECULAR)

(59)

Lichtquellenparameter

Jede Lichtquelle hat eine GL_POSITION

Homogene Koordinate entscheidet, ob

Punktlichtquelle oder „gerichtete Lichtquelle“

4 elementiger Vektor v

• v[3]==0 => gerichtete Lichtquelle

• v[3]==1 => Punkt- oder Spotlichtquelle

Referenzen

ÄHNLICHE DOKUMENTE

Franz Kohnle Seite 1 von

Der Weg für Verhandlungen über die Zeit jenseits der ersten Kyoto-Periode wurde also in Montreal geebnet. Dies war im Vorfeld der Konferenz aufgrund der von vielen

int_einzelueberstunde = InputBox(&#34;Geben Sie die Überstunden eines Tages ein&#34;) Frage: In welche Zeile (vor, innerhalb oder nach der For...Next-Schleife) muß diese

Bis heute konn- te man die ersten Sterne noch nicht finden, es ist aber davon auszugehen, dass sie sich sehr von den Sternen wie wir sie heute beobachten k¨ onnen un-

China keine massive Finanzkrise er- lebt, werden die hierzu erforderlichen Voraussetzungen – eine voll konver- tierbare Währung, eine unabhängige und im Kampf gegen die

unter Angabe von Tag, Monat und Jahr enthalten, wenn not- wendig auch Informationen zur Haltbarkeit nach dem Öff- nen des Behältnisses oder nach Herstellung der gebrauchsferti-

Susanne Göttker beschreibt diese Entwicklung von den ersten Überlegungen zum kooperativen Bestandsaufbau über den Aus- bau der überregionalen Literaturversorgung mithilfe der

Raphaela Etzold: Gleichberechtigung in erster Instanz — 2019/3/6 — Seite III — le-tex..