Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

765 views

Published on

  • Be the first to comment

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

  1. 1. CARL VONOSSIETZKY Geometrische Primitive und Hidden Surface Removal Johannes Diemke ¨ Ubung im Modul OpenGL mit Java Wintersemester 2010/2011
  2. 2. WiederholungGeometrische 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 Primitivegl.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. 3. Geometrische PrimitiveDarstellung 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 ufloat 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. 4. Geometrische PrimitiveDarstellung 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 ufloat 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. 5. Geometrische PrimitiveDarstellung 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. 6. Geometrische PrimitiveDarstellung 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. 7. Geometrische PrimitiveDarstellung 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. 8. Geometrische PrimitiveEinschub: 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. 9. Geometrische PrimitiveDarstellung 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. 10. Geometrische PrimitiveDarstellung 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. 11. Geometrische PrimitiveColor 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. 12. Hidden Surface RemovalDepth 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
  13. 13. Hidden Surface RemovalDepth Buffer (Forts.) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/23
  14. 14. Hidden Surface RemovalDepth Buffer (Forts.) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/23
  15. 15. Hidden Surface RemovalDepth 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. 16. Hidden Surface DeterminationBack-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. 17. Hidden Surface DeterminationBack-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. 18. Geometrische PrimitivePolygon 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. 19. Geometrische PrimitiveKonstruktionsregeln 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. 20. Geometrische PrimitiveKonstruktionsregeln 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
  21. 21. GrafikprogrammierungEin etwas anderes Beispiel ... Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/23
  22. 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. 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

×