08 opengl pipeline [kompatibilitätsmodus]€¦ · bildschirm-(genauer „window“-) koordinaten,...

Post on 18-Oct-2020

3 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

(8) OpenGL-Pipeline

VorlesungC t fik“„Computergrafik“

T. Grosch

yvpRTSTVMMMp

MODELVIEWPROJECTIONMM

LRPERSPORTHOv

44 344 21 K4444 34444 21

v ⋅⋅⋅⋅⋅⋅⋅⋅⋅= →'

uv yvxv

PROJECTIONM

xv0

AC

zv

zvAC

yvModell/Weltkoordinaten Kamerakoordinaten

yxv

-f (r,t) (1,1,1)yv xv

zv

-n zv

(l,b)(-1,-1,-1)

View Frustum Kanonisches Volumen

T. Grosch - 2 -

Viewport

Viewport-Transformationzv

yv yv

zv

Viewport-Transformation

(1,1,1)z

(1,1,1)

xv

(-1 -1 -1)

xv

(-1 -1 -1)( 1, 1, 1) (-1,-1,-1)

Transformation des kanonischen VolumensTransformation der xy-Koordinaten aus (-1 1) in dieTransformation der xy-Koordinaten aus (-1,1) in die Bildschirm- (genauer „Window“-) koordinaten, z.B. (0,599)x(0,599)Transformation der z-Koordinaten aus (-1,1) in den Bereich (0,1) für z-Buffer

T. Grosch - 4 -

Viewport Transformation (xy-Werte)Viewport Transformation (xy-Werte)yv

yv

höhez.B. Fenster der Größe 600x600 Pixel

1

zv

y

-1 1

xv00 breite

1

1

xv-1

-1

T. Grosch - 5 -

Bildschirmkoordinatensystemyv

BildschirmkoordinatensystemEin Bildschirmfenster der

(0;h-1) (b-1;h-1)

Ein Bildschirmfenster der Höhe h und der Breite b hat Pixelkoordinaten in x-Richtung von 0 bis b 1; in y

y = h-0.5

Richtung von 0 bis b-1; in y-Richtung von 0 bis h-1 Die Pixelkoordinaten sind die Mittelpunkte der quadratischen Pixel mit Kantenlänge 1

…g

(0;0) (b-1;0) xvx = -0.5 x = b-0.5

y = -0.5

T. Grosch - 6 -

Bildschirmkoord system OpenGLBildschirmkoord.system OpenGLOffset des Pixelmittelpunktes

yvOffset des Pixelmittelpunktes um 0.5

(0.5;h-0.5) (b-0.5;h-0.5)

y = h

(0 0 )(0.5;0.5) (b-0.5;0.5) xv0 x = b

T. Grosch - 7 -

Viewport in OpenGLViewport in OpenGL

yv

1yv

h/2yv y

h

1xv

-1 b/2xv

-b/2…

1 h/2

-1 -h/2

22' bb 1 1

xv0 b

22'22'

hphpbpbp

yy

xx

+⋅=+⋅=

0 bxp'1−=xp 1=xp

T. Grosch - 8 -

ViewportViewport

Es ist wichtig wie die Pixel nachher bei derEs ist wichtig, wie die Pixel nachher bei der Rasterisierung angesprochen werdenBei OpenGL:Bei OpenGL:

Das gesamte Clip-Volumen wird auf den darstellbaren Fensterbereich abgebildetVerwendet man Anti-Aliasing durch Subpixelstrukturen, so kommen keine „zusätzlichen“ Regionen dazu, die bereits weg-geclippt sind.g g pp

OpenGL

22' bpbp +⋅=

22'22

hphpbpbp

yy

xx

+⋅=+

T. Grosch - 9 -

Viewport: AllgemeinViewport: AllgemeinAngaben in hAngaben in FensterkoordinatenOpenGL-Kommando

lVi t( GLi t b h)

h

bglViewport( GLint x, y, b, h); (x, y) b

Viewport :

(0,0)hhxbpbp

Viewport

xx ++⋅=22'22'

:

( )11' += ppzv

1zv

2zv

1

yhphp yy ++⋅= 22'

( )12

+⋅= zz pp 1

-1

2

0

1

0

T. Grosch - 10 -

