31.01.2014 Aufrufe

Geometrische Primitive in OpenGL

Geometrische Primitive in OpenGL

Geometrische Primitive in OpenGL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

C A R L<br />

V O N<br />

O S S I E T Z K Y<br />

<strong>Geometrische</strong> <strong>Primitive</strong> und<br />

Hidden Surface Removal<br />

Johannes Diemke<br />

Übung im Modul <strong>OpenGL</strong> mit Java<br />

W<strong>in</strong>tersemester 2010/2011


Wiederholung<br />

<strong>Geometrische</strong> <strong>Primitive</strong> <strong>in</strong> <strong>OpenGL</strong><br />

◮ Mit nur wenigen e<strong>in</strong>fachen Bauste<strong>in</strong>en können hochkomplexe<br />

Strukturen erstellt werden<br />

Diese Bauste<strong>in</strong>e werden <strong>in</strong> <strong>OpenGL</strong> <strong>Primitive</strong> genannt<br />

Es existieren genau 10 verschiedene <strong>Primitive</strong><br />

gl.glColor3f(0.65f, 0.85f, 0.65f);<br />

gl.glBeg<strong>in</strong>(GL.GL_TRIANGLES);<br />

gl.glVertex3f(-2.0f, -1.0f, 0.0f);<br />

gl.glVertex3f( 2.0f, -1.0f, 0.0f);<br />

gl.glVertex3f( 0.0f, 1.0f, 0.0f);<br />

gl.glEnd();<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 2/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Darstellung von Punkten<br />

◮ Der Parameter GL.GL_POINTS lässt <strong>OpenGL</strong> die Liste der Vertices als<br />

Punkte <strong>in</strong>terpretieren<br />

Die Punktgröße kann mit der Methode glPo<strong>in</strong>tSize(float size)<br />

gesetzt werden<br />

Vorsicht! Nicht alle Punktgrößen werden unterstützt<br />

float range[] = new float[2];<br />

gl.glGetFloatv(GL.GL_POINT_SIZE_RANGE, range, 0);<br />

float step[] = new float[1];<br />

gl.glGetFloatv(GL.GL_POINT_SIZE_GRANULARITY,<br />

step, 0);<br />

gl.glPo<strong>in</strong>tSize(range[0]);<br />

gl.glBeg<strong>in</strong>(GL.GL_POINTS);<br />

gl.glVertex3f(-2.0f, -1.0f, 0.0f);<br />

gl.glVertex3f( 2.0f, 1.0f, 0.0f);<br />

gl.glEnd();<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 3/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Darstellung von L<strong>in</strong>iensegmenten<br />

◮ Der Parameter GL.GL_LINES lässt <strong>OpenGL</strong> jeweils zwei Vertices der<br />

Liste als L<strong>in</strong>iensegment <strong>in</strong>terpretieren<br />

Die L<strong>in</strong>ienbreite kann mit der Methode glL<strong>in</strong>eWidth(float width)<br />

gesetzt werden<br />

Vorsicht! Nicht alle L<strong>in</strong>ienbreiten werden unterstützt<br />

float range[] = new float[2];<br />

gl.glGetFloatv(GL.GL_LINE_WIDTH_RANGE, range, 0);<br />

float step[] = new float[1];<br />

gl.glGetFloatv(GL.GL_LINE_WIDTH_GRANULARITY,<br />

step, 0);<br />

gl.glL<strong>in</strong>eWidth(range[1]);<br />

gl.glBeg<strong>in</strong>(GL.GL_LINES);<br />

gl.glVertex3f(-2.0f, -1.0f, 0.0f);<br />

gl.glVertex3f( 2.0f, 1.0f, 0.0f);<br />

gl.glEnd();<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 4/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Darstellung von L<strong>in</strong>ienzügen<br />

◮ Der Parameter<br />

GL.GL_LINE_STRIP lässt <strong>OpenGL</strong> die Liste<br />

der Vertices als L<strong>in</strong>ienzug <strong>in</strong>terpretieren<br />

gl.glBeg<strong>in</strong>(GL.GL_LINE_STRIP);<br />

gl.glVertex3f( 0.0f, 0.0f, 0.0f);<br />

gl.glVertex3f(50.0f, 50.0f, 0.0f);<br />

gl.glVertex3f(50.0f, 100.0f, 0.0f);<br />

gl.glEnd();<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 5/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Darstellung von geschlossenen L<strong>in</strong>ienzügen<br />

◮ Der Parameter GL.GL_LINE_LOOP<br />

lässt <strong>OpenGL</strong> die Liste der Vertices<br />

als geschlossenen L<strong>in</strong>ienzug <strong>in</strong>terpretieren<br />

gl.glBeg<strong>in</strong>(GL.GL_LINE_LOOP);<br />

gl.glVertex3f( 0.0f, 0.0f, 0.0f);<br />

