Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
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