Viewport als MatrixViewport als MatrixViewportM

⎟⎟⎞

⎜⎜⎛ +

200

2xbb

Viewport

⎟⎟⎟

⎜⎜⎜

+2

02

022

yhh

⎟⎟⎟⎟

⎜⎜⎜⎜

21

2100

22

lVi (GLd bl b h)

⎟⎠

⎜⎝ 1000

22

glViewport(GLdouble x, y, b, h);

T. Grosch - 11 -

BeispielBeispiel

Viewport.c Viewport.exe

T. Grosch - 12 -

Typisches ProgrammTypisches Programmvoid display() void init(){

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ...

{glClearColor( 0.0, 0.0, 0.0, 0.0);glEnable( GL_DEPTH_TEST);

}glutSwapBuffers();

}

void reshape( int w, int h)

void main( int argc, char **argv){

glutInit(&argc, argv);{

glViewport( 0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);glutInitWindowSize(600,600);glutCreateWindow(„...");

gluPerspective(45, (float)w/h, 1.0, 20.0);

glMatrixMode(GL_MODELVIEW);

glutIdleFunc(idle);glutSpecialFunc(special);glutMouseFunc(mouse);

glLoadIdentity();}

glutMotionFunc(motion);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutDisplayFunc(display);g p y p yinit();glutMainLoop();

} T. Grosch - 13 -

OpenGL Rendering PipelineOpenGL Rendering PipelineKamera im Ursprung, Blickrichtung entlang

der negativen z Achse (Rechtssystem)der negativen z-Achse (Rechtssystem)

Linkssystem: z-Achse (noch) linear skaliert, kanonisches Volumen vor perspekt. Division

Linkssystem: z-Achse nicht-linear skaliert, kanonisches Volumen nach

perspektivischer Division: [-1,1]³

kanonisches Volumen vor perspekt. Division

12

pRTSTVp v44 344 21 K

v ⋅⋅⋅⋅⋅⋅='Bildschirm- bzw.

Fensterkoordinaten[0 b 1] x [0 h 1] x [0 1]

23

MODELVIEWM2

''' pMMMp LRPERSPORTHOv

4444 34444 21v ⋅⋅⋅= →

[0,b-1] x [0,h-1] x [0,1]4

PROJECTIONM

Division durch homogene Koordinate

Viewport-Transformation ''''' pMp Vi tvv ⋅=Viewport Transformation

T. Grosch - 14 -

pMp Viewport

Clipping

ClippingClippingWo?

-f

yv

-n(l,t)

( b)

yzv

(w,w,w) yv

(r,b)1xv(-w,-w,-w)

2

zv

(1,1,1)

2xv

(-1,-1,-1)

3

T. Grosch - 16 -

Problem mit Option 1Problem mit Option 1-f

-n(l,t)

Ebenengleichungen der Clippingebenen nicht so

(r,b)

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

T. Grosch - 17 -

Option 3?Option 3?yv

zvBestimmung der Ebenengleichungen der Clipebenen:z

(1,1,1)0

⎞⎛⎤⎡ ⎞⎛⎞⎛

=nAX vo

de C pebe e

xv

(-1,-1,-1)0101

011

=−⇒=⎟⎟⎟⎞

⎜⎜⎜⎛

⎥⎥⎤

⎢⎢⎡

⎟⎟⎟⎞

⎜⎜⎜⎛

−⎟⎟⎟⎞

⎜⎜⎜⎛

yyx

o

01 ⎟⎠

⎜⎝⎥

⎥⎦⎢

⎢⎣

⎟⎠

⎜⎝

⎟⎠

⎜⎝ z

0101

=−=−

yx

Ergebnis:

0101

=+=−

xz

Sieht einfach aus, aber…

0101

=+=+

zy

T. Grosch - 18 -

Problem mit Option 3Problem mit Option 3Unstetigkeit in der z-Transformation:

zp'

zz pnffnp −+='

Unstetigkeit in der z Transformation:

f

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

zpfn

f

n

Werte größer n f „geflippt , was Clipping schwierig macht.

zfn yv

zv

(1,1,1)

xv

(-1,-1,-1)

( , , )

A BA´

A´´Beispiel: Der Punkt A liegt vor der near-PlaneEigentlich sollte die Linie A´B gezeichnet werdenStattdessen wird die Linie A´´B gezeichnet ( )

T. Grosch - 19 -

Festlegung OpenGL: Option 2Festlegung OpenGL: Option 2

ClipebenenClipebenen

0)1 =−wx

