Geometrische Primitive in OpenGL
Geometrische Primitive in OpenGL
Geometrische Primitive in OpenGL
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
V O N
O S S I E T Z K Y
Geometrische Primitive und
Hidden Surface Removal
Johannes Diemke
Übung im Modul OpenGL mit Java
Wintersemester 2010/2011
Wiederholung
Geometrische Primitive in OpenGL
◮ Mit nur wenigen einfachen Bausteinen können hochkomplexe
Strukturen erstellt werden
Diese Bausteine werden in OpenGL Primitive genannt
Es existieren genau 10 verschiedene Primitive
gl.glColor3f(0.65f, 0.85f, 0.65f);
gl.glBegin(GL.GL_TRIANGLES);
gl.glVertex3f(-2.0f, -1.0f, 0.0f);
gl.glVertex3f( 2.0f, -1.0f, 0.0f);
gl.glVertex3f( 0.0f, 1.0f, 0.0f);
gl.glEnd();
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/23
Geometrische Primitive
Darstellung von Punkten
◮ Der Parameter GL.GL_POINTS lässt OpenGL die Liste der Vertices als
Punkte interpretieren
Die Punktgröße kann mit der Methode glPointSize(float size)
gesetzt werden
Vorsicht! Nicht alle Punktgrößen werden unterstützt
float range[] = new float[2];
gl.glGetFloatv(GL.GL_POINT_SIZE_RANGE, range, 0);
float step[] = new float[1];
gl.glGetFloatv(GL.GL_POINT_SIZE_GRANULARITY,
step, 0);
gl.glPointSize(range[0]);
gl.glBegin(GL.GL_POINTS);
gl.glVertex3f(-2.0f, -1.0f, 0.0f);
gl.glVertex3f( 2.0f, 1.0f, 0.0f);
gl.glEnd();
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/23
Geometrische Primitive
Darstellung von Liniensegmenten
◮ Der Parameter GL.GL_LINES lässt OpenGL jeweils zwei Vertices der
Liste als Liniensegment interpretieren
Die Linienbreite kann mit der Methode glLineWidth(float width)
gesetzt werden
Vorsicht! Nicht alle Linienbreiten werden unterstützt
float range[] = new float[2];
gl.glGetFloatv(GL.GL_LINE_WIDTH_RANGE, range, 0);
float step[] = new float[1];
gl.glGetFloatv(GL.GL_LINE_WIDTH_GRANULARITY,
step, 0);
gl.glLineWidth(range[1]);
gl.glBegin(GL.GL_LINES);
gl.glVertex3f(-2.0f, -1.0f, 0.0f);
gl.glVertex3f( 2.0f, 1.0f, 0.0f);
gl.glEnd();
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/23
Geometrische Primitive
Darstellung von Linienzügen
◮ Der Parameter
GL.GL_LINE_STRIP lässt OpenGL die Liste
der Vertices als Linienzug interpretieren
gl.glBegin(GL.GL_LINE_STRIP);
gl.glVertex3f( 0.0f, 0.0f, 0.0f);
gl.glVertex3f(50.0f, 50.0f, 0.0f);
gl.glVertex3f(50.0f, 100.0f, 0.0f);
gl.glEnd();
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/23
Geometrische Primitive
Darstellung von geschlossenen Linienzügen
◮ Der Parameter GL.GL_LINE_LOOP
lässt OpenGL die Liste der Vertices
als geschlossenen Linienzug interpretieren
gl.glBegin(GL.GL_LINE_LOOP);
gl.glVertex3f( 0.0f, 0.0f, 0.0f);
gl.glVertex3f(50.0f, 50.0f, 0.0f);
gl.glVertex3f(50.0f, 100.0f, 0.0f);
gl.glEnd();
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/23
Geometrische Primitive
Darstellung von Dreiecken
◮ Der Parameter GL.GL_TRIANGLES
lässt OpenGL die Liste der
Vertices als Dreiecke interpretieren
gl.glBegin(GL.GL_TRIANGLES);
gl.glVertex3f( 0.0f, 0.0f, 0.0f);
gl.glVertex3f(25.0f, 25.0f, 0.0f);
gl.glVertex3f(50.0f, 0.0f, 0.0f);
gl.glVertex3f(-50.0f,
gl.glVertex3f(-75.0f,
gl.glVertex3f(-25.0f,
gl.glEnd();
0.0f, 0.0f);
50.0f, 0.0f);
0.0f, 0.0f);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/23
Geometrische Primitive
Einschub: Polygon Winding
◮ Die Kombination aus Ordnung und Richtung in der die Vertices
angegeben werden wird als Winding bezeichnet
◮ In der Standardeinstellung nimmt OpenGL Polygone mit einem
CCW-Winding als front facing an
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/23
Geometrische Primitive
Darstellung von Triangle Strips
◮ Der Parameter GL.GL_TRIANGLE_STRIP lässt OpenGL die Liste der
Vertices folgendermaßen als Gruppe verbundener Dreiecke
interpretieren:
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/23
Geometrische Primitive
Darstellung von Triangle Fans
◮ Der Parameter GL.GL_TRIANGLE_FAN lässt OpenGL die Liste der Vertices
folgendermaßen als Gruppe verbundener Dreiecke interpretieren:
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/23
Geometrische Primitive
Color Shading Model
◮ Farben werden pro Vertex festgelegt
◮ Das Shading Model bestimmt, ob ein Polygon eine feste Farbe oder
einen weichen Farbverlauf zwischen den für jeden Vertex
festgelegten Farben besitzt
◮ Es wird mit der Methode glShadeModel(int mode) gesetzt
// enable flat shading
gl.glShadeModel(GL.GL_FLAT);
...
// enable smooth shading
gl.glShadeModel(GL.GL_SMOOTH);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/23
Hidden Surface Removal
Depth Buffer
◮ In der Standardeinstellung von OpenGL erscheint das zuletzt
gezeichnete Objekt über einem zuvor gezeichneten Objekt
◮ Dies gilt selbst, wenn das zuletzt gezeichnete Objekt räumlich hinter
anderen liegt
◮ Dies kann mit dem Depth Testing korrigiert werden → Depth Buffer
// enable depth testing
gl.glEnable(GL.GL_DEPTH_TEST);
...
// disable depth testing
gl.glDisable(GL.GL_DEPTH_TEST);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/23
Hidden Surface Removal
Depth Buffer (Forts.)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/23
Hidden Surface Removal
Depth Buffer (Forts.)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/23
Hidden Surface Removal
Depth Buffer (Forts.)
◮ Der Depth Buffer muss vor jedem Rendern der Szene geleert werden
public void display(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
}
// clear the color and depth buffer
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -5.0f);
...
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/23
Hidden Surface Determination
Back-Face Culling
◮ Das Back-face Culling vermeidet das Zeichnen der Rückseiten von
Polygonen
◮ Das ist sinnvoll bei geschlossenen Körpern, die nur von außen
betrachtet werden können
◮ Ein Spezialfall tritt bei transparenten Objekten ein → blending
// enable back-face culling
gl.glEnable(GL.GL_CULL_FACE);
...
// disable back-face culling
gl.glDisable(GL.GL_CULL_FACE);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 16/23
Hidden Surface Determination
Back-Face Culling (Forts.)
◮ Zum Bestimmen der Vorder- und Rückseite eines Polygons wird
dessen Winding betrachtet
Daher ist es wichtig das Polygon-Winding konsistent zu halten
if(bCull) {
// enable back-face culling
gl.glEnable(GL.GL_CULL_FACE);
} else {
// disable back-face culling
gl.glDisable(GL.GL_CULL_FACE);
}
◮ Die Festlegung der Vorder- und Rückseiten geschieht mit der
Methode glFrontFace(int mode)
// clockwise-wound polygons are front facing
gl.glFrontFace(GL.GL_CW);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/23
Geometrische Primitive
Polygon Modes
◮ Polygone müssen nicht grundsätzlich mit einer Farbe gefüllt sein
◮ Mit der Methode glPolygonMode(int face, int mode) lässt sich festlegen,
wie Polygone dargestellt werden sollen:
GL.GL_POINT
GL.GL_LINE
GL.GL_FILL
if(bOutline) {
// draw polygons as outlines
gl.glPolygonMode(GL.GL_BACK, GL_LINE)
} else {
// draw polygons solid
gl.glPolygonMode(GL.GL_BACK, GL_FILL)
}
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 18/23
Geometrische Primitive
Konstruktionsregeln für Polygone
◮ Alle Polygone müssen planar sein
Die Vertices eines Polygons müssen immer in genau einer Ebene liegen
Bei Dreiecken ist das überhaupt kein Problem
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 19/23
Geometrische Primitive
Konstruktionsregeln für Polygone (Forts.)
◮ Es darf keine Schnittpunkte zwischen den Kanten eines Polygons
geben
◮ Polygone müssen konvex sein:
Jede Strecke zweier Punkte des Polygons liegt vollständig in ihm
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 20/23
Grafikprogrammierung
Ein etwas anderes Beispiel ...
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/23
Literatur und Links
Mason Woo, Jackie Neider, Tom Davis und Dave Shreiner
OpenGL Programming Guide
http://www.opengl.org/documentation/red book/
Randi J. Rost
OpenGL Shading Language
http://www.3dshaders.com/
Richard S. Wright und Michael Sweet
OpenGL SuperBibel
http://www.starstonesoftware.com/OpenGL/
Tomas Möller und Eric Haines
Real-Time Rendering
http://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 22/23
Literatur und Links
Fletcher Dunn und Ian Parberry
3D Math Primer For Graphics and Game Development
http://www.gamemath.com/
Khronos Group
OpenGL Homepage
http://www.opengl.org/
Game Technology Group at Sun Microsystems
JOGL API Project
https://jogl.dev.java.net/
Fairlight und The Black Lotus
Only one wish
http://capped.tv/playeralt.php?vid=1215051083-1-0
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 23/23