Photometrische und Radiometrische Grundlagencg/ws1213/cg1/vorlesung/12_ogl... ·...

Post on 18-Oct-2020

3 views 0 download

Transcript of Photometrische und Radiometrische Grundlagencg/ws1213/cg1/vorlesung/12_ogl... ·...

U N I V E R S I T Ä TKOBLENZ · LANDAU

(12) OpenGL-Pipeline

Vorlesung„Computergraphik I“

S. Müller

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 2 -

Wiederholung I Was passiert, wenn

Kein gluLookAt verwendet wird?• Kamera ist im Urpsrung, Blick entlang der neg. z-Achse,

Rechtssystem, x-Achse zeigt nach rechts, y-Achse nach oben

Keine (orthographische oder perspektivische) Projektion gesetzt wird?

• Orthographische Projektion von (-1, 1) in alle drei Raumrichtungen

• ABER: keine Drehung von Rechts- nach Linkssystem, Normalen zeigen nach innen.

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 3 -

Wiederholung II Perspektivische Projektion

Eigentlich ganz einfach gem. Strahlensatz

Gesuchte Division durch pz erreicht man mit homogenen Koordinaten durch abschließende Homogenisierung (Division durch homogene Koordinaten)

Pzy

y

pn

pp

='

yz

y ppnp ⋅='

view

pla

ne

n

yp'yp

0zp

xz

x ppnp ⋅='Analog:

1zyx

wwzwywx

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 4 -

Wiederholung III Einfacher Ansatz: der

Tiefenwert geht verloren:

homogenisiert:

Daher: Abbildung durch

Nicht-lineare Skalierung der Tiefenwerte

Eigenschaften der Funktion: n wird auf n abgebildet f wird auf f abgebildet Die „vorderen“ z-Werte

bekommen größere Abstände, als die „hinteren“

Lässt sich durch homogene Koordinaten darstellen

Höhere z-Buffer-Genauigkeit bei vorderen Punkten

=

11'''

npnppnp

ppp

zy

zx

z

y

x

=

npppp

wppp

z

z

y

x

z

y

x

'''

zz pnffnp −+='

z_flickering.vcproj z_flickering2.vcproj

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 5 -

Wiederholung IV Tiefenpuffer:

bei Ortho wird z-Wert eingetragen, bei perspekt. Transformation wird ~1/z eingetragen

OpenGL Kommandos glFrustum(GLdouble left, right, bottom, top, near, far) gluPerspective (GLdouble θ, aspect, near, far)

projection.exe

xz−

y

0 left right bottom

top

far

near

xz−

y

0

-far

-near

θh

w

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 6 -

x

z

y

0

u

AC

yx

z

yx

z-f (r,t)

-n

(l,b)

(1,1,1)

(-1,-1,-1)

y x

z

Modell/Weltkoordinaten Kamerakoordinaten

View Frustum Kanonisches Volumen

pRTSTVMMMpMODELVIEWPROJECTION

MM

LRPERSPORTHO

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

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 7 -

Bsp.: Asymmetrisches Frustum Rendern eines Posters (z.B. 10000 x 10000 Pixel)

Bildschirmspeicher zu klein

Zerlegen in viele Teilbilder mit voller Auflösung Mit gluPerspective nicht möglich

x

y

0

glFrustum(GLdouble l, r, b, t, n, f);

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 8 -

BeispielglClear (GL_COLOR_BUFFER_BIT);glColor3f (0.0, 0.0, 0.0);

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho (-1.0,1.0, -1.0,1.0, 1.0,10.0);oderglFrustum(-1.0,1.0, -1.0,1.0, 1.0,10.0);

glMatrixMode(GL_MODELVIEW); glLoadIdentity();gluLookAt(0,0,1, 0,0,0, 0,1,0);

glTranslatef(0,0,tz);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 ();

pRTSTVMMMpMODELVIEWPROJECTION

MM

LRPERSPORTHO

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

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 9 -

Alternative: gluPerspective

xz

y

0

gluPerspective (GLdouble θ, aspect, near, far)

-far

-near

θ

hwaspect =

h

w

Nur symmetrisches Frustum

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 10 -

Beispiel

projektion.c projection.exe

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 11 -

Nate Robin

projection.exe

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 12 -

Bsp.: Asymmetrisches Frustum Rendern eines Posters (z.B. 10000 x 10000 Pixel)

Bildschirmspeicher zu klein

Zerlegen in viele Teilbilder mit voller Auflösung Mit gluPerspective nicht möglich

x

y

0

