• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal
 

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

on

  • 360 views

 

Statistics

Views

Total Views
360
Views on SlideShare
360
Embed Views
0

Actions

Likes
0
Downloads
4
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • CARL VONOSSIETZKY Geometrische Primitive und Hidden Surface Removal Johannes Diemke ¨ Ubung im Modul OpenGL mit Java Wintersemester 2010/2011
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • Hidden Surface RemovalDepth Buffer (Forts.) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/23
    • Hidden Surface RemovalDepth Buffer (Forts.) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/23
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • GrafikprogrammierungEin 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 o 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