Upload
johannes-diemke
View
284
Download
1
Embed Size (px)
Citation preview
C A R LV O N
O S S I E T Z K YGeometrische Primitive undHidden Surface Removal
Johannes Diemke
Ubung im Modul OpenGL mit JavaWintersemester 2010/2011
Wiederholung
Geometrische Primitive in OpenGLI Mit nur wenigen einfachen Bausteinen konnen hochkomplexe
Strukturen erstellt werden
Diese Bausteine werden in OpenGL Primitive genanntEs 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 PunktenI Der Parameter GL.GL_POINTS lasst OpenGL die Liste der Vertices als
Punkte interpretierenDie Punktgroße kann mit der Methode glPointSize(float size)
gesetzt werdenVorsicht! Nicht alle Punktgroßen werden unterstutzt
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 LiniensegmentenI Der Parameter GL.GL_LINES lasst OpenGL jeweils zwei Vertices der
Liste als Liniensegment interpretierenDie Linienbreite kann mit der Methode glLineWidth(float width)
gesetzt werdenVorsicht! Nicht alle Linienbreiten werden unterstutzt
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 Linienzugen
I Der ParameterGL.GL_LINE_STRIP lasst OpenGL die Listeder 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 Linienzugen
I Der Parameter GL.GL_LINE_LOOP
lasst OpenGL die Liste der Verticesals 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
I Der Parameter GL.GL_TRIANGLES
lasst OpenGL die Liste derVertices 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
Geometrische Primitive
Einschub: Polygon Winding
I Die Kombination aus Ordnung und Richtung in der die Verticesangegeben werden wird als Winding bezeichnet
I In der Standardeinstellung nimmt OpenGL Polygone mit einemCCW-Winding als front facing an
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/23
Geometrische Primitive
Darstellung von Triangle Strips
I Der Parameter GL.GL_TRIANGLE_STRIP lasst OpenGL die Liste derVertices folgendermaßen als Gruppe verbundener Dreieckeinterpretieren:
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/23
Geometrische Primitive
Darstellung von Triangle Fans
I Der Parameter GL.GL_TRIANGLE_FAN lasst OpenGL die Liste der Verticesfolgendermaßen als Gruppe verbundener Dreiecke interpretieren:
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/23
Geometrische Primitive
Color Shading Model
I Farben werden pro Vertex festgelegt
I Das Shading Model bestimmt, ob ein Polygon eine feste Farbe odereinen weichen Farbverlauf zwischen den fur jeden Vertexfestgelegten Farben besitzt
I 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
I In der Standardeinstellung von OpenGL erscheint das zuletztgezeichnete Objekt uber einem zuvor gezeichneten Objekt
I Dies gilt selbst, wenn das zuletzt gezeichnete Objekt raumlich hinteranderen liegt
I 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.)
I 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
I Das Back-face Culling vermeidet das Zeichnen der Ruckseiten vonPolygonen
I Das ist sinnvoll bei geschlossenen Korpern, die nur von außenbetrachtet werden konnen
I 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.)I Zum Bestimmen der Vorder- und Ruckseite 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);
}
I Die Festlegung der Vorder- und Ruckseiten geschieht mit derMethode 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
I Polygone mussen nicht grundsatzlich mit einer Farbe gefullt sein
I Mit der Methode glPolygonMode(int face, int mode) lasst 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 fur PolygoneI Alle Polygone mussen planar sein
Die Vertices eines Polygons mussen immer in genau einer Ebene liegenBei Dreiecken ist das uberhaupt kein Problem
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 19/23
Geometrische Primitive
Konstruktionsregeln fur Polygone (Forts.)
I Es darf keine Schnittpunkte zwischen den Kanten eines Polygonsgeben
I Polygone mussen konvex sein:
Jede Strecke zweier Punkte des Polygons liegt vollstandig 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 ShreinerOpenGL Programming Guidehttp://www.opengl.org/documentation/red book/
� Randi J. RostOpenGL Shading Languagehttp://www.3dshaders.com/
� Richard S. Wright und Michael SweetOpenGL SuperBibelhttp://www.starstonesoftware.com/OpenGL/
� Tomas Moller und Eric HainesReal-Time Renderinghttp://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 22/23
Literatur und Links
� Fletcher Dunn und Ian Parberry3D Math Primer For Graphics and Game Developmenthttp://www.gamemath.com/
� Khronos GroupOpenGL Homepagehttp://www.opengl.org/
� Game Technology Group at Sun MicrosystemsJOGL API Projecthttps://jogl.dev.java.net/
� Fairlight und The Black LotusOnly one wishhttp://capped.tv/playeralt.php?vid=1215051083-1-0
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 23/23