glFrustum(GLdouble l, r, b, t, n, f);

proj_terrain.vcproj

U N I V E R S I T Ä TKOBLENZ · LANDAU

Fraktales Terrain

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 14 -

Besseres Terrain: Diamond-Square Bisheriges Terrain: Höhen wurden beliebig und zufällig

ausgewählt mit einem sehr „groben“ Resultat Besser Diamond-Square (Midpoint-Displacement)

Basis: Quadrat mit Seitenlänge 2n+1.

Start: In den Ecken einen Wert aus dem Zufallsbereich festlegen

Diamond-Step:Höhenwerte der Ecken mitteln, Zufallswert aufaddieren und Wert dann im Mittelpunkt eintragen.

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 15 -

Diamond-Square II

Square-Step:In der Mitte der Strecke zwischen den Eckpunkten jeweils einen Wert eintragen, der sich aus demMittel der beiden benachbarten Eckpunkten und einem Zufallswert (aus dem selben Bereich, wie beim Diamond-Step) zusammensetzt.

Rekursion:Für die vier entstandenen Teilquadrate werden der Diamond- und der Square-Step wiederholt, wobei der Zufallsbereich mit steigender Rekursionstiefe sinkt.

Ende der Rekursion:Sind alle (2n+1)2 Werte eingetragen, terminiertder Algorithmus.

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 16 -

Beispiel

terrain.vcxproj

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 17 -

Typisches Problem: Patches/Meshes Unterteilung der Oberfläche

der graphischen Primitive in Patches/Meshes/Netze

Ineffizient, für jedes Patch alle 4 Eckpunkte abzuspeichern Punkt wird mehrfach an die

Graphik-HW übertragen Punkt wird mehrfach

transformierta b

c d

Dieser Punkt würde 4mal transformiert mit jeweils dem gleichen Ergebnis

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 18 -

Effiziente Lösung in OpenGL

1.

2.

3.

4.

5.

6.

GL_TRIANGLE_STRIP

2.

1.

4.

3.

6.

5.

GL_QUAD_STRIP

1.

2.3.

4.

5.

GL_TRIANGLE_FAN

verbundene Primitive

glBegin(GL_TRIANGLE_STRIP); glVertex3fv …; glEnd();

U N I V E R S I T Ä TKOBLENZ · LANDAU

Kamerasteuerung (Kugelgeometrie)

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 20 -

Kugel: Polarkoordinaten

z

P

x

y

0 ϕ

θ r

P

x

y

0

z

=

z

y

x

Kart

PPP

P .

( )πθ ,0∈ ( )πϕ 2,0∈ ( )∞∈ ,0r

=r

Ppolar ϕθ

(ganze Kugel…)

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 21 -

Umrechnung

θ r

P

x

y

z

0

θsin⋅r

θcos⋅rϕ

P

x

y

z

0

ϕθ sinsin ⋅⋅r ϕθ cossin ⋅⋅r

⋅⋅⋅

⋅⋅=

ϕθθ

ϕθ

sinsincos

cossin

rr

r

PPP

z

y

x

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 22 -

Kugel zeichnenglBegin(GL_POINTS);for ( i=0; i < npoints; i++) for ( j=0; j < npoints; j++) { theta = PI * i/npoints; phi = 2*PI * j/npoints; glVertex3f( r*sin(theta)*cos(phi), r*cos(theta), r*sin(theta)*sin(phi)); } glEnd();

Sphere.c

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 23 -

Kamerasteuerung Virtueller Trackball

Gut geeignet zur Betrachtung eines Objekts

Der Centerpoint liegt im Mittelpunkt des Objekts

Die Bewegung der Maus steuert den Augpunkt auf einer Kugel um das Objekt (Umrechnung der xy-Werte in Polatkoordinaten)

Durch Mausklick kann man näher an das Objekt heran oder weiter weg navigieren (Veränderung von Radius r)

Flugmodus Gut geeignet zur Navigation

durch eine Szene Die Bewegung der Maus

steuert den Centerpoint auf einer (Halb-)kugel um das Objekt

Der Augpunkt wird anschließend in Richtung der Blickrichtung verschoben

Die Skalierung der Blickrichtung (Geschwindigkeit) kann z.B. wieder durch Mausklick erhöht/verringert werden.

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 24 -

Virtueller Trackball

u

A0

00

1−b

1−h

θ

ϕ

Bei gedrückter Maustaste:Umsetzung der (relativen) Position der Maus in θ, ϕ - Werte

⋅⋅⋅

⋅⋅=

ϕθθ

ϕθ

sinsincos

cossin

