Geometrische Primitive in OpenGL

Werbung
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
Herunterladen