31.01.2014 Aufrufe

Geometrische Primitive in OpenGL

Geometrische Primitive in OpenGL

Geometrische Primitive in OpenGL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

C A R L

V O N

O S S I E T Z K Y

Geometrische Primitive und

Hidden Surface Removal

Johannes Diemke

Übung im Modul OpenGL mit Java

Wintersemester 2010/2011


Wiederholung

Geometrische Primitive in OpenGL

◮ 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

◮ 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

◮ 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

◮ 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

◮ 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

◮ 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();

0.0f, 0.0f);

50.0f, 0.0f);

0.0f, 0.0f);

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


Geometrische Primitive

Einschub: 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 Primitive

Darstellung von Triangle Strips

◮ 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

◮ 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

◮ 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

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 Removal

Depth Buffer

◮ In der Standardeinstellung von OpenGL erscheint das zuletzt

gezeichnete Objekt über einem zuvor gezeichneten Objekt

◮ Dies gilt selbst, wenn das zuletzt gezeichnete Objekt räumlich hinter

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 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.)

◮ 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

◮ Das Back-face Culling vermeidet das Zeichnen der Rückseiten von

Polygonen

◮ Das ist sinnvoll bei geschlossenen Körpern, die nur von außen

betrachtet werden können

◮ 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.)

◮ 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);

}

◮ 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

◮ Polygone müssen nicht grundsätzlich mit einer Farbe gefüllt sein

◮ 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

◮ 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.)

◮ Es darf keine Schnittpunkte zwischen den Kanten eines Polygons

geben

◮ 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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!