<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>BlitzBasic Portal Worklogs - BBGL3D - Software-Renderer</title>
		<link>https://www.blitzforum.de/worklogs/276/</link>
		<description>Worklog von Blitzkrieg Bop</description>
		<language>de</language>
		<managingEditor>mail@blitzforum.de</managingEditor>
		<webMaster>mail@blitzforum.de</webMaster>
		<pubDate>Sun, 18 Oct 2009 01:32:31 +0200</pubDate>
		<lastBuildDate>Sun, 18 Oct 2009 01:32:31 +0200</lastBuildDate>

		<item>
			<title>3 Punkte, viel Arbeit und etwas für die Augen</title>
			<link>https://www.blitzforum.de/worklogs/276/#1874</link>
			<guid>https://www.blitzforum.de/worklogs/276/#1874</guid>
			<author>Blitzkrieg Bop</author>
			<description>Wie bereits am Ende des letzten Beitrages angedeutet, sollte nach der anf&amp;auml;nglichen Theorie ein wenig Praxis folgen. Im Vergleich zum hier bereits vorgestellten Konzept hat sich dabei nicht viel ge&amp;auml;ndert. Einzig die Ordnerstruktur wurde leicht angepasst: der Ordner &lt;b&gt;BBGL3D_Error&lt;/b&gt; wurde hinzugef&amp;uuml;gt. In der im Ordner befindlichen *.bb Datei werden Fehlermeldungen ausgewertet. Au&amp;szlig;erdem habe ich die Entscheidung getroffen, &lt;b&gt;Default-Werte&lt;/b&gt; und das &lt;b&gt;Koordinatensystem&lt;/b&gt; (3D/2D) aus OpenGL beizubehalten bzw. zu &amp;uuml;bernehmen. Im 3D-Raum betrifft dies vor allem die Z-Achse (umgekehrtes Vorzeichen); im 2D-Raum liegt bspw. der Punkt (0,0) &lt;i&gt;nicht&lt;/i&gt; wie in BB oben links, sondern unten links. Dies wird ein wesentlicher Unterschied zu BB3D sein - eventuell kann man sp&amp;auml;ter aber auch zwischen den Einstellungen wechseln k&amp;ouml;nnen.&lt;br /&gt;&lt;br /&gt;Mein Ziel war es, den Renderer bis zu diesem Zeitpunkt soweit zu realisieren, dass ein einfaches Dreieck gerendert wird. Dabei kam es mir nur darauf an, dass man die drei Eckpunkte des Dreiecks sp&amp;auml;ter auf dem Bildschirm zu sehen bekommt. Das mag zun&amp;auml;chst relativ einfach klingen - und das ist es im Prinzip auch - doch bereits die fr&amp;uuml;heren Versionen des Renderers waren ziemlich durchstrukturiert und die einzelnen Funktionen streng geordnet. Ich hatte also die Wahl: entweder schreibe ich den Code unflexibel, dreckig und un&amp;uuml;bersichtlich zusammen, sodass ich schnell das richtige Ergebnis begutachten kann oder ich bleibe von Anfang an sauber und folge der Strukturierung. Da letzteres f&amp;uuml;r mich eine gro&amp;szlig;e Priorit&amp;auml;t hat, habe ich mich f&amp;uuml;r eine dementsprechende Arbeitsweise entschieden. Aus diesem Grund ist der Umfang der ben&amp;ouml;tigten Funktionen und Dateien, selbst f&amp;uuml;r ein solch kleines Beispiel, bereits sehr gro&amp;szlig;.&lt;br /&gt;&lt;br /&gt;Im Sinne der besseren &amp;Uuml;bersicht habe ich ein &lt;b&gt;Changelog&lt;/b&gt; erstellt, in dem man die wesentlichen &amp;Auml;nderungen (&lt;b&gt;[ADD]&lt;/b&gt;, &lt;b&gt;[CHANGE]&lt;/b&gt;, &lt;b&gt;[DELETE]&lt;/b&gt; usw.) &amp;uuml;berblicken kann. Da ich es erst heute erstellt habe, fasse ich in der ersten Version den Zeitraum vom letzten Worklogeintrag (6.10) bis heute (18.10) zusammen. Das Changelog ist aufgeteilt in drei Bereiche: als Erstes werden &amp;Auml;nderungen in der Ordnerstruktur angegeben. Danach folgen Informationen zur Dateiverwaltung. Zum Schluss gibt es einen &amp;Uuml;berblick &amp;uuml;ber alle Funktionen. Die Dateien und Funktionen sind der &amp;Uuml;bersicht halber in die zugeh&amp;ouml;rigen Bereiche (BBGL3D_Error, BBGL3D_Functions usw.) unterteilt. Mit Leerzeilen werden bei der Aufz&amp;auml;hlung der Funktionen zusammenh&amp;auml;ngende Funktionsbl&amp;ouml;cke dargestellt (z.B. alle Funktionen, die etwas mit der Kamera zu tun haben). Das Changelog sieht im Moment so aus:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox0&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('0')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox0&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('0')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox0&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('0');&quot;&gt;Datum&amp;#58; 6.10.2009 - 18.10.2009&lt;br /&gt;Version&amp;#58; 0.2&lt;br /&gt;&lt;br /&gt;ORDNER&amp;#58;&lt;br /&gt;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_Debug&lt;br /&gt;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_Error&lt;br /&gt;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_Functions&lt;br /&gt;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_Maths&lt;br /&gt;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_Misc&lt;br /&gt;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_Variables&lt;br /&gt;&lt;br /&gt;DATEIEN&amp;#58;&lt;br /&gt;&amp;nbsp;BBGL3D_Debug&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;-&lt;br /&gt;&amp;nbsp;BBGL3D_Error&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_ERROR_Evaluate.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_ERROR_Include.bb&lt;br /&gt;&amp;nbsp;BBGL3D_Functions&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_FUNCTIONS_Camera.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_FUNCTIONS_Include.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_FUNCTIONS_Mesh.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_FUNCTIONS_Misc.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_FUNCTIONS_Render.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_FUNCTIONS_Surface.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_FUNCTIONS_Triangle.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_FUNCTIONS_Vertex.bb&lt;br /&gt;&amp;nbsp;BBGL3D_Maths&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_Include.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_Matrix.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_Misc.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_Vertex.bb&lt;br /&gt;&amp;nbsp;BBGL3D_Misc&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;-&lt;br /&gt;&amp;nbsp;BBGL3D_Variables&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Camera.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Error.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Include.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Matrix.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Mesh.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Misc.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Surface.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Triangle.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Vector.bb&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VARIABLES_Vertex.bb&lt;br /&gt;&lt;br /&gt;FUNKTIONEN&amp;#58;&lt;br /&gt;&amp;nbsp;BBGL3D_Debug&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;-&lt;br /&gt;&amp;nbsp;BBGL3D_Error&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_ERROR_GetError&amp;#40;ErrorIndex%&amp;#41;&lt;br /&gt;&amp;nbsp;BBGL3D_Functions&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CreateCamera&amp;#40;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CameraViewport&amp;#40;CameraIndex%, X%, Y%, Width%, Height%&amp;#41; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CameraRange&amp;#40;CameraIndex%, zNear#, zFar#&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CameraDepthRange&amp;#40;CameraIndex%, dNear#, dFar#&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CameraFOVY&amp;#40;CameraIndex%, FOVY#&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CameraAspect&amp;#40;CameraIndex%, Aspect#&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CreateMesh&amp;#40;&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_GetFPS&amp;#40;&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_Free&amp;#40;&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_RenderWorld&amp;#40;CameraIndex%&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CreateSurface&amp;#40;MeshIndex%&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CountSurfaces&amp;#40;MeshIndex%&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_AddTriangle&amp;#40;SurfaceIndex%, Vertex0Index%, Vertex1Index%, Vertex2Index%&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_CountTriangles&amp;#40;SurfaceIndex%&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_AddVertex&amp;#40;X#, Y#, Z#, W# = 1.0&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_VertexCoords&amp;#40;VertexIndex%, X#, Y#, Z#&amp;#41;&lt;br /&gt;&amp;nbsp;BBGL3D_Maths&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_MATRIX_LoadIdentiy&amp;#40;Matrix.TBBGL3D_Matrix&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_MATRIX_Perspective&amp;#40;Matrix.TBBGL3D_Matrix, FOVY#, Aspect#, zNear#, zFar#&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_MATRIX_VectorMultiply&amp;#40;Matrix.TBBGL3D_Matrix, srcVector.TBBGL3D_Vector4D, destVector.TBBGL3D_Vector4D&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_MISC_Clamp#&amp;#40;Value#, Min#, Max#&amp;#41;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_VERTEX_ComputeEyeCoords&amp;#40;Vertex.TBBGL3D_Vertex&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_VERTEX_ComputeClippingCoords&amp;#40;Projection.TBBGL3D_Matrix, Vertex.TBBGL3D_Vertex&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_VERTEX_ComputeNormalizedDeviceCoords&amp;#40;Vertex.TBBGL3D_Vertex&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;#91;ADD&amp;#93;&amp;nbsp; &amp;nbsp;BBGL3D_MATHS_VERTEX_ComputeScreenCoords&amp;#40;Camera.TBBGL3D_Camera, Vertex.TBBGL3D_Vertex&amp;#41;&lt;br /&gt;&amp;nbsp;BBGL3D_Misc&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;-&lt;br /&gt;&amp;nbsp;BBGL3D_Variables&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp;-&lt;/div&gt;&lt;br /&gt;Neben den Hinweisen auf die internen Implementierungen, d&amp;uuml;rften vor allem die Funktionen in der Rubrik &lt;b&gt;BBGL3D_Functions&lt;/b&gt; interessant sein. Das sind die Funktionen, mit denen der Benutzer sp&amp;auml;ter direkt arbeiten wird. Alles andere sind interne Funktionen, die dem Benutzer im Grunde genommen egal sein k&amp;ouml;nnen. &lt;br /&gt;&lt;br /&gt;Man erkennt bereits die starke Anlehnung an den &lt;b&gt;BB3D-Syntax&lt;/b&gt;. Dabei sind einige Funktionen nat&amp;uuml;rlich (leicht) vereinfacht bzw. syntaktisch nicht 100% identisch. Au&amp;szlig;erdem erkennt man, dass es zus&amp;auml;tzliche Funktionen geben wird, die BB3D von Haus aus &lt;i&gt;nicht&lt;/i&gt; zur Verf&amp;uuml;gung stellt. &lt;br /&gt;&lt;br /&gt;Die beiden Funktionen &lt;b&gt;BBGL3D_CameraFOVY(CameraIndex%, FOVY#)&lt;/b&gt; und &lt;b&gt;BBGL3D_CameraRange(CameraIndex%, zNear#, zFar#)&lt;/b&gt;&lt;i&gt; m&amp;uuml;ssen&lt;/i&gt; bei der Initialisierung einer Kamera in jedem Fall angegeben werden, da die zugeh&amp;ouml;rige OpenGL Funktion (&lt;a href=&quot;http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/perspective.html&quot; target=&quot;_blank&quot;&gt;gluPerspective&lt;/a&gt;) diese Parameter erwartet und somit keine Default-Werte existieren.&lt;br /&gt;&lt;br /&gt;Es wird also deutlich, was ich bereits in einem vorherigen Eintrag erl&amp;auml;utert habe: das Projekt ist ein Kompromiss zwischen dem BB3D-Syntax und den zus&amp;auml;tzlichen M&amp;ouml;glichkeiten von OpenGL.&lt;br /&gt;&lt;br /&gt;In Aktion sieht das Ganze dann wie folgt aus. Das Resultat (die drei Punkte) sind auch zu erkennen. Au&amp;szlig;erdem sieht man, wie leicht &lt;b&gt;BBGL3D&lt;/b&gt; einzubinden ist:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=7164&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Zum Vergleich wird die Szene mit &lt;b&gt;&lt;a href=&quot;http://basic4gl.wikispaces.com/&quot; target=&quot;_blank&quot;&gt;Basic4GL&lt;/a&gt;&lt;/b&gt; gerendert (das werde ich bei sp&amp;auml;teren Tests auch immer wieder machen):&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=7165&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Man sieht: die Ergebnisse sind identisch (zum Gl&amp;uuml;ck &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;). Damit scheinen die ersten Strukturen, Berechnungen und der Ablauf der Pipeline einigerma&amp;szlig;en vern&amp;uuml;nftig implementiert worden zu sein &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt; .&lt;br /&gt;&lt;br /&gt;Als n&amp;auml;chstes wird es unter anderem darum gehen, dass &lt;b&gt;Fehlersystem&lt;/b&gt; zu integrieren. Das ist bisher nicht geschehen, sollte aber dringend getan werden, damit der Benutzer auch mitbekommt, wenn er falsche Parameter &amp;uuml;bergibt.&lt;br /&gt;&lt;br /&gt;Gru&amp;szlig;,&lt;br /&gt;Blitzkrieg Bop</description>
			<pubDate>Sun, 18 Oct 2009 01:32:31 +0200</pubDate>
		</item>

		<item>
			<title>Matrizen und Vektoren</title>
			<link>https://www.blitzforum.de/worklogs/276/#1825</link>
			<guid>https://www.blitzforum.de/worklogs/276/#1825</guid>
			<author>Blitzkrieg Bop</author>
			<description>Hallo!&lt;br /&gt;&lt;br /&gt;Im vorletzten Beitrag habe ich bereits die Projektions-Matrix und ihre Rolle innerhalb von OpenGL erl&amp;auml;utert. Matrizen spielen jedoch nicht nur bei der Projektion eine wichtige Rolle - darum soll sich der heutige Eintrag mit ein paar weiteren, wichtigen Matrizen auseinandersetzen.&lt;br /&gt;&lt;br /&gt;Der Ausgangspunkt f&amp;uuml;r die &amp;Uuml;berlegung weiterer Matrizen, ist die Frage, inwiefern man Objekte (in den meisten F&amp;auml;llen Meshes) manipulieren bzw. &lt;b&gt;transformieren&lt;/b&gt; will. Dabei existieren vor allem drei &lt;b&gt;Standardtransformationen&lt;/b&gt;: &lt;b&gt;Skalierung&lt;/b&gt;, &lt;b&gt;Rotation&lt;/b&gt; und &lt;b&gt;Translation&lt;/b&gt; (Verschiebung).&lt;br /&gt;&lt;br /&gt;Jede einzelne Transformation l&amp;auml;sst sich mit Hilfe einer geeigneten 4x4 Matrix beschreiben. Mathematisch gesehen handelt es sich bei den Matrizen um sogenannte &lt;a href=&quot;http://de.wikipedia.org/wiki/Affine_Abbildung&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;affine Abbildungen&lt;/b&gt;&lt;/a&gt;. Um die ganze Thematik komplett verstehen zu k&amp;ouml;nnen, ist einiges an Mathematik notwendig - aus diesem Grund werde ich nicht n&amp;auml;her auf mathematische Einzelheiten eingehen, sondern einfach die Matrizen angeben. Zu jeder Transformation habe ich den zugeh&amp;ouml;rigen (kurzen) Artikel auf &lt;a href=&quot;http://wiki.delphigl.com/&quot; target=&quot;_blank&quot;&gt;http://wiki.delphigl.com/&lt;/a&gt; verlinkt. Dort sind auch Abbildungen vorhanden, welche die jeweilige Operation veranschaulichen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Skalierung&lt;/b&gt;:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://wiki.delphigl.com/images/f/f6/GlScale.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;(Quelle und Link zum Artikel: &lt;a href=&quot;http://wiki.delphigl.com/index.php/glScale&quot; target=&quot;_blank&quot;&gt;http://wiki.delphigl.com/index.php/glScale&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rotation&lt;/b&gt;:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox1&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('1')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox1&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('1')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox1&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('1');&quot;&gt;x&amp;sup2;&amp;#40;1-c&amp;#41;+c&amp;nbsp; &amp;nbsp; xy&amp;#40;1-c&amp;#41;-zs&amp;nbsp; &amp;nbsp;xz&amp;#40;1-c&amp;#41;+ys&amp;nbsp; &amp;nbsp;0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;yx&amp;#40;1-c&amp;#41;+zs&amp;nbsp; &amp;nbsp;y&amp;sup2;&amp;#40;1-c&amp;#41;+c&amp;nbsp; &amp;nbsp; yz&amp;#40;1-c&amp;#41;-xs&amp;nbsp; &amp;nbsp;0&lt;br /&gt;&lt;br /&gt;xz&amp;#40;1-c&amp;#41;-ys&amp;nbsp; &amp;nbsp;yz&amp;#40;1-c&amp;#41;+xs&amp;nbsp; &amp;nbsp;z&amp;sup2;&amp;#40;1-c&amp;#41;+c&amp;nbsp; &amp;nbsp; 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1&lt;/div&gt;&lt;br /&gt;Wobei gilt:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox2&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('2')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox2&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('2')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox2&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('2');&quot;&gt;c = cos&amp;#40;angle&amp;#41;&lt;br /&gt;s = sin&amp;#40;angle&amp;#41;&lt;br /&gt;length&amp;#40;x,y,z&amp;#41; = 1 &amp;#40;Falls nicht, normalisiert OpenGL den Vector vorher.&amp;#41;&lt;/div&gt;&lt;br /&gt;(Quelle und Link zum Artikel: &lt;a href=&quot;http://wiki.delphigl.com/index.php/glRotate&quot; target=&quot;_blank&quot;&gt;http://wiki.delphigl.com/index.php/glRotate&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Translation&lt;/b&gt;:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox3&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('3')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox3&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('3')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox3&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('3');&quot;&gt;| 1&amp;nbsp; 0&amp;nbsp; 0&amp;nbsp; x |&lt;br /&gt;| 0&amp;nbsp; 1&amp;nbsp; 0&amp;nbsp; y |&lt;br /&gt;| 0&amp;nbsp; 0&amp;nbsp; 1&amp;nbsp; z |&lt;br /&gt;| 0&amp;nbsp; 0&amp;nbsp; 0&amp;nbsp; 1 |&lt;/div&gt;&lt;br /&gt;(Quelle und Link zum Artikel: &lt;a href=&quot;http://wiki.delphigl.com/index.php/glTranslate&quot; target=&quot;_blank&quot;&gt;http://wiki.delphigl.com/index.php/glTranslate&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Anmerkung&lt;/b&gt;: DirectX sieht Vektoren als &lt;b&gt;Zeilenvektoren&lt;/b&gt; an. Bei OpenGL ist es anders: hier liegen Vektoren in Form von &lt;b&gt;Spalten&lt;/b&gt; vor. Insgesamt ist also nicht festgelegt, wie Matrizen bzw. Vektoren zu interpretieren sind. Man kann es prinzipiell machen, wie man will. Nur sollte man aufpassen, dass man von Anfang an ein klares System implementiert und sich auch konsequent daran h&amp;auml;lt. Vektoren sind in meinem Renderer ebenfalls Spaltenvektoren.&lt;br /&gt;&lt;br /&gt;Wie werden diese Matrizen nun angewendet? Das ist relativ einfach: Soll ein Objekt (in diesem Fall ein Mesh) transformiert werden, so spielen die zugeh&amp;ouml;rigen Matrizen und die Vertices (Ortsvektoren) des Meshes eine Rolle. Vereinfacht ausgedr&amp;uuml;ckt: die alten Werte werden angepasst, indem die (alten) Vektoren mit der jeweiligen Matrix multipliziert werden. &lt;br /&gt;&lt;br /&gt;Das ist allerdings nur eine sehr einfache Beschreibung des mathematischen Prozesses. In Wirklichkeit ist es so, dass die drei Matrizen (Skalierung, Rotation und Translation) zun&amp;auml;chst zu einer &amp;quot;gesamten&amp;quot; Matrix verschmolzen werden. Diese Matrix wird als &lt;a href=&quot;http://wiki.delphigl.com/index.php/Tutorial_Matrix2#GL_MODELVIEW&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;Modelviewmatrix&lt;/b&gt;&lt;/a&gt; bezeichnet. Die Matrix entsteht durch &lt;a href=&quot;http://de.wikipedia.org/wiki/Matrix_(Mathematik)#Matrizenmultiplikation&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;Multiplikation&lt;/b&gt;&lt;/a&gt; der anderen Matrizen. Es gilt:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox4&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('4')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox4&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('4')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox4&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('4');&quot;&gt;Modelview = Translation * Rotation * Skalierung&lt;/div&gt;&lt;br /&gt;Die Reihenfolge ist sehr wichtig (Matrizenmultiplikation ist &lt;i&gt;nicht&lt;/i&gt; kommutativ). Folgender &lt;a href=&quot;http://wiki.delphigl.com/index.php/Tutorial_Matrix2#Auswirkungen_von_Matrixmanipulationen_-_oder_.22Wie_positioniere_ich_meine_Objekte_richtig.3F.22&quot; target=&quot;_blank&quot;&gt;Link&lt;/a&gt; erkl&amp;auml;rt mit vielen Bildern, warum die Reihenfolge wichtig ist.&lt;br /&gt;&lt;br /&gt;Die Modelviewmatrix kann dann mit den Vertices des Meshes verrechnet werden. Im weiteren Verlauf kann man sich zu jedem Zeitpunkt in einem anderen Raum befinden: die Koordinaten eines Vertex sind zun&amp;auml;chst Objektkoordinaten (&lt;b&gt;object space&lt;/b&gt;). Multipliziert man die Modelviewmatrix mit den Objektkoordinaten erh&amp;auml;lt man Augpunktkoordinaten (&lt;b&gt;eye space&lt;/b&gt;). Die bereits vorgestellte Projektionsmatrix wird dann mit den Augpunktkoordinaten multipliziert: man erh&amp;auml;lt Clipping Koordinaten (&lt;b&gt;clipping space&lt;/b&gt;). Von dort ist es nur ein kleiner Schritt hin zu den normalisierten Device Koordinaten. (&lt;b&gt;NDC space&lt;/b&gt;) (X, Y und Z werden jeweils durch die W-Koordinate (siehe unten) dividiert). Nun werden die Viewport-Informationen verarbeitet, sodass man schlie&amp;szlig;lich die Bildschirmkoordinaten (&lt;b&gt;screen space&lt;/b&gt;) erh&amp;auml;lt (dieser Absatz l&amp;auml;sst sich auch gut in den OpenGL FAQs nachlesen: &lt;a href=&quot;http://www.opengl.org/resources/faq/technical/transformations.htm&quot; target=&quot;_blank&quot;&gt;http://www.opengl.org/resource...ations.htm&lt;/a&gt; Punkt 9.011 &amp;quot;How are coordinates transformed? ... &amp;quot;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Anmerkung&lt;/b&gt;: F&amp;uuml;r die Skalierung und Rotation w&amp;uuml;rden normalerweise 3x3 Matrizen ausreichen. Bei der Translation ist es nicht ganz so einfach: diese ist im R^3 &lt;i&gt;nicht&lt;/i&gt; linear; kann aber im R^4 linear dargestellt werden. Daher werden die sogenannten &lt;a href=&quot;http://en.wikipedia.org/wiki/Homogeneous_coordinate_system#Use_in_computer_graphics&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;homogenen Koordinaten&lt;/b&gt;&lt;/a&gt; eingef&amp;uuml;hrt, sodass es sich bei der Translations-Matrix schlie&amp;szlig;lich um eine 4x4  Matrix handelt. Dadurch, dass die Matrizen der Standardtransformationen miteinander multipliziert werden, m&amp;uuml;ssen auch die Matrizen der Rotation und Skalierung neu dimensioniert werden (4x4). Wie oben bereits erl&amp;auml;utert, spielt die Multiplikation von Matrizen und Vektoren eine wesentliche Rolle. Da Vektoren als Spaltenvektoren aufgefasst werden, sieht eine Matrix-Vektor-Multiplikation wie folgt aus: &lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox5&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('5')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox5&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('5')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox5&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('5');&quot;&gt;neuerVektor = Matrix * alterVektor&lt;/div&gt;&lt;br /&gt;&amp;quot;alterVektor&amp;quot; muss dabei genauso viele Zeilen, wie &amp;quot;Matrix&amp;quot; Spalten besitzt, enthalten. Und da ein (Spalten-)Vektor sowieso ein Spezialfall einer Matrix ist, werden auch hier die homogenen Koordinaten eingef&amp;uuml;hrt. Genau genommen l&amp;auml;sst sich ein Vertex also nicht anhand von drei Koordinaten (X, Y  und Z) definieren, sondern auch noch durch eine weitere vierte (diese wird &amp;uuml;blicherweise mit &lt;b&gt;W&lt;/b&gt; bezeichnet). In den meisten F&amp;auml;llen ist W jedoch gleich 1, wird vom Benutzer innerhalb der Anwendung sehr selten ver&amp;auml;ndert und spielt daher in der Regel kaum eine Rolle.&lt;br /&gt;&lt;br /&gt;So, ich denke das war erstmal der letzte gr&amp;ouml;&amp;szlig;ere Theorieteil. Das bisherige Wissen reicht aus, um den ersten Grundstein des Codes zu legen.&lt;br /&gt;&lt;br /&gt;Gru&amp;szlig;,&lt;br /&gt;Blitzkrieg Bop</description>
			<pubDate>Tue, 06 Oct 2009 02:57:25 +0200</pubDate>
		</item>

		<item>
			<title>Planung und Strukturen</title>
			<link>https://www.blitzforum.de/worklogs/276/#1808</link>
			<guid>https://www.blitzforum.de/worklogs/276/#1808</guid>
			<author>Blitzkrieg Bop</author>
			<description>Zur Abwechslung soll sich im heutigen Eintrag nicht alles direkt um OpenGL drehen. Ich m&amp;ouml;chte ein wenig die &lt;b&gt;Strukturen&lt;/b&gt; erl&amp;auml;utern, nach denen BBGL3D aufgebaut sein wird. &lt;br /&gt;&lt;br /&gt;Gerade bei etwas komplexeren Projekten ist eine durchdachte Planung unverzichtbar. Im BBGL3D-Projektordner wird es so sein, dass insgesamt f&amp;uuml;nf verschiedene Ordner existieren. Jeder Ordner beinhaltet die zugeh&amp;ouml;rigen *.bb-Dateien, welche &amp;uuml;ber ein Include-System leicht zu integrieren sind (jede Datei einzeln zu inkludieren, w&amp;auml;re im Sinne des Benutzers nicht sehr elegant). Die Ordner lauten bisher:&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;BBGL3D_Variables&lt;/b&gt;: hier werden s&amp;auml;mtliche Variablen/Strukturen definiert.&lt;br /&gt;- &lt;b&gt;BBGL3D_Maths&lt;/b&gt;: s&amp;auml;mtliche Mathe-Funktionen.&lt;br /&gt;- &lt;b&gt;BBGL3D_Functions&lt;/b&gt;: hier befinden sich alle Funktionen, die direkt vom Benutzer verwendet werden.&lt;br /&gt;- &lt;b&gt;BBGL3D_Debug&lt;/b&gt;: ein tempor&amp;auml;rer Ordner, zum systematischen debuggen.&lt;br /&gt;- &lt;b&gt;BBGL3D_Misc&lt;/b&gt;: ein paar zus&amp;auml;tzliche Funktionen (z.B. FPS-Counter).&lt;br /&gt;&lt;br /&gt;Dabei sind die Bezeichnungen der einzelnen *.bb-Dateien durch feste &lt;b&gt;Pr&amp;auml;fixe&lt;/b&gt; vorbestimmt. Das gleiche Prinzip trifft auf s&amp;auml;mtliche Funktionen zu. Zur besseren Vorstellung ein paar Beispiele:&lt;br /&gt;&lt;br /&gt;- Die Definition eines Vertex befindet sich in der Datei &lt;b&gt;BBGL3D_VARIABLES_Vertex.bb&lt;/b&gt;, welche sich im Ordner &lt;b&gt;BBGL3D_Variables&lt;/b&gt; befindet.&lt;br /&gt;&lt;br /&gt;- Will man zwei Matrizen miteinander multiplizieren, so lautet die zugeh&amp;ouml;rige Funktion &lt;b&gt;BBGL3D_MATHS_MATRIX_Multiply&lt;/b&gt;; sie befindet sich in der Datei &lt;b&gt;BBGL3D_MATHS_Matrix.bb&lt;/b&gt; im Ordner &lt;b&gt;BBGL3D_Maths&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;- Will der Benutzer eine Szene rendern, so wird die notwendige Funktion &lt;b&gt;BBGL3D_RenderWorld&lt;/b&gt; hei&amp;szlig;en; sie befindet sich in der Datei &lt;b&gt;BBGL3D_FUNCTIONS_Render.bb&lt;/b&gt; im Ordner &lt;b&gt;BBGL3D_Functions&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Bisher hat sich dieses Verfahren ganz gut geschlagen. Es kann nat&amp;uuml;rlich sein, dass ich noch ein paar Ver&amp;auml;nderungen einbaue, aber f&amp;uuml;rs Erste bleibt es wohl erstmal so.&lt;br /&gt;&lt;br /&gt;Zum Abschluss noch ein paar Worte zur internen Struktur, also der Verwaltung von Vertices, Triangles usw.: ich werde versuchen, die Hierarchie von BB3D nachzuempfinden. Das ist insofern n&amp;uuml;tzlich, als das man ein klares Muster hat, an dem man sich orientieren kann. Au&amp;szlig;erdem ist damit der Bezug zu BB3D hergestellt.&lt;br /&gt;&lt;br /&gt;Nach der vielen Theorie am Anfang, folgen allm&amp;auml;hlich die ersten N&amp;auml;herungen hin zum konkreten Code &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt; .&lt;br /&gt;&lt;br /&gt;Bis zum n&amp;auml;chsten Mal!&lt;br /&gt;&lt;br /&gt;Gru&amp;szlig;,&lt;br /&gt;Blitzkrieg Bop</description>
			<pubDate>Thu, 01 Oct 2009 01:24:45 +0200</pubDate>
		</item>

		<item>
			<title>Betrachtung von 3D-Szenen </title>
			<link>https://www.blitzforum.de/worklogs/276/#1802</link>
			<guid>https://www.blitzforum.de/worklogs/276/#1802</guid>
			<author>Blitzkrieg Bop</author>
			<description>Moin!&lt;br /&gt;&lt;br /&gt;Nachdem es im letzten Worklogeintrag vor allem um Vertices und deren Verarbeitung innerhalb der Rendering-Pipeline ging, soll dieses Mal ein Blick auf die grunds&amp;auml;tzliche &lt;b&gt;Betrachtung von 3D-Szenen&lt;/b&gt; geworfen werden.&lt;br /&gt;&lt;br /&gt;M&amp;ouml;chte man 3D-Szenen darstellen, stellt sich automatisch die Frage, wie man die Wahrnehmung dieser Szenen realisieren kann. Dabei hat sich das Prinzip der &amp;quot;&lt;b&gt;Kamera&lt;/b&gt;&amp;quot; durchgesetzt. Viele kennen dieses Verfahren sicherlich von BB3D: es wird eine Kamera erstellt, ggf. zugeh&amp;ouml;rige Attribute (Position, Winkel usw.) angepasst, und schon l&amp;auml;sst sich die aktuelle Szene durch diese Kamera betrachten (man spricht auch von einer &lt;b&gt;Projektion&lt;/b&gt; der Szene).&lt;br /&gt;&lt;br /&gt;Bei OpenGL verh&amp;auml;lt es sich ein wenig anders: im Grunde genommen existiert hier &lt;i&gt;keine&lt;/i&gt; Kamera (insbesondere keine bewegliche). Man geht immer davon aus, dass eine gegebene Szene vom &lt;b&gt;Ursprung&lt;/b&gt; (Koordinaten: X = Y = Z = 0; Blickrichtung: negative Z-Achse) aus betrachtet wird.&lt;br /&gt;&lt;br /&gt;In BB3D w&amp;auml;re es ein leichtes, eine solche Kamera zu manipulieren. Man k&amp;ouml;nnte z.B. die Position anpassen, indem man einfach den &lt;a href=&quot;https://www.blitzforum.de/help/PositionEntity&quot; target=&quot;_blank&quot;&gt;PositionEntity&lt;/a&gt; Befehl auf die Kamera anwendet. Sowas ist, wie bereits angedeutet, in OpenGL nicht m&amp;ouml;glich - zumindest nicht direkt. Um einen solchen Effekt ebenfalls umsetzten zu k&amp;ouml;nnen, muss ein wenig getrickst werden. Soll beispielsweise die Kamera (auch wenn es, wie oben bereits angedeutet, im Grunde keine Kamera in OpenGL gibt, wird dennoch oftmals der Begriff der Kamera verwendet) um zwei Einheiten nach oben versetzt werden, l&amp;auml;sst sich ein analoger Effekt dadurch erreichen, indem alle relevanten Objekte zwei Einheiten nach unten verschoben werden. Dieses Verfahren l&amp;auml;sst sich auf alle relevanten Kamera-Attribute &amp;uuml;bertragen, sodass sich &lt;i&gt;theoretisch&lt;/i&gt; ein flexibles Kamerasystem &amp;quot;vort&amp;auml;uschen&amp;quot; l&amp;auml;sst (inwiefern ein solches Kamerasystem innerhalb von BBGL3D implementiert werden wird, ist noch offen).&lt;br /&gt;&lt;br /&gt;Die tats&amp;auml;chliche Realisierung der jeweiligen Kamera erfolgt durch eine sogenannte &lt;b&gt;Projektions-Matrix&lt;/b&gt;, in der alle relevanten Daten &amp;quot;verarbeitet&amp;quot; werden. OpenGL unterst&amp;uuml;tzt &lt;b&gt;orthogonale&lt;/b&gt; und &lt;b&gt;perspektivische&lt;/b&gt; Projektion. Auch dies wird vielen von BB3D her bekannt sein: dort l&amp;auml;sst sich mit Hilfe des Befehls &lt;a href=&quot;https://www.blitzforum.de/help/CameraProjMode&quot; target=&quot;_blank&quot;&gt;CameraProjMode&lt;/a&gt; die Art der jeweiligen Projektion ausw&amp;auml;hlen (orthogonal bzw. perspektivisch).&lt;br /&gt;&lt;br /&gt;Die beiden Arten der Projektionen unterscheiden sich im Wesentlichen im Hinblick auf &lt;b&gt;Tiefenhinweise&lt;/b&gt;: so erscheinen bei der orthogonalen Projektion weit entfernte Objekte genauso gro&amp;szlig;, wie nahegelegene. Im Gegensatz dazu steht die perspektivische Projektion, bei der weit entfernte Objekte kleiner wahrzunehmen sind, als nahe. Somit entspricht die perspektivische Projektion unserer &lt;b&gt;nat&amp;uuml;rlichen Wahrnehmung des 3D-Raumes&lt;/b&gt; und ist damit in den meisten (reinen) 3D-Anwendungen von gr&amp;ouml;&amp;szlig;erer Bedeutung, als die orthogonale Alternative, welche vor allem bei 2D-Men&amp;uuml;s usw. Verwendung findet (aus diesem Grund ist innerhalb von BBGL3D bisher nur die perspektivische Projektion integriert. Das wird vermutlich auch erstmal so bleiben).&lt;br /&gt;&lt;br /&gt;Der ein oder andere wird sich vielleicht fragen, wo genau der Unterschied zwischen den Projektionssystemen liegt. Schlie&amp;szlig;lich kann dieser kaum lediglich anhand der Werteverarbeitung innerhalb der jeweiligen Projektions-Matrix erfolgen! Dabei wurde bisher eine wichtige Vokabel verschwiegen: der &lt;b&gt;Sichtbereich&lt;/b&gt; einer 3D-Szene. Je nachdem, wie dieser Bereich &amp;quot;organisiert&amp;quot; wird, lassen sich die gew&amp;uuml;nschten Effekte, wie z.B. der korrekte Tiefenhinweis bei der perspektivischen Projektion, realisieren. Dabei l&amp;auml;sst sich der Sichtbereich bei orthogonaler Projektion durch einen &lt;b&gt;Quader&lt;/b&gt; repr&amp;auml;sentieren:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://www.glprogramming.com/red/images/Image63.gif&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;(Quelle: &lt;a href=&quot;http://www.glprogramming.com/red/chapter03.html&quot; target=&quot;_blank&quot;&gt;http://www.glprogramming.com/red/chapter03.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Bei der perspektivischen Projektion handelt es sich um ein &lt;b&gt;Frustum&lt;/b&gt; (Kegelstumpf):&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://www.glprogramming.com/red/images/Image61.gif&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;(Quelle: &lt;a href=&quot;http://www.glprogramming.com/red/chapter03.html&quot; target=&quot;_blank&quot;&gt;http://www.glprogramming.com/red/chapter03.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Man erkennt anhand der Bilder viele relevante Attribute der Kamera: dabei existieren stets sechs Ebenen (&lt;b&gt;near-, far-, top-, bottom-, left-&lt;/b&gt; und &lt;b&gt;right-plane&lt;/b&gt;), die eine sehr charakteristische Eigenschaft der Kamera sind. Relevant ist dies vor allem bei der Pr&amp;uuml;fung, ob ein Objekt &amp;uuml;berhaupt im sichtbaren Bereich der Kamera liegt (&lt;a href=&quot;http://wiki.delphigl.com/index.php/Frustum_Culling&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;Frustum Culling&lt;/b&gt;&lt;/a&gt;). Bei der perspektivischen Projektion ist weitehrin der &lt;b&gt;fovy&lt;/b&gt; (Field of View-Winkel (in Grad) entlang der Y-Achse) und der &lt;b&gt;aspect&lt;/b&gt;, also das Verh&amp;auml;ltnis von Breite zu H&amp;ouml;he (dies sind oftmals die n&amp;ouml;tigen &lt;b&gt;Viewport&lt;/b&gt;-Informationen), relevant: &lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://www.glprogramming.com/red/images/Image62.gif&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;(Quelle: &lt;a href=&quot;http://www.glprogramming.com/red/chapter03.html&quot; target=&quot;_blank&quot;&gt;http://www.glprogramming.com/red/chapter03.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Mathematisch lassen sich die Matrizen der jeweiligen Projektionstypen wie folgt definieren:&lt;br /&gt;&lt;br /&gt;Orthogonal:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://wiki.delphigl.com/images/f/f6/GlOrtho_Matrix.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;(Quelle: &lt;a href=&quot;http://wiki.delphigl.com/index.php/glOrtho&quot; target=&quot;_blank&quot;&gt;http://wiki.delphigl.com/index.php/glOrtho&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Perspektivisch:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://wiki.delphigl.com/images/a/a8/GluPerspective.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;(Quelle: &lt;a href=&quot;http://wiki.delphigl.com/index.php/gluPerspective&quot; target=&quot;_blank&quot;&gt;http://wiki.delphigl.com/index.php/gluPerspective&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Als letztes noch der Hinweis auf das zu Grunde liegende Koordinatensystem: im 3D-Raum wird oftmals zwischen dem &lt;b&gt;left-&lt;/b&gt; und &lt;b&gt;right-handed&lt;/b&gt; Koordinatensystem unterschieden. Zum Vergleich eine Abbildung: &lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://alt.pluralsight.com/wiki/etc/images/CoordinateSystems.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;(Quelle: &lt;a href=&quot;http://jccc-mpg.wikidot.com/basic-coordinate-geometry&quot; target=&quot;_blank&quot;&gt;http://jccc-mpg.wikidot.com/ba...e-geometry&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Die Systeme unterscheiden sich also lediglich durch das Vorzeichen entlang der Z-Achse. BB3D, bzw. &lt;a href=&quot;http://de.wikipedia.org/wiki/DirectX&quot; target=&quot;_blank&quot;&gt;DirectX&lt;/a&gt;, verwendet das left-handed System - OpenGL die right-handed Variante. Letzteres ist bisher in BBGL3D implementiert; eventuell wird es eine M&amp;ouml;glichkeit geben, die Systeme bei Bedarf umschalten zu k&amp;ouml;nnen.&lt;br /&gt;&lt;br /&gt;Damit endet der kurze Einblick in das Thema der Betrachtung von 3D-Szenen. Leider kann ich hier kaum n&amp;auml;her ins Detail gehen, da der Umfang enorm w&amp;auml;re. Auch wird dies wohl nicht das einzige Thema bleiben, bei dem h&amp;ouml;chstens ein grober &amp;Uuml;berblick vermittelt werden kann - ich hoffe, dass dies einigerma&amp;szlig;en gelungen ist. Wenn jemand weiteres Interesse hat, so findet man im Internet zu jedem einzelnen Thema mehr oder weniger viele Information (gerade wenn man die Fachbegriffe mit angibt).&lt;br /&gt;&lt;br /&gt;Gru&amp;szlig;,&lt;br /&gt;Blitzkrieg Bop</description>
			<pubDate>Tue, 29 Sep 2009 03:02:11 +0200</pubDate>
		</item>

		<item>
			<title>Die OpenGL Rendering-Pipeline</title>
			<link>https://www.blitzforum.de/worklogs/276/#1785</link>
			<guid>https://www.blitzforum.de/worklogs/276/#1785</guid>
			<author>Blitzkrieg Bop</author>
			<description>Okay, wie bereits im ersten Eintrag angedeutet, dreht sich bei &lt;b&gt;BBGL3D&lt;/b&gt; alles um die &lt;a href=&quot;http://www.cs.kent.edu/~farrell/graphics/opengl/openglprog1.2/opengl/pipe.gif&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;OpenGL Rendering-Pipeline&lt;/b&gt;&lt;/a&gt;. Aus diesem Grund m&amp;ouml;chte ich den Pipeline-Ablauf kurz skizzieren:&lt;br /&gt;&lt;br /&gt;Zur Erinnerung: das Ziel ist es, &lt;b&gt;Grafiken&lt;/b&gt; darzustellen. Diese Grafiken m&amp;uuml;ssen in irgendeiner Form beschrieben und repr&amp;auml;sentiert werden, sodass auch Manipulationen leicht m&amp;ouml;glich sind. &amp;Uuml;blicherweise geschieht dies mit Hilfe von &lt;a href=&quot;http://de.wikipedia.org/wiki/Vektor&quot; target=&quot;_blank&quot;&gt;Vektoren&lt;/a&gt;. Oftmals wird der Begriff eines Vektors indirekt benutzt; man spricht eher von sogenannten &lt;b&gt;Vertices&lt;/b&gt; (Mehrzahl von &lt;b&gt;Vertex&lt;/b&gt;).&lt;br /&gt;Ein &lt;a href=&quot;http://de.wikipedia.org/wiki/Vertex&quot; target=&quot;_blank&quot;&gt;Vertex&lt;/a&gt; beschreibt einen Punkt im Raum (viele werden es sicher von BB3D kennen: dort l&amp;auml;sst sich mit Hilfe des Befehls &amp;quot;&lt;a href=&quot;https://www.blitzforum.de/help/AddVertex&quot; target=&quot;_blank&quot;&gt;AddVertex&lt;/a&gt;&amp;quot; ein solcher Punkt definieren. In der weiteren Betrachtung wird immer vom &lt;b&gt;3D-Raum&lt;/b&gt; ausgegangen). &lt;br /&gt;&lt;br /&gt;Hat man nicht nur einen Vertex, sondern mehrere Vertices, so lassen sich damit wunderbar Grafiken beschreiben. Dabei stellt jeder Vertex den Eckpunkt eines &amp;quot;Grafik-Objektes&amp;quot; dar. Bei BB3D verh&amp;auml;lt es sich beispielsweise so, dass ein &lt;b&gt;Mesh&lt;/b&gt;, also ein Gitterobjekt, existiert. Dieses besteht aus sogenannten &lt;b&gt;Surfaces&lt;/b&gt; (Oberfl&amp;auml;chen). Diese wiederum bestehen aus &lt;b&gt;Triangles&lt;/b&gt; (Dreiecken). Diese bestehen jeweils aus drei Vertices. Somit sind Vertices der Grundstein jedes Grafik-Objektes und dementsprechend au&amp;szlig;erordentlich wichtig. Dabei kann jeder Vertex als Vektor (genauer: &lt;a href=&quot;http://de.wikipedia.org/wiki/Ortsvektor&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;Ortsvektor&lt;/b&gt;&lt;/a&gt;) interpretiert werden, womit die mathematische Grundlage zur Beschreibung von 3D-Grafiken gegeben ist.&lt;br /&gt;&lt;br /&gt;Mit diesem Wissen kann die Rendering-Pipeline anhand der drei wesentlichen Phasen erl&amp;auml;utert werden:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(I) Vertexprozessor&lt;/b&gt;&lt;br /&gt;Gegeben ist eine Menge an Vertices. Diese wird nun an den Vertexprozessor weitergeleitet und dort verarbeitet. Hier finden unter anderem alle notwendigen &lt;b&gt;Transformationen&lt;/b&gt; (Rotation, Skalierung und Translation), sowie &lt;b&gt;Lichtberechnungen&lt;/b&gt; usw. statt. &lt;br /&gt;Da das zugrunde liegende 3D-Objekt ein beliebiges &lt;b&gt;Polygon&lt;/b&gt; sein kann, m&amp;uuml;ssen die vorhandenen Vertices dem Prozess der sogenannten &lt;b&gt;Tesselierung&lt;/b&gt; unterzogen werden. Dabei wird das urspr&amp;uuml;ngliche, durch die Vertices definierte, Polygon in &lt;b&gt;primitive Fl&amp;auml;chen&lt;/b&gt; (z.B. Dreiecke, Vierecke und Linien) zerlegt, da man mit diesen Fl&amp;auml;chen besser arbeiten kann. Grafikkarten sind auf einen Spezialfall der Tesselierung, die sogenannte &lt;b&gt;Triangulierung&lt;/b&gt;, spezialisiert. Somit wird prinzipiell jedes Polygon (ab der Dimension eines Vierecks), im Sinne der Hardware, in Dreiecke zerlegt (Anmerkung: der Software-Renderer wird vermutlich auf die Tesselierung verzichten, da Dreiecke als absolute Grundlage angesehen werden (genau wie bei BB3D)).&lt;br /&gt;Zu diesem Zeitpunkt wird jeder Vertex durch einen Ortsvektor und den zugeh&amp;ouml;rigen Koordinaten (X, Y, Z) im 3D-Raum beschrieben. Das Ziel muss es sein, diesen 3D-Punkt auf die &lt;b&gt;2D-Ebene&lt;/b&gt; des Monitors zu transformieren. Genau das passiert in einem der letzten Schritte innerhalb des Vertexprozessors. Hier finden auch erste Tests statt, ob bestimmte Vertices &amp;uuml;berhaupt im Sichtbereich der Kamera liegen: ist dies nicht der Fall, so k&amp;ouml;nnen die betroffenen Vertices ignoriert und die Performance unter Umst&amp;auml;nden enorm gesteigert werden. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(II) Scan Conversion (Rasterung)&lt;/b&gt;&lt;br /&gt;Nachdem nun alle notwendigen (Eck-)Punkte berechnet und auf die 2D-Ebene projiziert wurden, findet der Prozess der &lt;b&gt;Rasterung&lt;/b&gt; statt. Dabei geht es darum, &amp;quot;alle anderen notwendigen Punkte&amp;quot; zu bestimmen. Man darf nicht vergessen: die durch den Vertexprozessor bestimmten Punkte waren urspr&amp;uuml;nglich Vertices, also Eckpunkte eines Gitter-Objektes! Angenommen es soll eine Linie dargestellt werden: diese Linie besitzt genau zwei Eckpunkte (Vertices). Nat&amp;uuml;rlich interessiert man sich nicht nur f&amp;uuml;r diese beiden Eckpunkte, sondern auch f&amp;uuml;r die Punkte zwischen ihnen, sodass (sp&amp;auml;ter) graphisch auch wirklich eine Linie zu erkennen ist. Um diese Art von Punkten geht es bei der &lt;b&gt;Scan Conversion&lt;/b&gt;. Um bei dem Beispiel zu bleiben: anhand der gegebenen (und durch den Vertexprozessor auf die 2D-Ebene projizierten) Eckpunkte der Linie, lassen sich nun alle anderen Punkte durch &lt;a href=&quot;http://de.wikipedia.org/wiki/Interpolation_(Mathematik)&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;Interpolation&lt;/b&gt;&lt;/a&gt; bestimmen. Diese Punkte werden &lt;b&gt;Fragmente&lt;/b&gt; genannt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(III) Fragmentprozessor &lt;/b&gt;&lt;br /&gt;Im Prinzip hat man nun alles was man braucht: alle notwendigen Fragmente, die es darzustellen gilt, sind bekannt. &amp;Auml;hnlich wie beim Vertexprozessor gibt es aber auch hier noch einen Haufen an durchzuf&amp;uuml;hrenden Operationen, wie z.B. &lt;b&gt;Texturzugriffe&lt;/b&gt;, &lt;b&gt;Nebel&lt;/b&gt; usw. Es geht also im Grunde darum, die finalen Farben der Fragmente festzulegen.&lt;br /&gt;Sind diese Operationen abgeschlossen, finden abschlie&amp;szlig;end ein paar Tests statt. Dabei soll festgestellt werden, ob das jeweilige Fragment tats&amp;auml;chlich gezeichnet werden darf, oder nicht. Einer dieser Tests ist der &lt;b&gt;Depth-Test&lt;/b&gt;: da jedes Fragment bei der vorherigen Interpolation auch einen Z-Wert erhalten hat, lassen sich somit m&amp;ouml;gliche &amp;Uuml;berdeckungen von unterschiedlichen Fragmenten leicht feststellen, sodass Fragmente ggf. verworfen werden k&amp;ouml;nnen.&lt;br /&gt;Erst wenn alle Tests bestanden sind, kann das Fragment gezeichnet werden.&lt;br /&gt;&lt;br /&gt;So, das war der &lt;i&gt;&lt;b&gt;sehr grobe&lt;/b&gt;&lt;/i&gt; Entwurf der Rendering-Pipeline. Ich habe diverse Fachbegriffe und Vertiefungen weggelassen, da es absolut den Rahmen sprengen w&amp;uuml;rde. Au&amp;szlig;erdem werden einige Themen sp&amp;auml;ter detaillierter behandelt. Auch auf &lt;a href=&quot;http://de.wikipedia.org/wiki/Vertex-Shader&quot; target=&quot;_blank&quot;&gt;Vertex-&lt;/a&gt;, &lt;a href=&quot;http://de.wikipedia.org/wiki/Geometry-Shader&quot; target=&quot;_blank&quot;&gt;Geometry-&lt;/a&gt; und &lt;a href=&quot;http://de.wikipedia.org/wiki/Pixel-Shader&quot; target=&quot;_blank&quot;&gt;Fragment-Shader&lt;/a&gt; gehe ich nicht weiter ein, da sie an dieser Stelle keine Rolle spielen (nur als kleine Anmerkung: in Wirklichkeit repr&amp;auml;sentiert der hier beschriebene Pipeline-Ablauf eine sogenannte &lt;b&gt;Fixed-Function-Pipeline&lt;/b&gt;. Dieser Begriff soll deutlich machen, dass der Programmierer keinen Einfluss auf den Ablauf hat und dementsprechend auch keine Manipulationen stattfinden k&amp;ouml;nnen. Dieser Aspekt hat sich jedoch im Laufe der Zeit gewandelt, so besteht mittlerweile die M&amp;ouml;glichkeit, den Ablauf (abgesehen von der Scan Conversion) durch geeignete &lt;a href=&quot;http://de.wikipedia.org/wiki/Shader&quot; target=&quot;_blank&quot;&gt;Shader-Programme&lt;/a&gt; zu manipulieren. Die zugeh&amp;ouml;rigen Berechnungen werden dann direkt auf der GPU (&lt;b&gt;Shader-Einheiten&lt;/b&gt;) ausgef&amp;uuml;hrt, wodurch viel Zeit einzusparen ist. Bei der aktuellen Hardware arbeitet man im Prinzip vollst&amp;auml;ndig mit Shadern. Die hier beschriebene Fixed-Function-Pipeline wird also einfach in Form eines Shaders realisiert).&lt;br /&gt;&lt;br /&gt;Tut mir ja fast schon Leid, so viel geschrieben zu haben. Hoffentlich f&amp;uuml;hlt sich keiner direkt erschlagen &lt;img src=&quot;/forum/images/smiles/icon_confused.gif&quot; alt=&quot;Confused&quot; /&gt; . Aber ein wenig Theorie ist bei dieser Thematik leider notwendig bzw. ziemlich hilfreich. Vielleicht hat ja noch jemand was dabei gelernt!&lt;br /&gt;&lt;br /&gt;Bevor ich es vergesse: vielen Dank f&amp;uuml;r die ersten Kommentare. Das kann wirklich sehr motivieren &lt;img src=&quot;/forum/images/smiles/icon_cool.gif&quot; alt=&quot;Cool&quot; /&gt; .&lt;br /&gt;&lt;br /&gt;In diesem Sinne, bis zum n&amp;auml;chsten Mal &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt; .&lt;br /&gt;&lt;br /&gt;Gru&amp;szlig;,&lt;br /&gt;Blitzkrieg Bop</description>
			<pubDate>Wed, 23 Sep 2009 01:46:39 +0200</pubDate>
		</item>

		<item>
			<title>Hey! Ho! Let's Go</title>
			<link>https://www.blitzforum.de/worklogs/276/#1782</link>
			<guid>https://www.blitzforum.de/worklogs/276/#1782</guid>
			<author>Blitzkrieg Bop</author>
			<description>Hallo,&lt;br /&gt;hiermit m&amp;ouml;chte ich euch mein Projekt &lt;b&gt;BBGL3D&lt;/b&gt; vorstellen &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt; .&lt;br /&gt;&lt;br /&gt;Bei BBGL3D handelt es sich um einen Software-Renderer, welcher auf den Spezifikationen (Ablauf/Mathematik) der Grafik-API OpenGL basiert. Der Name des Projektes setzt sich aus den Worten &lt;b&gt;B&lt;/b&gt;litz &lt;b&gt;B&lt;/b&gt;asic, Open&lt;b&gt;GL&lt;/b&gt; und einem hinzugef&amp;uuml;gten &lt;b&gt;3D&lt;/b&gt; zusammen.&lt;br /&gt;&lt;br /&gt;Das Projekt ist mittlerweile ziemlich alt und schon relativ weit fortgeschritten, aber ich m&amp;ouml;chte es nochmal komplett neu aufsetzen und dabei die Gelegenheit nutzen, hier ein paar Schritte festzuhalten. &lt;br /&gt;&lt;br /&gt;F&amp;uuml;r diejenigen, die mit den Begriffen (noch) nicht so viel anfangen k&amp;ouml;nnen, fasse ich kurz ein paar Informationen zusammen:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;/forum/images/smiles/icon_question.gif&quot; alt=&quot;Question&quot; /&gt; &lt;b&gt;Was ist ein Software-Renderer?&lt;/b&gt;&lt;br /&gt;Da kann ich am besten auf den kurzen &lt;a href=&quot;http://de.wikipedia.org/wiki/Software_Rendering&quot; target=&quot;_blank&quot;&gt;Wiki-Eintrag&lt;/a&gt; verweisen, in dem viele wesentliche Aspekte genannt werden. Im Grunde geht es darum, Grafikberechnungen komplett durch die CPU durchf&amp;uuml;hren zu lassen. Die Grafikkarte spielt in diesem Prozess also nur eine untergeordnete Rolle, da sie lediglich die von der CPU berechneten Daten an den Monitor leitet. &lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;/forum/images/smiles/icon_question.gif&quot; alt=&quot;Question&quot; /&gt; &lt;b&gt;Nichts f&amp;uuml;r Frames-Fetischisten!&lt;/b&gt;&lt;br /&gt;Somit wird schnell deutlich, dass dies kein Projekt f&amp;uuml;r Frames-Fetischisten ist. Je nachdem, um welche Szene es sich handelt, m&amp;uuml;ssen hunderte, wenn nicht sogar tausende Pixel  in Bezug auf Farbe, Position, usw., individuell berechnet werden. Die Frames sind dann unter Umst&amp;auml;nden sehr schnell im Keller.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;/forum/images/smiles/icon_question.gif&quot; alt=&quot;Question&quot; /&gt; &lt;b&gt;Was ist OpenGL?&lt;/b&gt;&lt;br /&gt;Auch hier verweise ich auf den zugeh&amp;ouml;rigen &lt;a href=&quot;http://de.wikipedia.org/wiki/OpenGL&quot; target=&quot;_blank&quot;&gt;Wikipedia-Artikel&lt;/a&gt;. Kurz gesagt: OpenGL stellt eine Schnittstelle zur Grafikhardware dar. Mit Hilfe von OpenGL lassen sich 2D/3D-Grafiken relativ leicht rendern. Dabei ist die Verarbeitung der Daten (OpenGL Rendering-Pipeline (siehe z.B.: &lt;a href=&quot;http://www.cs.kent.edu/~farrell/graphics/opengl/openglprog1.2/opengl/pipe.gif&quot; target=&quot;_blank&quot;&gt;http://www.cs.kent.edu/~farrel...l/pipe.gif&lt;/a&gt;)) von wesentlicher Bedeutung, da sich der Software-Renderer an dieserm Ablauf und den zugeh&amp;ouml;rigen Umsetzungen orientiert.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;/forum/images/smiles/icon_question.gif&quot; alt=&quot;Question&quot; /&gt; &lt;b&gt;Wie ist der Software-Renderer strukturiert?&lt;/b&gt;&lt;br /&gt;Ich versuche einen Kompromiss zwischen dem BB3D-Syntax und den zus&amp;auml;tzlichen M&amp;ouml;glichkeiten von OpenGL zu finden. Wie das genau aussehen wird, kann man dann am besten anhand der ersten Beispielen sehen, sobald diese fertig sind.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;/forum/images/smiles/icon_question.gif&quot; alt=&quot;Question&quot; /&gt; &lt;b&gt;Was wird m&amp;ouml;glich sein? Wie weit f&amp;uuml;hrt das Projekt?&lt;/b&gt;&lt;br /&gt;Das ist leider nicht so leicht zu beantworten. Ich wei&amp;szlig; aus der bisherigen Erfahrung, dass es einige Probleme (z.B. Rechengenauigkeit) geben wird, die nur schwer (mit BB) zu umgehen sind. Man wird sehen, inwiefern man diese Probleme beheben kann. Ein weiterer Aspekt ist die Umsetzung der einzelnen Prozesse der Rendering-Pipeline: sicher ist es unm&amp;ouml;glich auch nur ansatzweise den kompletten OpenGL-Ablauf/Umfang zu implementieren. Das w&amp;auml;re ein gigantisches Unterfangen. Es wird also ganz klare Grenzen geben. Wo diese liegen werden, kann ich im Moment noch nicht genau sagen.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;/forum/images/smiles/icon_question.gif&quot; alt=&quot;Question&quot; /&gt; &lt;b&gt;An wen richtet sich das Projekt?&lt;/b&gt;&lt;br /&gt;In erster Linie richtet sich das Projekt an diejenigen, die einen Blick hinter die 3D-Kulisse werfen wollen. Gerade in Zeiten von hochaufl&amp;ouml;senden und immer detaillierteren (3D-)Grafiken, ist so eine Betrachtung ganz interessant, denke ich. Zumindest hat es mich seit Beginn des Projektes (und auch weiterhin) sehr fasziniert &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt;.&lt;br /&gt;&lt;br /&gt;Das Projekt wird vollst&amp;auml;ndig mit Hilfe von Blitz Basic 3D realisiert. Da jedoch keinerlei 3D-Befehle genutzt werden, sollte es auch BB2D und B+ kompatibel sein. &lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;/forum/images/smiles/icon_question.gif&quot; alt=&quot;Question&quot; /&gt; &lt;b&gt;Warum wird das Projekt in Blitz Basic umgesetzt?&lt;/b&gt;&lt;br /&gt;Im Grunde ist es nicht sehr schlau, ein solches Projekt in Blitz Basic umzusetzen. Schlie&amp;szlig;lich muss man auf viele n&amp;uuml;tzliche Strukturen verzichten, die man von anderen Hochsprachen kennt. Allerdings ist das Projekt von Anfang an ein Blitz Basic Projekt gewesen. Sowohl die Sprache, als auch das Projekt bedeuten mir viel. Ich m&amp;ouml;chte es daher unbedingt in Blitz Basic zu Ende bringen (vielleicht wird es das letzte gr&amp;ouml;&amp;szlig;ere Projekt in dieser Sprache sein &amp;amp;#8211; man wird es sehen). Au&amp;szlig;erdem ist es auch ein gewisser Reiz, mit den &amp;quot;paar M&amp;ouml;glichkeiten&amp;quot;, die einem Blitz Basic bietet, ein solches Projekt aufzubauen.&lt;br /&gt;&lt;br /&gt;Das war es auch schon - der erste Eintrag ist fertig. Ich hoffe der zweite folgt bald, denn leider l&amp;auml;sst sich nicht sagen, wie kontinuierlich ich an dem Projekt in Zukunft arbeiten kann. Gerade wenn das Stuidum bald weitergeht, wird es von der Zeit her sicher wieder sehr eng.&lt;br /&gt;&lt;br /&gt;Vielen Dank f&amp;uuml;rs Lesen!&lt;br /&gt;&lt;br /&gt;Gru&amp;szlig;,&lt;br /&gt;Blitzkrieg Bop&lt;br /&gt;&lt;br /&gt;P.S.: An dieser Stelle m&amp;ouml;chte ich dem User &lt;b&gt;Vertex&lt;/b&gt; sehr danken, da er  &amp;quot;damals&amp;quot;, zu Beginn des Projektes, sehr Hilfsbereit war und mir somit den Einstieg in die Thematik wesentlich erleichtert hat. Danke, Alter! &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;</description>
			<pubDate>Mon, 21 Sep 2009 02:23:36 +0200</pubDate>
		</item>


	</channel>
</rss>