gl.glVertex3f(50.0f, 50.0f, 0.0f);<br />

gl.glVertex3f(50.0f, 100.0f, 0.0f);<br />

gl.glEnd();<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 6/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Darstellung von Dreiecken<br />

◮ Der Parameter GL.GL_TRIANGLES<br />

lässt <strong>OpenGL</strong> die Liste der<br />

Vertices als Dreiecke <strong>in</strong>terpretieren<br />

gl.glBeg<strong>in</strong>(GL.GL_TRIANGLES);<br />

gl.glVertex3f( 0.0f, 0.0f, 0.0f);<br />

gl.glVertex3f(25.0f, 25.0f, 0.0f);<br />

gl.glVertex3f(50.0f, 0.0f, 0.0f);<br />

gl.glVertex3f(-50.0f,<br />

gl.glVertex3f(-75.0f,<br />

gl.glVertex3f(-25.0f,<br />

gl.glEnd();<br />

0.0f, 0.0f);<br />

50.0f, 0.0f);<br />

0.0f, 0.0f);<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 7/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

E<strong>in</strong>schub: Polygon W<strong>in</strong>d<strong>in</strong>g<br />

◮ Die Komb<strong>in</strong>ation aus Ordnung und Richtung <strong>in</strong> der die Vertices<br />

angegeben werden wird als W<strong>in</strong>d<strong>in</strong>g bezeichnet<br />

◮ In der Standarde<strong>in</strong>stellung nimmt <strong>OpenGL</strong> Polygone mit e<strong>in</strong>em<br />

CCW-W<strong>in</strong>d<strong>in</strong>g als front fac<strong>in</strong>g an<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 8/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Darstellung von Triangle Strips<br />

◮ Der Parameter GL.GL_TRIANGLE_STRIP lässt <strong>OpenGL</strong> die Liste der<br />

Vertices folgendermaßen als Gruppe verbundener Dreiecke<br />

<strong>in</strong>terpretieren:<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 9/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Darstellung von Triangle Fans<br />

◮ Der Parameter GL.GL_TRIANGLE_FAN lässt <strong>OpenGL</strong> die Liste der Vertices<br />

folgendermaßen als Gruppe verbundener Dreiecke <strong>in</strong>terpretieren:<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 10/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Color Shad<strong>in</strong>g Model<br />

◮ Farben werden pro Vertex festgelegt<br />

◮ Das Shad<strong>in</strong>g Model bestimmt, ob e<strong>in</strong> Polygon e<strong>in</strong>e feste Farbe oder<br />

e<strong>in</strong>en weichen Farbverlauf zwischen den für jeden Vertex<br />

festgelegten Farben besitzt<br />

◮ Es wird mit der Methode glShadeModel(<strong>in</strong>t mode) gesetzt<br />

// enable flat shad<strong>in</strong>g<br />

gl.glShadeModel(GL.GL_FLAT);<br />

...<br />

// enable smooth shad<strong>in</strong>g<br />

gl.glShadeModel(GL.GL_SMOOTH);<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 11/23


Hidden Surface Removal<br />

Depth Buffer<br />

◮ In der Standarde<strong>in</strong>stellung von <strong>OpenGL</strong> ersche<strong>in</strong>t das zuletzt<br />

gezeichnete Objekt über e<strong>in</strong>em zuvor gezeichneten Objekt<br />

◮ Dies gilt selbst, wenn das zuletzt gezeichnete Objekt räumlich h<strong>in</strong>ter<br />

anderen liegt<br />

◮ Dies kann mit dem Depth Test<strong>in</strong>g korrigiert werden → Depth Buffer<br />

// enable depth test<strong>in</strong>g<br />

gl.glEnable(GL.GL_DEPTH_TEST);<br />

...<br />

// disable depth test<strong>in</strong>g<br />

gl.glDisable(GL.GL_DEPTH_TEST);<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 12/23


Hidden Surface Removal<br />

Depth Buffer (Forts.)<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 13/23


Hidden Surface Removal<br />

Depth Buffer (Forts.)<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 14/23


Hidden Surface Removal<br />

Depth Buffer (Forts.)<br />

◮ Der Depth Buffer muss vor jedem Rendern der Szene geleert werden<br />

public void display(GLAutoDrawable drawable) {<br />

GL2 gl = drawable.getGL().getGL2();<br />

}<br />

// clear the color and depth buffer<br />

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);<br />

gl.glLoadIdentity();<br />

gl.glTranslatef(0.0f, 0.0f, -5.0f);<br />

...<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 15/23


Hidden Surface Determ<strong>in</strong>ation<br />

Back-Face Cull<strong>in</strong>g<br />

◮ Das Back-face Cull<strong>in</strong>g vermeidet das Zeichnen der Rückseiten von<br />

Polygonen<br />

◮ Das ist s<strong>in</strong>nvoll bei geschlossenen Körpern, die nur von außen<br />