yv

zv

0)30)20)1

==−=

wzwywx z

(w,w,w)2

0)50)40)3

=+=−

wxwz

6 1

0)60)5

=+=+

wzwy xv(-w,-w,-w)

6

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

T. Grosch - 20 -

Festlegung OpenGL: Option 2Festlegung OpenGL: Option 2

ClipebenenClipebenen

0)1 =−wx

yv

zv

0)30)20)1

==−=

wzwywx z

(w,w,w)2

0)50)40)3

=+=−

wxwz

6 1

0)60)5

=+=+

wzwy xv(-w,-w,-w)

6

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

T. Grosch - 21 -

Clipping Verfahren in 3DClipping Verfahren in 3D

Clipping Linie – kanonisches Volumen (Quader)Clipping Linie – kanonisches Volumen (Quader)Cohen-Sutherland (6 Bit)Schnittpunkt Gerade – Ebene, sonst praktisch gleichp p g

Clipping Polygon – kanonisches Volumen (Quader)Sutherland-HodgmanSchnittpunkt Gerade – Ebene, sonst ähnlich

T. Grosch - 22 -

OpenGL Rendering PipelineOpenGL Rendering PipelineKamera im Ursprung, Blickrichtung entlang

der negativen z Achse (Rechtssystem)der negativen z-Achse (Rechtssystem)Linkssystem: z-Achse (noch) linear skaliert, kanonisches Volumen vor perspekt. DivisionCli i

Linkssystem: z-Achse nicht-linear skaliert, kanonisches Volumen nach

perspektivischer Division: [-1,1]³

Clipping

pRTSTVp v44 344 21 K

v ⋅⋅⋅⋅⋅⋅='Bildschirm- bzw.

Fensterkoordinaten[0 b 1] x [0 h 1] x [0 1]

MODELVIEWM2

''' pMMMp LRPERSPORTHOv

4444 34444 21v ⋅⋅⋅= →

[0,b-1] x [0,h-1] x [0,1]

PROJECTIONM

Division durch homogene Koordinate

Viewport-Transformation ''''' pMp Vi tvv ⋅=Viewport Transformation

T. Grosch - 23 -

pMp Viewport

Materialien und Beleuchtung

Bisher: EckpunktfarbenBisher: Eckpunktfarben…

Änderungen pro Eckpunkt möglichÄnderungen pro Eckpunkt möglich

glBegin(GL POLYGON);glBegin(GL_POLYGON);glColor3f(0,0,1);glVertex3f(0,0,0);glVertex3f(0,0,0);glColor3f(0,0,1);glVertex3f(1,0,0);glColor3f(1,0,0);glVertex3f(.5,1,0);glEnd();glEnd();

T. Grosch - 25 -

BeleuchtungBeleuchtung

Ohne Beleuchtung wirken die Objekte sehr flachOhne Beleuchtung wirken die Objekte sehr flach, Formen sind schwer zu erkennenOpenGL verwendet klassisches Beleuchtungsmodell:OpenGL verwendet klassisches Beleuchtungsmodell:

allgemeines UmgebungslichtLichtquellen und Materialien mit

• Umgebungslicht (ambient)• diffuser Reflexion (diffuse)

i l d R fl i ( l )• spiegelnder Reflexion (specular)• Eigenausstrahlung von Materialien (emission)

T. Grosch - 26 -

Diffuse Oberfläche (Lambert )Diffuse Oberfläche (Lambert…)

In der Computergraphik werden Oberflächen-In der Computergraphik werden Oberflächen-materialien oft als „ideal diffus“ betrachtet.Egal von welcher Richtung man auf die Fläche sieht:Egal von welcher Richtung man auf die Fläche sieht: sie wirkt immer gleich hell.Beispiel: Blatt Papierp p

dM

T. Grosch - 27 -

Diffuse Oberfläche (Lambert )Diffuse Oberfläche (Lambert…)

