Geometrische Primitive in OpenGL
Geometrische Primitive in OpenGL
Geometrische Primitive in OpenGL
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