betrachtet werden können<br />

◮ E<strong>in</strong> Spezialfall tritt bei transparenten Objekten e<strong>in</strong> → blend<strong>in</strong>g<br />

// enable back-face cull<strong>in</strong>g<br />

gl.glEnable(GL.GL_CULL_FACE);<br />

...<br />

// disable back-face cull<strong>in</strong>g<br />

gl.glDisable(GL.GL_CULL_FACE);<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 16/23


Hidden Surface Determ<strong>in</strong>ation<br />

Back-Face Cull<strong>in</strong>g (Forts.)<br />

◮ Zum Bestimmen der Vorder- und Rückseite e<strong>in</strong>es Polygons wird<br />

dessen W<strong>in</strong>d<strong>in</strong>g betrachtet<br />

Daher ist es wichtig das Polygon-W<strong>in</strong>d<strong>in</strong>g konsistent zu halten<br />

if(bCull) {<br />

// enable back-face cull<strong>in</strong>g<br />

gl.glEnable(GL.GL_CULL_FACE);<br />

} else {<br />

// disable back-face cull<strong>in</strong>g<br />

gl.glDisable(GL.GL_CULL_FACE);<br />

}<br />

◮ Die Festlegung der Vorder- und Rückseiten geschieht mit der<br />

Methode glFrontFace(<strong>in</strong>t mode)<br />

// clockwise-wound polygons are front fac<strong>in</strong>g<br />

gl.glFrontFace(GL.GL_CW);<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 17/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Polygon Modes<br />

◮ Polygone müssen nicht grundsätzlich mit e<strong>in</strong>er Farbe gefüllt se<strong>in</strong><br />

◮ Mit der Methode glPolygonMode(<strong>in</strong>t face, <strong>in</strong>t mode) lässt sich festlegen,<br />

wie Polygone dargestellt werden sollen:<br />

GL.GL_POINT<br />

GL.GL_LINE<br />

GL.GL_FILL<br />

if(bOutl<strong>in</strong>e) {<br />

// draw polygons as outl<strong>in</strong>es<br />

gl.glPolygonMode(GL.GL_BACK, GL_LINE)<br />

} else {<br />

// draw polygons solid<br />

gl.glPolygonMode(GL.GL_BACK, GL_FILL)<br />

}<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 18/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Konstruktionsregeln für Polygone<br />

◮ Alle Polygone müssen planar se<strong>in</strong><br />

Die Vertices e<strong>in</strong>es Polygons müssen immer <strong>in</strong> genau e<strong>in</strong>er Ebene liegen<br />

Bei Dreiecken ist das überhaupt ke<strong>in</strong> Problem<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 19/23


<strong>Geometrische</strong> <strong>Primitive</strong><br />

Konstruktionsregeln für Polygone (Forts.)<br />

◮ Es darf ke<strong>in</strong>e Schnittpunkte zwischen den Kanten e<strong>in</strong>es Polygons<br />

geben<br />

◮ Polygone müssen konvex se<strong>in</strong>:<br />

Jede Strecke zweier Punkte des Polygons liegt vollständig <strong>in</strong> ihm<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 20/23


Grafikprogrammierung<br />

E<strong>in</strong> etwas anderes Beispiel ...<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 21/23


Literatur und L<strong>in</strong>ks<br />

<br />

<br />

<br />

<br />

Mason Woo, Jackie Neider, Tom Davis und Dave Shre<strong>in</strong>er<br />

<strong>OpenGL</strong> Programm<strong>in</strong>g Guide<br />

http://www.opengl.org/documentation/red book/<br />

Randi J. Rost<br />

<strong>OpenGL</strong> Shad<strong>in</strong>g Language<br />

http://www.3dshaders.com/<br />

Richard S. Wright und Michael Sweet<br />

<strong>OpenGL</strong> SuperBibel<br />

http://www.starstonesoftware.com/<strong>OpenGL</strong>/<br />

Tomas Möller und Eric Ha<strong>in</strong>es<br />

Real-Time Render<strong>in</strong>g<br />

http://www.realtimerender<strong>in</strong>g.com/<br />

Johannes Diemke <strong>OpenGL</strong> mit Java WiSe 2010 / 2011 22/23


Literatur und L<strong>in</strong>ks<br />

<br />

<br />

<br />

<br />

Fletcher Dunn und Ian Parberry<br />

3D Math Primer For Graphics and Game Development<br />

http://www.gamemath.com/<br />

Khronos Group<br />

<strong>OpenGL</strong> Homepage<br />

http://www.opengl.org/<br />

Game Technology Group at Sun Microsystems<br />

JOGL API Project<br />

https://jogl.dev.java.net/<br />

Fairlight und The Black Lotus<br />

Only one wish<br />

http://capped.tv/playeralt.php?vid=1215051083-1-0<br />

Johannes Diemke <strong>OpenGL</strong> 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!