Entscheidend ist aber der Einfallswinkel des LichtsEntscheidend ist aber der Einfallswinkel des Lichts

ϕϕ

M

ϕ

M

ϕ

MdM dM dM

Senkrechter Lichteinfall:Sehr hell

Waagrechter Lichteinfall:S h d k lSehr hell Sehr dunkel

T. Grosch - 28 -

Lambert-Gesetznv

Lambert-GesetzDie „sichtbare“ Fläche nimmt mit dem cos des Einfallswinkels ab: ϕ

ϕcos⋅A

cos des Einfallswinkels ab:

⎟⎞

⎜⎛

⎟⎞

⎜⎛ rr LM

ϕ

Aϕcos⋅

⎟⎟⎟

⎠⎜⎜⎜

⋅⎟⎟⎟

⎠⎜⎜⎜

⎝ b

g

b

g

LL

MM

ϕ: Winkel zwischen Oberflächen-Materialfarbe · Lichtfarbe · cosϕ

ϕ: Winkel zwischen Oberflächen-normalen und Lichteinfall

ϕ ϕ ϕ

dM dM dMdM dM dM

T. Grosch - 29 -

BemerkungBemerkungBei den Farben handelt es sich um rgb-Vektoren

⎞⎛⎞⎛ LMϕcos⋅

⎟⎟⎟⎞

⎜⎜⎜⎛⋅⎟⎟⎟⎞

⎜⎜⎜⎛

g

r

g

r

LL

MM

Die Multiplikation ist eine „komponentenweise“

⎟⎠

⎜⎝

⎟⎠

⎜⎝ bb LM

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)

T. Grosch - 30 -

Spiegelnder Term (Phong )Spiegelnder Term (Phong …)

Glanz/Spiegelung tritt entlang des reflektiertenGlanz/Spiegelung tritt entlang des reflektierten Lichtvektors aufBlickt man in die „Spiegelung“ des Lichtvektors, ist derBlickt man in die „Spiegelung des Lichtvektors, ist der Glanz sehr hell.

rr LM⎟⎞

⎜⎛

⎟⎞

⎜⎛

ψn

b

g

b

g

LL

MM cos⋅

⎟⎟⎟

⎠⎜⎜⎜

⋅⎟⎟⎟

⎠⎜⎜⎜

ψ n: Glanzzahlψ: Winkel zw. reflektiertemψ

Lichtstrahl und Blickrichtung

T. Grosch - 31 -

Glanzzahl ψ ψncosGlanzzahl ψcos

0=n 1=n0n

5=n 100=n

N = 5 N = 15

T. Grosch - 32 -

Phong-BeleuchtungsmodellPhong-BeleuchtungsmodellMaterialien bestehen ausMaterialien bestehen aus

Diffuser KomponenteSpiegelnder Komponente

Problem„Abgewandte“ Flächen sind schwarz

Lösung: Ambienter TermWird immer aufaddiertWird immer aufaddiert

( ) i

Lq

in

sidad LMMLML ⋅+⋅+⋅= ∑#

coscos ψϕ( )i∑=1

T. Grosch - 33 -

Phong-BeleuchtungsmodellPhong-Beleuchtungsmodell

( )Lq

n LMMLML ++∑#

All T (M L) i d b

( ) ii

in

sidad LMMLML ⋅+⋅+⋅= ∑=1

coscos ψϕ

Md: diffuse MaterialfarbeMs: spiegelnde MaterialfarbeL : ambiente Lichtfarbe

Alle Terme (M, L) sind rgb-FarbenFür den zu beleuchtenden La: ambiente Lichtfarbe

Li: Farbe der Lichtquelle in: Glanzahl

Oberflächenpunkt muss die Normale bekannt seinFreiheit: die MaterialfarbeFreiheit: die Materialfarbe kann von der spiegelnden Materialfarbe verschieden seinseinProblem: Die Summe aller Farben kann größer 1 werden.

T. Grosch - 34 -

OpenGL-BeleuchtungOpenGL-Beleuchtung( )∑ ⋅+⋅⋅+⋅+⋅+=

Lq

isin

sididiaaaae LMLMLMLMML#

,,, coscos ψϕ

Klassisches Beleuchtungsmodell

MaterialienEmissionsfarbe

