1. CARL
VON
OSSIETZKY
Geometrische Primitive und
Hidden Surface Removal
Johannes Diemke
¨
Ubung im Modul OpenGL mit Java
Wintersemester 2010/2011
2. Wiederholung
Geometrische Primitive in OpenGL
Mit nur wenigen einfachen Bausteinen k¨nnen hochkomplexe
o
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
3. Geometrische Primitive
Darstellung von Punkten
Der Parameter GL.GL_POINTS l¨sst OpenGL die Liste der Vertices als
a
Punkte interpretieren
Die Punktgr¨ße kann mit der Methode glPointSize(float size)
o
gesetzt werden
Vorsicht! Nicht alle Punktgr¨ßen werden unterst¨tzt
o u
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
4. Geometrische Primitive
Darstellung von Liniensegmenten
Der Parameter GL.GL_LINES l¨sst OpenGL jeweils zwei Vertices der
a
Liste als Liniensegment interpretieren
Die Linienbreite kann mit der Methode glLineWidth(float width)
gesetzt werden
Vorsicht! Nicht alle Linienbreiten werden unterst¨tzt
u
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
5. Geometrische Primitive
Darstellung von Linienz¨gen
u
Der Parameter
GL.GL_LINE_STRIP l¨sst OpenGL die Liste
a
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
6. Geometrische Primitive
Darstellung von geschlossenen Linienz¨gen
u
Der Parameter GL.GL_LINE_LOOP
l¨sst OpenGL die Liste der Vertices
a
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
7. Geometrische Primitive
Darstellung von Dreiecken
Der Parameter GL.GL_TRIANGLES
l¨sst OpenGL die Liste der
a
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, 0.0f, 0.0f);
gl.glVertex3f(-75.0f, 50.0f, 0.0f);
gl.glVertex3f(-25.0f, 0.0f, 0.0f);
gl.glEnd();
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/23
8. 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
9. Geometrische Primitive
Darstellung von Triangle Strips
Der Parameter GL.GL_TRIANGLE_STRIP l¨sst OpenGL die Liste der
a
Vertices folgendermaßen als Gruppe verbundener Dreiecke
interpretieren:
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/23
10. Geometrische Primitive
Darstellung von Triangle Fans
Der Parameter GL.GL_TRIANGLE_FAN l¨sst OpenGL die Liste der Vertices
a
folgendermaßen als Gruppe verbundener Dreiecke interpretieren:
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/23
11. 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
u
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
12. Hidden Surface Removal
Depth Buffer
In der Standardeinstellung von OpenGL erscheint das zuletzt
gezeichnete Objekt uber einem zuvor gezeichneten Objekt
¨
Dies gilt selbst, wenn das zuletzt gezeichnete Objekt r¨umlich hinter
a
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
15. 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
16. Hidden Surface Determination
Back-Face Culling
Das Back-face Culling vermeidet das Zeichnen der R¨ckseiten von
u
Polygonen
Das ist sinnvoll bei geschlossenen K¨rpern, die nur von außen
o
betrachtet werden k¨nnen
o
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
17. Hidden Surface Determination
Back-Face Culling (Forts.)
Zum Bestimmen der Vorder- und R¨ckseite eines Polygons wird
u
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
u
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
18. Geometrische Primitive
Polygon Modes
Polygone m¨ssen nicht grunds¨tzlich mit einer Farbe gef¨llt sein
u a u
Mit der Methode glPolygonMode(int face, int mode) l¨sst sich festlegen,
a
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
19. Geometrische Primitive
Konstruktionsregeln f¨r Polygone
u
Alle Polygone m¨ssen planar sein
u
Die Vertices eines Polygons m¨ssen immer in genau einer Ebene liegen
u
Bei Dreiecken ist das uberhaupt kein Problem
¨
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 19/23
20. Geometrische Primitive
Konstruktionsregeln f¨r Polygone (Forts.)
u
Es darf keine Schnittpunkte zwischen den Kanten eines Polygons
geben
Polygone m¨ssen konvex sein:
u
Jede Strecke zweier Punkte des Polygons liegt vollst¨ndig in ihm
a
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 20/23
22. 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
o
Real-Time Rendering
http://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 22/23
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