rr

r

AAA

z

y

x

Cursor-Taste:Verändern von „r“

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 25 -

Flugmodus

u

AC

v

00

1−b

1−h

θ

ϕ

Bei gedrückter Maustaste:Umsetzung der (relativen) Position der Maus in θ, ϕ - Werte

⋅=

ϕθθ

ϕθ

sinsincos

cossin

z

y

x

vvv

⋅+

=

z

y

x

z

y

x

z

y

x

vvv

speedAAA

AAA

'''

Cursor-Taste:Verändern von „speed“

camera.vcproj

U N I V E R S I T Ä TKOBLENZ · LANDAU

Viewport

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 27 -

(1,1,1)

x

zy

(-1,-1,-1)

x

y

z

(1,1,1)

(-1,-1,-1)

Viewport-Transformation

Transformation des kanonischen Volumens Transformation 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

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 28 -

Viewport Transformation (xy-Werte)

x

y

00 breite

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

1

1

-1

x

z

y

-1 1

-1

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 29 -

(0;0)

(0;h-1)

(b-1;0)

(b-1;h-1)

x

yBildschirmkoordinatensystem

Ein Bildschirmfenster der Höhe h und der Breite b hat Pixelkoordinaten in x-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

x = -0.5 x = b-0.5

y = -0.5

y = h-0.5

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 30 -

Bildschirmkoord.system OpenGL Offset des Pixelmittelpunktes

um 0.5

(0.5;0.5)

(0.5;h-0.5)

(b-0.5;0.5)

(b-0.5;h-0.5)

x

y

0 x = b

y = h

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 31 -

Viewport in OpenGL

1

1

-1

x

y

-1 b/2

h/2

-h/2

x

y

-b/2

22'22'

hphpbpbp

yy

xx

+⋅=+⋅=

0 bxp'1−=xp 1=xp

x

y

0 b

h

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 32 -

Viewport Es ist wichtig, wie die Pixel nachher bei der

Rasterisierung angesprochen werden Bei OpenGL:

Das gesamte Clip-Volumen wird auf den darstellbaren Fensterbereich abgebildet

Verwendet man Anti-Aliasing durch Subpixelstrukturen, so kommen keine „zusätzlichen“ Regionen dazu, die bereits weg-geclippt sind.

OpenGL

22'22'

hphpbpbp

yy

xx

+⋅=+⋅=

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 33 -

Viewport: Allgemein Angaben in

Fensterkoordinaten OpenGL-Kommando

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

(0,0)

h

b

( )121' +⋅= zz pp

z1

-1

z2

0

z1

0

yhphpxbpbp

Viewport

yy

xx

++⋅=++⋅=

22'22'

:

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 34 -

Beispiel

Viewport.c Viewport.exe

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 35 -

OpenGL glViewport GLUT übernimmt die Anpassung, solange keine

Reshape-Funktion gesetzt ist wirkt nur auf Geometrie, nicht auf Pixeloperationen wie

glClear(); Lösung: Scissor Test

Wirkt wie glViewport(), aber auf Pixelebene

glScissor( GLint x, y, width, height );

Aktivierung über glEnable(GL_SCISSOR_TEST);

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 36 -

Aktivieren / Inaktivieren Viele Features müssen explizit aktiviert werden

glEnable( GLenum feature );

zum Inaktivieren dient dann glDisable( GLenum feature );

der Zustand kann abgefragt werden mittelsglIsEnabled( GLenum feature );

die Konstanten können nicht verodert werden

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 37 -

Typisches Programmvoid display(){

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ...glutSwapBuffers();

}

void reshape( int w, int h){

glViewport( 0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45, (float)w/h, 1.0, 20.0);

glMatrixMode(GL_MODELVIEW);glLoadIdentity();

}

void init(){

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

}

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

glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);glutInitWindowSize(600,600);glutCreateWindow(„...");

glutIdleFunc(idle);glutSpecialFunc(special);glutMouseFunc(mouse);glutMotionFunc(motion);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutDisplayFunc(display);init();glutMainLoop();

}

U N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 38 -

OpenGL Rendering Pipeline

pRTSTVpMODELVIEWM

⋅⋅⋅⋅⋅⋅='

''' pMMMpPROJECTIONM

LRPERSPORTHO

⋅⋅⋅= →

Division durch homogene Koordinate

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

Linkssystem: z-Achse nicht-linear skaliert, kanonisches Volumen vor perspekt. Division

Kanonisches Volumen

Bildschirm- bzw. Fensterkoordinaten

Viewport-Transformation

12

34