( )∑=i 1

,,,

BeleuchtungsmodellViele Freiheiten

Die einzelnen Anteile werden

EmissionsfarbeAmbiente Reflexion(sfarbe)Diffuse Reflexion(sfarbe)

dann aufsummiert um die Farbe des Punktes zu erhalten

Spiegelnde Reflexion(sfarbe)Glanzzahl

Für jede LichtquelleWerte größer 1 werden auf 1 geclippt

Global

Für jede LichtquellePositionAmbiente Lichtfarbe

GlobalAmbiente Lichtfarbe

Diffuse LichtfarbeSpiegelnde Lichtfarbe

T. Grosch - 35 -

MaterialemissionMaterialemission

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

( )∑=

⋅+⋅⋅+⋅+⋅+=Lq

iisi

nsididiaaaae LMLMLMLMML

#

1,,, coscos ψϕ

T. Grosch - 36 -

Ambiente BeleuchtungAmbiente Beleuchtung

Simuliert gestreutes UmgebungslichtSimuliert gestreutes Umgebungslichtvöllig unabhängig von der GeometrieParameter: Ambiente Reflexion(sfarbe) Ma ambienteParameter: Ambiente Reflexion(sfarbe) Ma, ambiente Lichtfarbe La

Gibt es als globalen Wert und pro LichtquelleGibt es als globalen Wert und pro Lichtquelle( )∑

=

⋅+⋅⋅+⋅+⋅+=Lq

iisi

nsididiaaaae LMLMLMLMML

#

1,,, coscos ψϕ

T. Grosch - 37 -

Diffuse BeleuchtungDiffuse Beleuchtung

Entspricht der Abstrahlung matter OberflächenEntspricht der Abstrahlung matter Oberflächenabhängig von Oberflächennormale und LichteinfallParameter: Diffuse Reflexion(sfarbe) Md Lichtfarbe LdParameter: Diffuse Reflexion(sfarbe) Md, Lichtfarbe Ld

( )∑ ⋅+⋅⋅+⋅+⋅+=Lq

isin

sididiaaaae LMLMLMLMML#

1,,, coscos ψϕ

=i 1

ϕ

dM

T. Grosch - 38 -

Spiegelnde “Beleuchtung”Spiegelnde Beleuchtung

simuliert Spiegelungseffektesimuliert Spiegelungseffekteabhängig von Blickrichtung und reflekt. LichtrichtungParameter: Spiegelnde Reflexion(sfarbe) M &Parameter: Spiegelnde Reflexion(sfarbe) Ms & Lichtfarbe Ls, Glanzzahl n

( )∑ ++++Lq

n LMLMLMLMML#

coscos ψϕ( )∑=

⋅+⋅⋅+⋅+⋅+=i

isisididiaaaae LMLMLMLMML1

,,, coscos ψϕ

ψ

N = 5 N = 15

T. Grosch - 39 -

MaterialienMaterialien

Alle Materialeigenschaften werden über eine FunktionAlle Materialeigenschaften werden über eine Funktion gesetzt:

glMaterial{if}[v](side, name, value);glMaterial{if}[v](side, name, value);side: GL_FRONT, GL_BACK oder GL_FRONT_AND_BACKname: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, GL_AMBIENT_AND_DIFFUSE erwarten eine RGBA-FarbeDie Glanzzahl kann über GL SHININESS gesetzt werdenDie Glanzzahl kann über GL_SHININESS gesetzt werden

lightmaterial.exe

Nate Robin

T. Grosch - 40 -

LichtquellenLichtquellen

von einigen Features gibt es mehr als eine Instanzvon einigen Features gibt es mehr als eine Instanz, z.B. Lichtquellen, Clip-Planes etc.diese werden meist über eine Funktion, die als erstendiese 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 nummeriertGL_<CONST>i = GL_<CONST>0 + i

T. Grosch - 41 -

LichtquellenparameterLichtquellenparameter

Alle Parameter werden gesetzt durchAlle Parameter werden gesetzt durchglLight{if}[v](GL_LIGHTi, GLenum name, value);die maximale Lichtquellen-Anzahl kann durchdie maximale Lichtquellen Anzahl kann durch glGet(GL_MAX_LIGHTS) abgefragt werden (typischerweise 8 Lichtquellen)

