CARL VON OSSIETZKY Geometrische Primitive und Hidden Surface Removal Johannes Diemke Übung im Modul OpenGL mit Java Wintersemester 2010/2011 Wiederholung Geometrische Primitive in OpenGL I 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 I 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 I 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 I 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 I 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 I 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(); Johannes Diemke 0.0f, 0.0f); 50.0f, 0.0f); 0.0f, 0.0f); OpenGL mit Java WiSe 2010 / 2011 7/23 Geometrische Primitive Einschub: Polygon Winding I Die Kombination aus Ordnung und Richtung in der die Vertices angegeben werden wird als Winding bezeichnet I 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 I 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 I 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 I Farben werden pro Vertex festgelegt I Das Shading Model bestimmt, ob ein Polygon eine feste Farbe oder einen weichen Farbverlauf zwischen den für jeden Vertex festgelegten 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 zuletzt gezeichnete Objekt über einem zuvor gezeichneten Objekt I Dies gilt selbst, wenn das zuletzt gezeichnete Objekt räumlich hinter anderen 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 Rückseiten von Polygonen I Das ist sinnvoll bei geschlossenen Körpern, die nur von außen betrachtet werden können 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 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); } I 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 I Polygone müssen nicht grundsätzlich mit einer Farbe gefüllt sein I 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 I 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.) I Es darf keine Schnittpunkte zwischen den Kanten eines Polygons geben I 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