23
C A R L V ON O SS I ET Z KY Geometrische Primitive und Hidden Surface Removal Johannes Diemke ¨ Ubung im Modul OpenGL mit Java Wintersemester 2010/2011

2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

Embed Size (px)

Citation preview

Page 1: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 2: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 3: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 4: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 5: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 6: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 7: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 8: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 9: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 10: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 11: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 12: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 13: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

Hidden Surface Removal

Depth Buffer (Forts.)

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/23

Page 14: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

Hidden Surface Removal

Depth Buffer (Forts.)

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/23

Page 15: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 16: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 17: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 18: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 19: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 20: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 21: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

Grafikprogrammierung

Ein etwas anderes Beispiel ...

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/23

Page 22: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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

Page 23: 2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal

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