j d Li h ll h 3 F b (j il RGBA)jede Lichtquelle hat 3 Farbwerte (jeweils RGBA):ambiente Stärke (GL_AMBIENT)diffuse Stärke (GL DIFFUSE)diffuse Stärke (GL_DIFFUSE)spekulare Stärke (GL_SPECULAR)

T. Grosch - 42 -

LichtquellenparameterLichtquellenparameter

Jede Lichtquelle hat eine GL POSITIONJede Lichtquelle hat eine GL_POSITIONHomogene Koordinate entscheidet, ob Punktlichtquelle oder „gerichtete Lichtquelle“Punktlichtquelle oder „gerichtete Lichtquelle

4 elementiger Vektor v• v[3]==0 => gerichtete Lichtquelle• v[3]==1 => Punkt- oder Spotlichtquelle

BeispielBeispielGLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 }; Shading Modell (lineare [] { , , , };GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat position[] = { 0 0 -0 5 0 5 1 0 };

Interpolation) einschalten

Lichtquelle „Nr. 0“ Werte fGLfloat position[] { 0.0, 0.5, 0.5, 1.0 };

glShadeModel(GL_SMOOTH);

definieren

glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);

lLi h f (GL LIGHT0 GL SPECULAR l )glLightfv(GL_LIGHT0, GL_SPECULAR, specular);glLightfv(GL_LIGHT0, GL_POSITION, position);

Beleuchtung einschaltenglEnable(GL_LIGHTING);glEnable(GL_LIGHT0);

Beleuchtung einschalten

Lichtquelle „Nr. 0“ einschalten

T. Grosch - 44 -

Beispiel (cont )Beispiel (cont.)GLfloat mat emission[] = {0.0, 0.0, 0.0, 0.0}; _ [] { , , , };GLfloat mat_ambient[] = { 0.25, 0.20, 0.07, 1.0 };GLfloat mat_diffuse[] = { 0.75, 0.61, 0.23, 1.0 };GLfloat mat specular[] = { 0 63 0 56 0 37 1 0 };GLfloat mat_specular[] { 0.63, 0.56, 0.37, 1.0 };GLfloat shininess[] = { 51.0 };

glMaterialfv(GL FRONT GL EMISSION mat emission);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

lM i lf (GL FRONT GL SPECULAR l )glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, shininess);

DrawSphere(…);

T. Grosch - 45 -

Eckpunkt-NormalenEckpunkt-NormalenVon der Applikation muss die BeispieleVon der Applikation muss die Normale definiert werden

Aufruf:lN l3{ i f}[ ]()

/* Normale pro Eckpunkt */glBegin (GL ...)

Beispiele

glNormal3{s,i,f}[v]();kann für jeden Eckpunkt oder konstant für die Fläche gesetzt

d

g g ( _ )glNormal3f(…);glVertex3f(…);…

werdenNormalen werden auch transformiert

glEnd();

/* konstante Flächennormale */OpenGL generiert keine Normalen (!)

Eckpunkt-Normale = State

/* konstante Flächennormale */glNormal3f(…);glBegin (GL_...)

glVertex3f( );Eckpunkt Normale State glVertex3f(…);…

glEnd();

T. Grosch - 46 -

Flat-Shading nvFlat-ShadingMit Hilfe der Oberflächen-

3Pn

Mit Hilfe der OberflächenNormalen wird durch das Beleuchtungsmodell die Farbe der Fläche berechnet PFarbe der Fläche berechnet.Diese ist quasi konstant über die gesamte Fläche

P

2P

1P

glShadeModel(GL_FLAT);

T. Grosch - 47 -

Gouraud-Shading 3nvGouraud-ShadingMit Hilfe der Normalen an

3F

3

2nvMit Hilfe der Normalen an den Eckpunkten werden durch das Beleuchtungs-modell die Farben an den F

2

1nvF

modell die Farben an den Eckpunkten berechnet.Bei der Scan-Konvertierung

2F1

werden dann die Farben der Eckpunkte bi-linear interpoliert.

1F

p

glShadeModel(GL_SMOOTH);

T. Grosch - 48 -

Phong-Shading 3nvPhong-ShadingBei der Scan-Konvertierung

3

2nvnv

Bei der Scan Konvertierung werden die Normalen der Eckpunkte bi-linear interpoliert

2

1nvF

interpoliert.Für jedes Pixel wird das Beleuchtungsmodell

1

ausgewertet und die Farbe des Pixels bestimmt.

(In OpenGL standardmässig nicht möglich…)

T. Grosch - 49 -

OpenGLOpenGLEs gibt nur Gouraud-Es gibt nur GouraudShadingEffekt wie bei Phong-Sh di d h hShading nur durch sehr feine Unterteilung der Oberflächen

T. Grosch - 50 -

Wichtige AnmerkungenWichtige AnmerkungenEs werden nur die Eckpunkte Lichtquellen haben keineEs werden nur die Eckpunkte beleuchtet

Sind besonders starke, lokale Effekte (z B

Lichtquellen haben keine Geometrie, sind also nicht sichtbarLi ht ll dlokale Effekte (z.B.

Highlights) wichtig, müssen die Flächen von der Applikation unterteilt werden

Lichtquellen werden nur berücksichtigt, solange sie eingeschaltet sind

Applikation unterteilt werdenglColor hat – sobald GL-LIGHTING eingeschaltet ist –( d f lt) k i Ei fl

Somit kann man für verschiedene Objekte verschiedene Lichtquellen

(per default) keinen Einfluss mehr auf die Objektfarbe

Diese wird durch die

aktivieren

Materialeigenschaften bestimmt (*Alternative: glColorMaterial…)

T. Grosch - 51 -

Position der LichtquellePosition der LichtquelleDie Position (und Richtung) Unterschied zwischen:Die Position (und Richtung) der Lichtquelle wird genauso behandelt wie ein Geometrieprimitiv

glLightfv (GL_LIGHT0, GL_POSITION,pos);glRotatef( …);

GeometrieprimitivTransformation mit GL_MODELVIEW

DrawObject(…);

Licht bleibt fest

glRotatef( …);glLightfv (GL LIGHT0, GL POSITION,pos);g g ( _ , _ ,p );DrawObject(…);

Licht dreht sich mit dem ObjektObjekt

T. Grosch - 52 -

Weitere LichteinstellungenWeitere Lichteinstellungen

Über glLightModel{if}[v]( GLenum name value ) könnenÜber glLightModel{if}[v]( GLenum name, value ) können verschiedene Einstellungen gemacht werden

Ambientes BeleuchtungsmodellgSchnelle / exakte Beleuchtung glänzender FlächenBeleuchtung der Rückseiten (Normal-Flip)

glColorMaterial( GLenum side, GLenum name );glColor() in Materialeigenschaft umwandeln (schneller Materialwechsel)

T. Grosch - 53 -

Berechnung der Normalen 1nvBerechnung der NormalenWie berechnet man die Normalen B

CD

1

2nv 3nv

Wie berechnet man die Normalen für die Punkte ?

Einfache Mittelung der Normalen der angrenzenden Flächen? A

D

der angrenzenden Flächen?Besser: winkelgewichtete Normale der angrenzenden Flächen.Od flä h i ht t N l

AE

CACBn ×=1v

Oder: flächengewichtete Normale der angrenzenden Flächen.

Problem:

CACBn1

CECAn ×=2v

man braucht Nachbar-schaftsinformationen. „Welche Fläche grenzt an Punkt C ?“

CDCEn ×=3v

( )vvvv ++gDreiecke müssen im konsistenten Uhrzeigersinn definiert werden

( )321 nnnn ++=

Flächengewichtet, da ni nicht normiert (n anschließend normieren).

T. Grosch - 54 -

Fazit: BeleuchtungFazit: BeleuchtungNur angenähert durch Materialparameter bestimmen:Nur angenähert durch ambient, diffus, specularnur an Eckpunkten

Materialparameter bestimmen: glMaterial();

Wichtigste: GL_DIFFUSE, GL AMBIENT

Der Weg zur Beleuchtung:Lichtparameter bestimmen:

GL_AMBIENTLichtquellen einschalten: glEnable(GL_LIGHTi);

Lichtparameter bestimmen: glLight();

Wichtigste: GL_DIFFUSE, GL POSITION

Strom einschalten: glEnable(GL_LIGHTING);Geometrie darstellenGL_POSITION

Evtl. Lichtmodell definieren:glLightModel();

Geometrie darstellenNormalen mit glNormal();angeben

( ö li h i Li h llglLightModel();Wichtigste: GL_LIGHT_MODEL_AMBIENT

(möglichst wenig Lichtquellen verwenden, da jede extra Zeit kostet)

T. Grosch - 55 -

Lichtquellen

LichtquellenLichtquellen

Bis jetzt wurde nur von der Lichtrichtung gesprochenBis jetzt wurde nur von der Lichtrichtung gesprochen, nicht wo sie herkommtOpenGL bietet 3 verschiedene Arten Lichtquellen:OpenGL bietet 3 verschiedene Arten Lichtquellen:

gerichtetePunktSpot

T. Grosch - 57 -

Gerichtete LichtquellenGerichtete Lichtquellen

entsprechen einer unendlich weit entferntenentsprechen einer unendlich weit entfernten Lichtquelleparallel einfallende Strahlenparallel einfallende StrahlenParameter: Richtung, Farbe Definition: homogene Koordinate der Position : 0Definition: homogene Koordinate der Position : 0GLfloat position[] = { 0.0, -0.5, 0.5, 0.0 };glLightfv(GL_LIGHT0, GL_POSITION, position);

T. Grosch - 58 -

PunktlichtquellePunktlichtquelle

ein lokalisierter Punkt strahlt das Licht ausein lokalisierter Punkt strahlt das Licht ausunterschiedliche Winkel auf eine ebene FlächeParameter: Position FarbeParameter: Position, FarbeDefinition: homogene Koordinate der Position != 0GLfloat position[] = { 0 0 0 5 0 5 1 0 };GLfloat position[] = { 0.0, -0.5, 0.5, 1.0 };glLightfv(GL_LIGHT0, GL_POSITION, position);

T. Grosch - 59 -

SpotlichtquelleSpotlichtquelle

Nur um einen bestimmten Winkel um eineNur um einen bestimmten Winkel um eine angegebene Richtung wird Licht ausgestrahltje weiter von der Richtung weg desto schwächer wirdje weiter von der Richtung weg desto schwächer wird das Licht (cosn-Verteilung)Parameter: Position, Richtung, Exponent, Farbe, g, p ,

T. Grosch - 60 -

SpotlichtquellenSpotlichtquellen

haben zusätzlich zu Punktlichtquellenhaben zusätzlich zu Punktlichtquelleneine Richtung (GL_SPOT_DIRECTION)einen Öffnungswinkel (GL SPOT CUTOFF)g ( _ _ )einen Exponenten (GL_SPOT_EXPONENT)

T. Grosch - 61 -

AbschwächungAbschwächung

Punkt- oder Spotlichtquellen können ihre StärkePunkt- oder Spotlichtquellen können ihre Stärke abhängig von der Entfernung d zur Oberfläche abschwächen

d: Abstand zwischen Lichtquelle und dem Eckpunktkc: GL_CONSTANT_ATTENUATION 1a =kl: GL_LINEAR_ATTENUATION kq: GL_QUADRATIC_ATTENUATION

( )Lq#

2dkdkka

qlc ⋅+⋅+=

Abschwächungsfaktor a 1 bei gerichteten

( )∑=

⋅+⋅⋅+⋅⋅+⋅+=q

iisi

nsididiaaaae LMLMLMaLMML

1,,, coscos ψϕ

Abschwächungsfaktor a = 1 bei gerichteten Lichtquellen

T. Grosch - 62 -

(Default)-Werte der Lichtquellenattr(Default)-Werte der Lichtquellenattr.

T. Grosch - 63 -

Wo wird beleuchtet?Wo wird beleuchtet?Nach der Modelview-Transformation sind Normalen und Eckpunkte imsind Normalen und Eckpunkte im Kamerakoordinatensystem. Diese Werte werden für die Beleuchtung verwendet.

12

334

T. Grosch - 64 -

ZusammenfassungZusammenfassung

ViewportViewportOpenGL PipelineClippingClippingBeleuchtung

Nächste WocheTexturenTexturen

T. Grosch - 65 -

top related