<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://wiki.delphigl.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Infinite</id>
		<title>DGL Wiki - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.delphigl.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Infinite"/>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php/Spezial:Beitr%C3%A4ge/Infinite"/>
		<updated>2026-04-21T08:38:14Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Tutorial_Quickstart&amp;diff=20645</id>
		<title>Diskussion:Tutorial Quickstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Tutorial_Quickstart&amp;diff=20645"/>
				<updated>2007-07-15T21:17:38Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: &amp;quot;...auf SDL umgestellt...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Efficiency:&lt;br /&gt;
Die DGLOpenGL.pas funktioniert leider nicht mit Delphi 3. Gibt's da was älteres Brauchbares oder muss ich die von Borland mitgelieferte nehmen? Gruß Efficiency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Flo:&lt;br /&gt;
Delphi 3??? Nimm Lazarus [http://www.lazarus.freepascal.org/index.php ] wenn du eine IDE brauchst und FreePascal als Compiler!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Efficiency:&lt;br /&gt;
Danke für den Tipp, ich kenne Lazarus noch zu wenig. Und leider haben wir etwa 600.000 Zeilen Quelltext der sich nur in Delphi 3 problemlos kompilieren lässt...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Flo:&lt;br /&gt;
600.000 Zeilen Quelltext die nun um OpenGL funktionalitaet erweitert werden sollen? Ich bin erlich gesagt etwas ueberrascht. Hatte erwartet das du ein paar Beispielprogramme zum ueben erstellen willst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Efficiency:&lt;br /&gt;
Ist ja auch so. Erst bisschen üben. Dann muss es aber bald rund gehen ;-) Bei Lazarus habe ich Angst wegen der Leistungsfähigkeit. Die Compilergeschwindigkeit ist beim Übersetzen ja leider deutlich langsamer. Ich müsste mal testen, wie es mit der Geschwindigkeit des Codes im Vergleich zu Delphi 3 aussieht. Aber erstmal werden wir sicher bei Delphi 3 bleiben müssen. Wir haben zwar neuere Delphi-Versionen, aber Delphi 4 hat nicht gelohnt und bei Delphi 5 waren die Umstellungen schon zu groß. Und Delphi 3 kann praktisch alles, was für uns wichtig ist. Wenn jetzt 64 Bit kommt und auch was bringt, dann müssen wir uns generell neu orientieren.&lt;br /&gt;
&lt;br /&gt;
Nochmal die Frage: Gibt es vielleicht einen besseren OpenGL Header für Delphi 3 als den von Borland mitgelieferten?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Flo:&lt;br /&gt;
Such mal im Forum, denke das hat schonmal jemand gesucht. Ansonsten brauchst du dir bei der Ausfuergeschwindigkeit bei FreePascal keien sorgen machen. Nur die Dateigroesse ist bei LCL Einsatz bei Lazarus groesser als bei Delphi mit VLC.&lt;br /&gt;
&lt;br /&gt;
Ja. Guck ins Forum. Wir haben schon ein paar Anfragen zu dem Thema gehabt.&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 18:19, 16. Jan 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Efficiency&lt;br /&gt;
Jo. Danke. Und danke auch an [http://www.basegraph.com Mars]. Das Ding findet sich unten auf dieser Seite: [[DGLOpenGL.pas]]&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;...auf SDL umgestellt...&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Dann hab ich mir die TForm wohl nur eingebildet :)&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19350</id>
		<title>Tutorial Quickstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19350"/>
				<updated>2006-08-21T16:35:35Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: /* Nachwort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Quickstart: Delphi &amp;amp; OpenGL=&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Willkommen beim Delphi &amp;amp; OpenGL Quickstart. Diese kurze Einleitung soll euch auf die Tutorials bei DelphiGL.com und allgemein auf die Grafikprogrammierung mit OpenGL und Delphi vorbereiten. Dieser Quickstart ist kein Tutorial für sich, sondern soll ein Grundgefühl vermitteln wie OpenGL und Delphi miteinander arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wozu OpenGL? Mit OpenGL kann man eine Vielzahl von Aufgaben bewältigen. Ob man Forschungsergebnisse aller Art visualisieren, 2D oder 3D Spiele schreiben oder einfach seiner Anwendung eine Oberfläche geben möchte, die nicht dem windowsgrauen Standardlook entspricht. All das ist möglich mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
==Wie fange ich an?==&lt;br /&gt;
Genau zwei Dinge braucht der OpenGL-Programmierer um effektiv  arbeiten zu können:&lt;br /&gt;
#Einen OpenGL Header&lt;br /&gt;
#Eine Codebasis von der aus man neue Projekte starten kann (ein sog. Template)&lt;br /&gt;
&lt;br /&gt;
===Der OpenGL-Header===&lt;br /&gt;
Das is ja easy! Denn Delphi bringt ja schon einen OpenGL-Header mit...&lt;br /&gt;
&lt;br /&gt;
'''STOP!'''&lt;br /&gt;
&lt;br /&gt;
Denn wir reden von einem guten Header. Leider ist der original von Delphi mitgelieferte Header alles andere als zu empfehlen. Er ist fehlerhaft, hält sich nicht an OpenGL-Normen und außerdem ist er absolut veraltet.&lt;br /&gt;
&lt;br /&gt;
Was nun? Ganz einfach: Bei [http://www.DelphiGL.com DelphiGL.com] (kurz DGL) gibt es '''DEN''' OpenGL-Header für alle Pascalsprachen: &lt;br /&gt;
'''Die [[DGLOpenGL.pas]].'''&lt;br /&gt;
&lt;br /&gt;
Diesen solltet Ihr euch jetzt besorgen, wenn Ihr ihn nicht schon habt. Der Header wird bei neuen OpenGL-Versionen vom DGL-Team aktualisiert.&lt;br /&gt;
&lt;br /&gt;
===Codebasis/Templates===&lt;br /&gt;
So... das war schon alles was Ihr aus dem Netz benötigt. Den Rest machen wir jetzt per Hand.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel zeige ich euch wie man sich ein einfaches [[Template]] schreibt. Natürlich hat DelphiGL.com auch bereits [http://www.delphigl.com/download.php?cat=1 fertige Lösungen], die durchaus zu empfehlen sind und auch extra Features wie Vollbildrendering besitzen. ABER aus Erfahrung kann ich sagen: Man findet sich im eigenen Code viel einfacher zurecht. (Und die Extras kann man nachher immer noch einbauen.)&lt;br /&gt;
&lt;br /&gt;
==Das Template - Delphi fit für OpenGL machen==&lt;br /&gt;
Bevor man wirklich loslegen kann, muss noch die runtergeladene DGLOpenGL.pas an den richtigen Ort gebracht werden. Gut wäre z.&amp;amp;nbsp;B., sie in das Verzeichnis &amp;quot;\lib&amp;quot; in Eurem Delphiverzeichnis zu legen. (Wenn ihr den [[DGLSDK]] verwendet wurden die Suchpfade schon eingerichtet.)&lt;br /&gt;
&lt;br /&gt;
Dann startet mal Delphi. Vor euch sollte jetzt ein leeres Projekt erscheinen. Das leere Formular kann gleich minimiert werden, denn jetzt wird erstmal hübsch gecodet.&lt;br /&gt;
&lt;br /&gt;
''(Am Ende von Kapitel 1.3 findet ihr den Kopf der Template-Klasse. Dort seht ihr auch welche Variablen, von welchem Typ deklariert werden müssen. )''&lt;br /&gt;
&lt;br /&gt;
===Initialisieren von OpenGL===&lt;br /&gt;
Dieser Teil ließ früher dem OpenGL Anfänger die Haare nicht nur zu Berge stehen, sondern gleich ausfallen. Dank der DGLOpenGL.pas wurde das aber um Längen einfacher. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal solltet Ihr die DGLOpenGL.pas in die '''uses'''-Klausel des '''interface'''-Teils der Unit1 schreiben.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung soll direkt beim Erstellen des Formulars gemacht werden. Deshalb kommt der folgende Quelltext ins OnCreate-Ereignis des Formulars.&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DC:= GetDC(Handle);&lt;br /&gt;
  if not InitOpenGL then Application.Terminate;&lt;br /&gt;
  RC:= CreateRenderingContext( DC,&lt;br /&gt;
                               [opDoubleBuffered],&lt;br /&gt;
                               32,&lt;br /&gt;
                               24,&lt;br /&gt;
                               0,0,0,&lt;br /&gt;
                               0);&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
'''Zeile 3:''' Hier wird der Gerätekontext (Device Context) von Formular Form1 abgefragt.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mit InitOpenGL wird OpenGL initialisiert. Wenn das nicht funktioniert wird die gesamte Anwendung sofort beendet. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 5:''' Hier wird der [[Renderkontext]] erzeugt. Den braucht OpenGL zum Zeichnen auf das Formular. Was die Parameter genau bewirken lernt ihr im [[Tutorial_lektion1]].&lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Abschließend wird der Renderkontext aktiviert. OpenGL ist jetzt prinzipiell startbereit.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|DC und RC sind Eigenschaften des Formulars. Siehe [[Tutorial_quickstart#Das_fertige_Templateformular|Definition des Templateformulars]].}}&lt;br /&gt;
&lt;br /&gt;
Nach dieser durchaus simplen Initialisierung (man kann auch alles per Hand machen was InitOpenGL macht!) steht OpenGL ziemlich nackt da. Soll heißen, alle OpenGL Eigenschaften/Zustände stehen auf den definierten Anfangswerten. Es kommt aber durchaus oft - eigentlich ständig - vor, dass bestimmte Einstellungen von OpenGL benutzt werden sollen. Deshalb schreiben wir uns noch eine kleine Zusatzprozedur: SetupOpenGL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.SetupGL;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe&lt;br /&gt;
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren&lt;br /&gt;
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was hier passiert wird durch die Kommentare bereits erklärt (Für mehr Infos siehe [[Tiefentest]] bzw. [[Backface Culling]]). Die Hintergrundfarbe könnt ihr nach Belieben einstellen. (Wenn ihr später einmal geschlossene Szenen rendern wollt, dann ist es günstig eine sehr schräge Farbe als Hintergrundfarbe einzustellen, so findet man leichter Fehler in der Szene.)&lt;br /&gt;
&lt;br /&gt;
Außerdem hat man ja hin und wieder auch noch globale Variablen, die man initialisieren möchte. Da wir mit solchen Sachen unser schön aufgeräumtes '''FormCreate''' nicht zumüllen wollen bietet sich ein Unterprogramm namens '''InitGlobals''' oder kurz '''Init''' an.&lt;br /&gt;
Beide Unterprogramme (SetupGL und Init) sollten am Ende von '''FormCreate''' gerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  [...]&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
  SetupGL;&lt;br /&gt;
  Init;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Die Ereignisbehandlung===&lt;br /&gt;
Für OpenGL sind vor allem die Ereignisse von Bedeutung, die an der Zeichenfläche von OpenGL herumwerkeln. Da OpenGL direkt auf das Formular (oder auch auf ein Panel) zeichnet, müssen Ereignisse, die diese Zeichenfläche ändern, behandelt werden. Dies wären das '''OnResize-''' und das '''OnDestroy'''-Ereignis.&lt;br /&gt;
&lt;br /&gt;
Zuerst '''FormResize''':&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormResize(Sender: TObject);&lt;br /&gt;
var tmpBool : Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  glViewport(0, 0, ClientWidth, ClientHeight);&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);    &lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  IdleHandler(Sender, tmpBool);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen im '''const''' Teil die beiden Konstanten Near- bzw. FarClipping definiert werden. Diese geben die Entfernung für die [[Clipping Plane|Clippingebenen]] (Szenenbegrenzung) an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  NearClipping = 1;&lt;br /&gt;
  FarClipping  = 1000;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zu FormResize''':&lt;br /&gt;
&lt;br /&gt;
'''Zeile 2:''' Diese Boolean-Variable wird in Zeile 11 verwendet und ist nur ein Dummy.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mittels [[glViewport]] sagt Ihr OpenGL, wie groß die OpenGL-Ausgabe werden soll. Genau diese Größe hatte sich ja durch das Resize verändert.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 5/9:''' Hier seht Ihr 2 der 3 möglichen Matrixmodi. '''GL_PROJECTION''' wird benutzt um nachfolgend die OpenGL-Ausgabe zu manipulieren, '''GL_MODELVIEW''' benutzt man, um OpenGL mit Daten zu füttern.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 6:''' [[glLoadIdentity]] füllt die aktuelle Matrix mit der Identitätsmatrix. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird eingestellt wie der Betrachter die Welt sehen soll. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Was der IdleHandler macht kommt später im Abschnitt 1.3.3 (Zeichenroutine).&lt;br /&gt;
&lt;br /&gt;
Nun noch schnell das '''FormDestroy''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DeactivateRenderingContext;&lt;br /&gt;
  DestroyRenderingContext(RC);&lt;br /&gt;
  ReleaseDC(Handle, DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was es macht? Steht doch da: Den RenderingContext deaktivieren und freigeben.&lt;br /&gt;
&lt;br /&gt;
===Die Zeichenroutine===&lt;br /&gt;
Das Herzstück unseres Templates fehlte bisher. Irgendwann muss der Grafikkarte ja auch gesagt werden, was sie denn überhaupt ausgeben soll. Das kommt jetzt: '''TForm1.Render'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Render;&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
&lt;br /&gt;
  glTranslatef(0, 0, -5);&lt;br /&gt;
&lt;br /&gt;
  glBegin(GL_QUADS);&lt;br /&gt;
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);&lt;br /&gt;
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);&lt;br /&gt;
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);&lt;br /&gt;
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);&lt;br /&gt;
  glEnd;&lt;br /&gt;
&lt;br /&gt;
  SwapBuffers(DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Dieser Aufruf sorgt dafür, dass der [[Farbpuffer]] und [[Tiefenpuffer]] gelöscht werden. Wenn man das nicht macht, sieht man alles mögliche, nur nicht das was Ihr rendern wollt. Probiert es ruhig mal ohne aus! Man wird dadurch nicht dümmer.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird wieder die Perspektive gesetzt. Dieser Aufruf und der bei '''FormResize''' &lt;br /&gt;
müssen von den Parametern identisch sein. Sonst sieht die Ausgabe nach einem Resize kurz anders aus. &lt;br /&gt;
Wenn sich die Perspektive zwischen den Renderdurchgängen nicht ändert kann das auch weg gelassen werden.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 12:''' Dieser Aufruf verschiebt die &amp;quot;Kamera&amp;quot; (so etwas gibt es eigentlich nicht, aber das nur am Rande. Mehr zu diesem Thema gibts im [[Tutorial Matrix2]]) etwas nach hinten. Schließlich wollen wir das, was wir zeichnen auch sehen. Alles was zu nah ist wird durch die '''Near-[[Clipping Plane]]''' abgeschnitten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:GlShadeModel_SMOOTH.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' [[glBegin]]/[[glEnd]] kapseln die eigentlichen Zeichenbefehle. Diese sorgen hier für ein '''hübsches buntes Viereck'''. Das soll für den ersten Test ausreichen. Wichtig ist in dem Zusammenhang noch folgendes: OpenGL ist es egal woher ein Befehl kommt. Alles wird ausgewertet und landet unter Umständen im Framebuffer. Ihr könnt also ein Unterprogramm, welches ein Unterprogramm, welches ... ..., welches die OpenGL Befehle enthält schreiben. Das interessiert OpenGL bzw. die Grafikkarte überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 21:''' [[SwapBuffers]] sorgt dafür, dass der Inhalt des [[Framebuffer]]s auf dem &lt;br /&gt;
Bildschirm erscheint. Ohne diesen Befehl seht Ihr gar nichts von OpenGL. (Interessanter Artikel dazu: [[Doppelpufferung]])&lt;br /&gt;
&lt;br /&gt;
So... ganz toll. Jetzt habt Ihr Eure Zeichenfunktion... und nun? Irgendwie müsst Ihr diese auch aufrufen. Das wäre aber zu einfach. Die Ausgabe ändert sich ja normalerweise (z.&amp;amp;nbsp;B. in Spielen). Deshalb muss die Zeichenfunktion immer wieder ausgegeben werden. Dazu gibt es zwei Möglichkeiten, die beide Ihre Vor- und Nachteile haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Argument&lt;br /&gt;
!Timer&lt;br /&gt;
!OnIdle&lt;br /&gt;
|-&lt;br /&gt;
|Maximale Framezahl erreichbar &amp;lt;br&amp;gt;&amp;quot;Benchmark&amp;quot;&lt;br /&gt;
|nein&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Framezahl steuerbar&lt;br /&gt;
|ja&lt;br /&gt;
|bedingt (/umständlich)&lt;br /&gt;
|-&lt;br /&gt;
|Für flüssige Animationen nutzbar&amp;lt;br&amp;gt;(Egoshooter)&lt;br /&gt;
|bedingt/schlecht&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für Menüs nutzbar&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für einfache Animationen nutzbar&amp;lt;br&amp;gt;(Strategiespiele)&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Laptopfreundlich (Anti-Akku-Killer)&lt;br /&gt;
|ja&lt;br /&gt;
|NEIN!&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer einfache Anwendungen schreiben möchte, die auch mit 25 FpS (Bilder Pro Sekunde) auskommen und den Akku von Laptopusern schonen will, sollte die Timervariante nutzen. Wer die Potenziale der Grafikkarten voll ausnutzen möchte sollte OnIdle verwenden.&lt;br /&gt;
&lt;br /&gt;
====Methode 1: Timer====&lt;br /&gt;
Bei dieser Methode muss ein Timer (zu finden bei den Systemkomponenten) auf das Formular gezogen werden. Der Timer besitzt eine Eigenschaft names &amp;quot;Interval&amp;quot;. Mit dieser Eigenschaft kann man einstellen, nach wie vielen Millisekunden das Ereignis OnTimer ausgelöst wird. Man kann &amp;quot;Interval&amp;quot; nicht beliebig verkleinern. Werte unter 25 können vom Standardtimer den Windows verwendet nicht mehr korrekt erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt von OnTimer könnte dieser sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
   inc(FrameCount);&lt;br /&gt;
   Render;&lt;br /&gt;
   If FrameCount = 20 then&lt;br /&gt;
      begin&lt;br /&gt;
           ErrorHandler;&lt;br /&gt;
           FrameCount := 0;&lt;br /&gt;
      end;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tiefgreifende Erklärungen sind hier nicht notwendig. Was der ErrorHandler ist wird nach der Methode 2 erklärt.&lt;br /&gt;
&lt;br /&gt;
====Methode 2: OnIdle====&lt;br /&gt;
&lt;br /&gt;
OnIdle ist ein besonderes Ereignis, welches das gesamte Programm betrifft. Wenn die Anwendung nichts zu tun hat, also faul ist (engl. idle), tritt das Ereignis ein.&lt;br /&gt;
&lt;br /&gt;
Die Methode mit OnIdle kann gleich mit zum Auswerten der Framezahlen (Anzahl Bildwiederholungen pro Sekunde) benutzt werden (Framecounter). Der nachfolgende Code enthält selbigen bereits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
begin&lt;br /&gt;
  StartTime:= GetTickCount;&lt;br /&gt;
  Render;&lt;br /&gt;
  DrawTime:= GetTickCount - StartTime;&lt;br /&gt;
  Inc(TimeCount, DrawTime);&lt;br /&gt;
  Inc(FrameCount);&lt;br /&gt;
&lt;br /&gt;
  if TimeCount &amp;gt;= 1000 then begin&lt;br /&gt;
    Frames:= FrameCount;&lt;br /&gt;
    TimeCount:= TimeCount - 1000;&lt;br /&gt;
    FrameCount:= 0;&lt;br /&gt;
    Caption:= InttoStr(Frames) + 'FPS';&lt;br /&gt;
    ErrorHandler;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  Done:= false;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Mittels GetTickCount wird die Systemzeit gemessen. Dies ist nicht nötig um &lt;br /&gt;
erfolgreich zu zeichnen, sondern dient ausschließlich der Berechnung der Framerate. Diese wiederum ist ein guter Performancemesser.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Hier erfolgt der Aufruf unserer Zeichenroutine.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 9:''' Der hier angeordnete Block wird nur pro Sekunde einmal ausgeführt und sorgt &lt;br /&gt;
dafür, dass die Framerate angezeigt wird. Außerdem wird der Errorhandler aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' Der Errorhandler wird im Anschluß beschrieben.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 17:''' Wenn ''Done'' nach der Ausführung ''false'' ist und das Programm wieder nichts zu tun &lt;br /&gt;
hat, wird OnIdle erneut ausgeführt. Wenn ''Done = true'' ist wird OnIdle nur einmal ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Um auf das &amp;quot;Idle-Event&amp;quot; reagieren zu können, müsst ihr jetzt nur noch diese Funktion an das Event koppeln. Das macht ihr, indem ihr den nachfolgenden Code in die letzte Zeile eurer FormCreate-Methode schreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;Application.OnIdle := IdleHandler;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie ihr bald selbst feststellen werdet, sorgt diese Methode für eine hundertprozentige Prozessorauslastung. Umgehen könnt ihr dies mit einem kleinen Trick:&lt;br /&gt;
&lt;br /&gt;
Fügt vor dem &amp;quot;Done := false&amp;quot; (Zeile 17 des IdleHandlers) noch ein sleep(1) oder sleep(5) ein. Dadurch sinkt die Prozessorlast auf ca. 80%, was schon ein Fortschritt ist.&lt;br /&gt;
&lt;br /&gt;
===Der ErrorHandler - Fehler erkannt, Fehler gebannt===&lt;br /&gt;
Der Errorhandler ist wieder eine total einfache Funktion, denn OpenGL bietet von Haus aus eine Möglichkeit OpenGL-Fehler zu erkennen. Deshalb ist der ErrorHandler auch so klein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.ErrorHandler;&lt;br /&gt;
begin&lt;br /&gt;
  Form1.Caption := gluErrorString(glGetError);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enttäuscht? Ihr könnt den ErrorHandler nach belieben auch komplexer machen. Zum Beispiel könnt Ihr anstatt die Fehler im Fenstertitel anzuzeigen lieber den Fehler in ein Logfile schreiben. Ganz nebenbei: Falls kein Fehler auftritt liefert [[glGetError]] '''GL_NO_ERROR'''.&lt;br /&gt;
&lt;br /&gt;
===Das fertige Templateformular===&lt;br /&gt;
Eure Klasse TForm1 sollte also jetzt so, oder so ähnlich aussehen:&lt;br /&gt;
&amp;lt;pascal&amp;gt;TForm1 = class(TForm)&lt;br /&gt;
    procedure FormCreate(Sender: TObject);&lt;br /&gt;
    procedure IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
    procedure FormResize(Sender: TObject);&lt;br /&gt;
    procedure FormDestroy(Sender: TObject);&lt;br /&gt;
  private    { Private-Deklarationen }&lt;br /&gt;
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter&lt;br /&gt;
    Frames, DrawTime                  : Cardinal; //&amp;amp; Timebased Movement&lt;br /&gt;
    procedure SetupGL;&lt;br /&gt;
    procedure Init;&lt;br /&gt;
    procedure Render;&lt;br /&gt;
    procedure ErrorHandler;&lt;br /&gt;
  public    { Public-Deklarationen }&lt;br /&gt;
    DC                                : HDC;  //Handle auf Zeichenfläche&lt;br /&gt;
    RC                                : HGLRC;//Rendering Context&lt;br /&gt;
  end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Wie man sieht benutzt mein Template die zweite Methode (OnIdle).&lt;br /&gt;
&lt;br /&gt;
'''Zeile 8:''' Was [[Timebased Movement]] ist könnt ihr ja mal nachlesen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14/15:''' HDC und HGLRC sind Typen die von Windows zur Verfügung gestellt werden. Ihr findet sie in der Unit &amp;quot;Windows&amp;quot;. (Diese Unit sollte bei einem neuen Projekt bereits durch Delphi eingebunden worden sein.)&lt;br /&gt;
&lt;br /&gt;
So... fertig. Eigentlich seid Ihr jetzt soweit von den Tutorialschreibern so richtig mit OpenGL-Wissen voll gepumpt zu werden. Das nachfolgende Kapitel könnt Ihr euch trotzdem ruhigen Gewissens durchlesen. Wer es liest tappt vielleicht nicht gleich bei der ersten Frage im DGL-Forum ins berüchtigte Fettnäpfchen.&lt;br /&gt;
&lt;br /&gt;
==Tipps für den OpenGL Anfänger==&lt;br /&gt;
Wenn man mit OpenGL anfängt ist man meist total perplex und ein &amp;quot;Das war ja einfach!&amp;quot; huscht einem nicht nur einmal über die Lippen. Vor allem zu Beginn Eurer OpenGL-Karriere werdet Ihr viel lernen und dabei nur auf verhältnismäßig geringen Widerstand stoßen. Aber glaubt mir es gibt ihn...&lt;br /&gt;
&lt;br /&gt;
Häufig tauchen hoch motivierte OpenGL Anfänger im Forum auf und verkünden stolz, sie würden gerade an einer Engine arbeiten die ''&amp;quot;nur auf Doom 1 Niveau arbeiten soll&amp;quot;''. &lt;br /&gt;
&lt;br /&gt;
Dazu gibt es häufig eine durchaus beachtliche Anzahl von Forenmitgliedern die dann ungefähr folgendes sagen: ''&amp;quot;Fang gar nicht erst damit an. Vergiss es, und komm in einem Jahr noch mal darauf zurück!&amp;quot;'' (Die Forensuche sollte euch einige dieser Threads zeigen)&lt;br /&gt;
&lt;br /&gt;
Sind das böse Pessimisten, die Probleme nutzen um aufzugeben? '''Nein!''' Sie haben zumeist die Erfahrungen gemacht, die Ihr noch machen werdet. Deshalb will ich euch an dieser Stelle einweihen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;1. Je älter der Code ist desto besser wird er.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider nein. Code und Wein unterscheiden sich hier leider grundlegend. Viele... die meisten... eigentlich alle von uns bekommen Ausschlag, wenn sie sich ihren Code von vor 1 Jahr angucken. Erst wenn man so schätzungsweise 3 bis 5 Jahre mit OpenGL gearbeitet hat, hat man ein echtes Gefühl für den Code. Am Anfang hat man nämlich, ob man will oder nicht, die Tendenz sich schon nach den ersten 3 Wochen Programmierarbeit den Code so zu zerschießen, dass die weitere Arbeit keinen Spaß mehr macht.&lt;br /&gt;
&lt;br /&gt;
''Ich selbst wollte jetzt ein Projekt weiterbearbeiten, welches ungefähr ein 3/4 Jahr alt ist... Ich hab den Code weggeworfen und das fast fertige Spiel neu angefangen. (Glaubt mir: Aus solchen Fehlern lernt man!)''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;2. Große Projekte = Großer Ruhm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stimmt! ABER Ruhm gibt es in der Szene nur für beendete Projekte. Und dreimal dürft Ihr raten was durch die im Punkt 1 angesprochenen Probleme meist nicht mit euren Projekten passiert...&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr OpenGL nur zur Visualisierung von z.&amp;amp;nbsp;B. wissenschaftlichen Ergebnissen benutzt, ist die Arbeit im Bezug auf OpenGL sehr übersichtlich. Wenn Ihr allerdings Spiele programmieren wollt, werdet Ihr schnell merken, dass Probleme auf euch zukommen werden, die euch beim Projektstart völlig unbekannt waren. Dies ist ein sicheres Zeichen dafür, dass doch noch etwas mehr Erfahrung nötig sein wird.&lt;br /&gt;
&lt;br /&gt;
'''Und woher soll ich bitte Erfahrung nehmen?'''&lt;br /&gt;
&lt;br /&gt;
Darin liegt der Trick:&lt;br /&gt;
&lt;br /&gt;
Alle OpenGLer haben einmal &amp;quot;klein&amp;quot; angefangen. Berühmt-berüchtigt sind die 3DPong-Clone, die zahlreich im Internet anzufinden sind. Auch Tetris-, Memory- oder &amp;quot;Vier Gewinnt&amp;quot;-Clone sind solche stillen Zeugen eines großen Lernvorgangs. Das Besondere an solchen Spielen ist, dass die Spiellogik relativ einfach ist und euch damit nur wenig von der Visualisierung ablenkt. &lt;br /&gt;
&lt;br /&gt;
Ihr denkt jetzt bestimmt &amp;quot;Was kann man denn schon in so nem Clon unterbringen?&amp;quot; '''VERDAMMT VIEL!''' Hier mal ein kleiner Auszug:&lt;br /&gt;
&lt;br /&gt;
*3D-Spieldarstellung&lt;br /&gt;
*2D Menüführung ([[glOrtho]])&lt;br /&gt;
*[[Blending]] &lt;br /&gt;
*[[Textur]]en &lt;br /&gt;
*Licht und Materialien (Ihr werdet Augen machen!)&lt;br /&gt;
*[[Selektion]] (Hin und wieder zum Haare raufen.)&lt;br /&gt;
*Kamerasteuerung /Bewegung durch die Szene (Da gibt es ganze Tutorials dazu)&lt;br /&gt;
&lt;br /&gt;
Als Ansporn solltet Ihr euch am Anfang ein kleines Ziel setzen und sagen &amp;quot;Ich möchte den besten und schönsten XYZ-Clon im ganzen Internet schaffen!&amp;quot;. So etwas trifft in der Szene auf wesentlich mehr Anerkennung als wenn mal wieder ein Anfänger etwas von Engine und Doom X faselt.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr ein oder zwei solcher Projekte abgeschlossen habt, und regelmäßig im Forum bzw. Wiki gelesen habt, werdet Ihr es schon merken, wenn Euer Traumprojekt endlich in Angriff genommen werden kann. (Ganz vergessen müsst ihr es nämlich doch nicht ;) )&lt;br /&gt;
&lt;br /&gt;
'''Als kurze Zusammenfassung solltet Ihr euch merken:'''&lt;br /&gt;
&lt;br /&gt;
*Ein fertiges Projekt bringt euch Ruhm (Seelenbalsam).&lt;br /&gt;
*Ein hübsches, fertiges Projekt bringt euch mehr Ruhm.&lt;br /&gt;
*Ein großes, fertiges, hübsches Projekt bringt euch noch mehr Ruhm.&lt;br /&gt;
&lt;br /&gt;
*Ein abgebrochenes oder eingefrorenes Projekt bringt euch Frust.&lt;br /&gt;
*Ein großes, abgebrochenes Projekt bringt euch noch mehr Frust, denn der verschwendeten Zeit werdet Ihr nachtrauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;3.Das es lang dauert ist egal. Ich interessiere mich halt dafür.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Aussage gilt nur dann, wenn Ihr schon über ein Jahr an ein und demselben Projekt gearbeitet habt. Anfänglich ist das kein Problem. Aber wenn man lange an etwas arbeitet und die gemachten Änderungen sind nicht sichtbar (weil sie z.&amp;amp;nbsp;B. den eigentlichen Motor der Anwendung betreffen und nicht die Ausgabe), dann verliert man schon mal die Lust. Folge sind die berüchtigten &amp;quot;Erfolgsmeldungen&amp;quot; wie: &amp;quot;Das Projekt wurde von mir bis auf weiteres aufs Eis gelegt. Ich werde sicherlich später daran weiterarbeiten.&amp;quot; In Verbindung mit Punkt 1 und dem letzen Satz aus Punkt 2 sollte euch das Endergebnis klar sein.&lt;br /&gt;
&lt;br /&gt;
==Nachwort==&lt;br /&gt;
&lt;br /&gt;
Soviel zur Euphoriebremse. OpenGL ist toll. OpenGL ist die Lösung für Eure Traumanwendung. Aber die wird auch mit OpenGL nicht von heute auf morgen programmiert. Deshalb heißt es Tutorials lesen, kleine Testanwendungen schreiben um Effekte zu testen und Projekte bearbeiten. Dann wird es auch etwas mit den Traumprojekten. Zudem kann man anfangs auch versuchen in sehr kleinen Anwendungen einen Effekt auszuprobieren und diesen in Form eines kleinen Beispielprogramms oder eines Tutorials zu veröffenlichen. Somit lernt man nicht nur selbst etwas dazu...&lt;br /&gt;
&lt;br /&gt;
Nach diesen unglaublich Weise klingenden Worten die ich mit einem hoch ernsten Gesicht geschrieben habe, könnt ihr euch jetzt hochmotiviert an die restlichen Tutorials machen.&lt;br /&gt;
&lt;br /&gt;
Bis bald im [http://delphiGL.com/forum Forum]&lt;br /&gt;
&lt;br /&gt;
'''Euer'''&lt;br /&gt;
&lt;br /&gt;
'''Flash (Kevin Fleischer)'''&lt;br /&gt;
&lt;br /&gt;
PS: Feedback wird nicht nur gewünscht, sondern ausdrücklich gefordert. Deshalb: Ab mit deinen Meinungen und Ratschlägen ins [http://www.delphigl.com/forum/viewforum.php?f=8 Feedback-Forum]!&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|-|[[Tutorial_lektion1]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Quickstart]]&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19349</id>
		<title>Tutorial Quickstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19349"/>
				<updated>2006-08-21T16:34:11Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: /* Tipps für den OpenGL Anfänger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Quickstart: Delphi &amp;amp; OpenGL=&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Willkommen beim Delphi &amp;amp; OpenGL Quickstart. Diese kurze Einleitung soll euch auf die Tutorials bei DelphiGL.com und allgemein auf die Grafikprogrammierung mit OpenGL und Delphi vorbereiten. Dieser Quickstart ist kein Tutorial für sich, sondern soll ein Grundgefühl vermitteln wie OpenGL und Delphi miteinander arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wozu OpenGL? Mit OpenGL kann man eine Vielzahl von Aufgaben bewältigen. Ob man Forschungsergebnisse aller Art visualisieren, 2D oder 3D Spiele schreiben oder einfach seiner Anwendung eine Oberfläche geben möchte, die nicht dem windowsgrauen Standardlook entspricht. All das ist möglich mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
==Wie fange ich an?==&lt;br /&gt;
Genau zwei Dinge braucht der OpenGL-Programmierer um effektiv  arbeiten zu können:&lt;br /&gt;
#Einen OpenGL Header&lt;br /&gt;
#Eine Codebasis von der aus man neue Projekte starten kann (ein sog. Template)&lt;br /&gt;
&lt;br /&gt;
===Der OpenGL-Header===&lt;br /&gt;
Das is ja easy! Denn Delphi bringt ja schon einen OpenGL-Header mit...&lt;br /&gt;
&lt;br /&gt;
'''STOP!'''&lt;br /&gt;
&lt;br /&gt;
Denn wir reden von einem guten Header. Leider ist der original von Delphi mitgelieferte Header alles andere als zu empfehlen. Er ist fehlerhaft, hält sich nicht an OpenGL-Normen und außerdem ist er absolut veraltet.&lt;br /&gt;
&lt;br /&gt;
Was nun? Ganz einfach: Bei [http://www.DelphiGL.com DelphiGL.com] (kurz DGL) gibt es '''DEN''' OpenGL-Header für alle Pascalsprachen: &lt;br /&gt;
'''Die [[DGLOpenGL.pas]].'''&lt;br /&gt;
&lt;br /&gt;
Diesen solltet Ihr euch jetzt besorgen, wenn Ihr ihn nicht schon habt. Der Header wird bei neuen OpenGL-Versionen vom DGL-Team aktualisiert.&lt;br /&gt;
&lt;br /&gt;
===Codebasis/Templates===&lt;br /&gt;
So... das war schon alles was Ihr aus dem Netz benötigt. Den Rest machen wir jetzt per Hand.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel zeige ich euch wie man sich ein einfaches [[Template]] schreibt. Natürlich hat DelphiGL.com auch bereits [http://www.delphigl.com/download.php?cat=1 fertige Lösungen], die durchaus zu empfehlen sind und auch extra Features wie Vollbildrendering besitzen. ABER aus Erfahrung kann ich sagen: Man findet sich im eigenen Code viel einfacher zurecht. (Und die Extras kann man nachher immer noch einbauen.)&lt;br /&gt;
&lt;br /&gt;
==Das Template - Delphi fit für OpenGL machen==&lt;br /&gt;
Bevor man wirklich loslegen kann, muss noch die runtergeladene DGLOpenGL.pas an den richtigen Ort gebracht werden. Gut wäre z.&amp;amp;nbsp;B., sie in das Verzeichnis &amp;quot;\lib&amp;quot; in Eurem Delphiverzeichnis zu legen. (Wenn ihr den [[DGLSDK]] verwendet wurden die Suchpfade schon eingerichtet.)&lt;br /&gt;
&lt;br /&gt;
Dann startet mal Delphi. Vor euch sollte jetzt ein leeres Projekt erscheinen. Das leere Formular kann gleich minimiert werden, denn jetzt wird erstmal hübsch gecodet.&lt;br /&gt;
&lt;br /&gt;
''(Am Ende von Kapitel 1.3 findet ihr den Kopf der Template-Klasse. Dort seht ihr auch welche Variablen, von welchem Typ deklariert werden müssen. )''&lt;br /&gt;
&lt;br /&gt;
===Initialisieren von OpenGL===&lt;br /&gt;
Dieser Teil ließ früher dem OpenGL Anfänger die Haare nicht nur zu Berge stehen, sondern gleich ausfallen. Dank der DGLOpenGL.pas wurde das aber um Längen einfacher. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal solltet Ihr die DGLOpenGL.pas in die '''uses'''-Klausel des '''interface'''-Teils der Unit1 schreiben.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung soll direkt beim Erstellen des Formulars gemacht werden. Deshalb kommt der folgende Quelltext ins OnCreate-Ereignis des Formulars.&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DC:= GetDC(Handle);&lt;br /&gt;
  if not InitOpenGL then Application.Terminate;&lt;br /&gt;
  RC:= CreateRenderingContext( DC,&lt;br /&gt;
                               [opDoubleBuffered],&lt;br /&gt;
                               32,&lt;br /&gt;
                               24,&lt;br /&gt;
                               0,0,0,&lt;br /&gt;
                               0);&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
'''Zeile 3:''' Hier wird der Gerätekontext (Device Context) von Formular Form1 abgefragt.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mit InitOpenGL wird OpenGL initialisiert. Wenn das nicht funktioniert wird die gesamte Anwendung sofort beendet. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 5:''' Hier wird der [[Renderkontext]] erzeugt. Den braucht OpenGL zum Zeichnen auf das Formular. Was die Parameter genau bewirken lernt ihr im [[Tutorial_lektion1]].&lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Abschließend wird der Renderkontext aktiviert. OpenGL ist jetzt prinzipiell startbereit.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|DC und RC sind Eigenschaften des Formulars. Siehe [[Tutorial_quickstart#Das_fertige_Templateformular|Definition des Templateformulars]].}}&lt;br /&gt;
&lt;br /&gt;
Nach dieser durchaus simplen Initialisierung (man kann auch alles per Hand machen was InitOpenGL macht!) steht OpenGL ziemlich nackt da. Soll heißen, alle OpenGL Eigenschaften/Zustände stehen auf den definierten Anfangswerten. Es kommt aber durchaus oft - eigentlich ständig - vor, dass bestimmte Einstellungen von OpenGL benutzt werden sollen. Deshalb schreiben wir uns noch eine kleine Zusatzprozedur: SetupOpenGL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.SetupGL;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe&lt;br /&gt;
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren&lt;br /&gt;
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was hier passiert wird durch die Kommentare bereits erklärt (Für mehr Infos siehe [[Tiefentest]] bzw. [[Backface Culling]]). Die Hintergrundfarbe könnt ihr nach Belieben einstellen. (Wenn ihr später einmal geschlossene Szenen rendern wollt, dann ist es günstig eine sehr schräge Farbe als Hintergrundfarbe einzustellen, so findet man leichter Fehler in der Szene.)&lt;br /&gt;
&lt;br /&gt;
Außerdem hat man ja hin und wieder auch noch globale Variablen, die man initialisieren möchte. Da wir mit solchen Sachen unser schön aufgeräumtes '''FormCreate''' nicht zumüllen wollen bietet sich ein Unterprogramm namens '''InitGlobals''' oder kurz '''Init''' an.&lt;br /&gt;
Beide Unterprogramme (SetupGL und Init) sollten am Ende von '''FormCreate''' gerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  [...]&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
  SetupGL;&lt;br /&gt;
  Init;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Die Ereignisbehandlung===&lt;br /&gt;
Für OpenGL sind vor allem die Ereignisse von Bedeutung, die an der Zeichenfläche von OpenGL herumwerkeln. Da OpenGL direkt auf das Formular (oder auch auf ein Panel) zeichnet, müssen Ereignisse, die diese Zeichenfläche ändern, behandelt werden. Dies wären das '''OnResize-''' und das '''OnDestroy'''-Ereignis.&lt;br /&gt;
&lt;br /&gt;
Zuerst '''FormResize''':&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormResize(Sender: TObject);&lt;br /&gt;
var tmpBool : Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  glViewport(0, 0, ClientWidth, ClientHeight);&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);    &lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  IdleHandler(Sender, tmpBool);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen im '''const''' Teil die beiden Konstanten Near- bzw. FarClipping definiert werden. Diese geben die Entfernung für die [[Clipping Plane|Clippingebenen]] (Szenenbegrenzung) an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  NearClipping = 1;&lt;br /&gt;
  FarClipping  = 1000;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zu FormResize''':&lt;br /&gt;
&lt;br /&gt;
'''Zeile 2:''' Diese Boolean-Variable wird in Zeile 11 verwendet und ist nur ein Dummy.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mittels [[glViewport]] sagt Ihr OpenGL, wie groß die OpenGL-Ausgabe werden soll. Genau diese Größe hatte sich ja durch das Resize verändert.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 5/9:''' Hier seht Ihr 2 der 3 möglichen Matrixmodi. '''GL_PROJECTION''' wird benutzt um nachfolgend die OpenGL-Ausgabe zu manipulieren, '''GL_MODELVIEW''' benutzt man, um OpenGL mit Daten zu füttern.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 6:''' [[glLoadIdentity]] füllt die aktuelle Matrix mit der Identitätsmatrix. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird eingestellt wie der Betrachter die Welt sehen soll. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Was der IdleHandler macht kommt später im Abschnitt 1.3.3 (Zeichenroutine).&lt;br /&gt;
&lt;br /&gt;
Nun noch schnell das '''FormDestroy''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DeactivateRenderingContext;&lt;br /&gt;
  DestroyRenderingContext(RC);&lt;br /&gt;
  ReleaseDC(Handle, DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was es macht? Steht doch da: Den RenderingContext deaktivieren und freigeben.&lt;br /&gt;
&lt;br /&gt;
===Die Zeichenroutine===&lt;br /&gt;
Das Herzstück unseres Templates fehlte bisher. Irgendwann muss der Grafikkarte ja auch gesagt werden, was sie denn überhaupt ausgeben soll. Das kommt jetzt: '''TForm1.Render'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Render;&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
&lt;br /&gt;
  glTranslatef(0, 0, -5);&lt;br /&gt;
&lt;br /&gt;
  glBegin(GL_QUADS);&lt;br /&gt;
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);&lt;br /&gt;
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);&lt;br /&gt;
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);&lt;br /&gt;
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);&lt;br /&gt;
  glEnd;&lt;br /&gt;
&lt;br /&gt;
  SwapBuffers(DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Dieser Aufruf sorgt dafür, dass der [[Farbpuffer]] und [[Tiefenpuffer]] gelöscht werden. Wenn man das nicht macht, sieht man alles mögliche, nur nicht das was Ihr rendern wollt. Probiert es ruhig mal ohne aus! Man wird dadurch nicht dümmer.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird wieder die Perspektive gesetzt. Dieser Aufruf und der bei '''FormResize''' &lt;br /&gt;
müssen von den Parametern identisch sein. Sonst sieht die Ausgabe nach einem Resize kurz anders aus. &lt;br /&gt;
Wenn sich die Perspektive zwischen den Renderdurchgängen nicht ändert kann das auch weg gelassen werden.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 12:''' Dieser Aufruf verschiebt die &amp;quot;Kamera&amp;quot; (so etwas gibt es eigentlich nicht, aber das nur am Rande. Mehr zu diesem Thema gibts im [[Tutorial Matrix2]]) etwas nach hinten. Schließlich wollen wir das, was wir zeichnen auch sehen. Alles was zu nah ist wird durch die '''Near-[[Clipping Plane]]''' abgeschnitten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:GlShadeModel_SMOOTH.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' [[glBegin]]/[[glEnd]] kapseln die eigentlichen Zeichenbefehle. Diese sorgen hier für ein '''hübsches buntes Viereck'''. Das soll für den ersten Test ausreichen. Wichtig ist in dem Zusammenhang noch folgendes: OpenGL ist es egal woher ein Befehl kommt. Alles wird ausgewertet und landet unter Umständen im Framebuffer. Ihr könnt also ein Unterprogramm, welches ein Unterprogramm, welches ... ..., welches die OpenGL Befehle enthält schreiben. Das interessiert OpenGL bzw. die Grafikkarte überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 21:''' [[SwapBuffers]] sorgt dafür, dass der Inhalt des [[Framebuffer]]s auf dem &lt;br /&gt;
Bildschirm erscheint. Ohne diesen Befehl seht Ihr gar nichts von OpenGL. (Interessanter Artikel dazu: [[Doppelpufferung]])&lt;br /&gt;
&lt;br /&gt;
So... ganz toll. Jetzt habt Ihr Eure Zeichenfunktion... und nun? Irgendwie müsst Ihr diese auch aufrufen. Das wäre aber zu einfach. Die Ausgabe ändert sich ja normalerweise (z.&amp;amp;nbsp;B. in Spielen). Deshalb muss die Zeichenfunktion immer wieder ausgegeben werden. Dazu gibt es zwei Möglichkeiten, die beide Ihre Vor- und Nachteile haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Argument&lt;br /&gt;
!Timer&lt;br /&gt;
!OnIdle&lt;br /&gt;
|-&lt;br /&gt;
|Maximale Framezahl erreichbar &amp;lt;br&amp;gt;&amp;quot;Benchmark&amp;quot;&lt;br /&gt;
|nein&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Framezahl steuerbar&lt;br /&gt;
|ja&lt;br /&gt;
|bedingt (/umständlich)&lt;br /&gt;
|-&lt;br /&gt;
|Für flüssige Animationen nutzbar&amp;lt;br&amp;gt;(Egoshooter)&lt;br /&gt;
|bedingt/schlecht&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für Menüs nutzbar&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für einfache Animationen nutzbar&amp;lt;br&amp;gt;(Strategiespiele)&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Laptopfreundlich (Anti-Akku-Killer)&lt;br /&gt;
|ja&lt;br /&gt;
|NEIN!&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer einfache Anwendungen schreiben möchte, die auch mit 25 FpS (Bilder Pro Sekunde) auskommen und den Akku von Laptopusern schonen will, sollte die Timervariante nutzen. Wer die Potenziale der Grafikkarten voll ausnutzen möchte sollte OnIdle verwenden.&lt;br /&gt;
&lt;br /&gt;
====Methode 1: Timer====&lt;br /&gt;
Bei dieser Methode muss ein Timer (zu finden bei den Systemkomponenten) auf das Formular gezogen werden. Der Timer besitzt eine Eigenschaft names &amp;quot;Interval&amp;quot;. Mit dieser Eigenschaft kann man einstellen, nach wie vielen Millisekunden das Ereignis OnTimer ausgelöst wird. Man kann &amp;quot;Interval&amp;quot; nicht beliebig verkleinern. Werte unter 25 können vom Standardtimer den Windows verwendet nicht mehr korrekt erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt von OnTimer könnte dieser sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
   inc(FrameCount);&lt;br /&gt;
   Render;&lt;br /&gt;
   If FrameCount = 20 then&lt;br /&gt;
      begin&lt;br /&gt;
           ErrorHandler;&lt;br /&gt;
           FrameCount := 0;&lt;br /&gt;
      end;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tiefgreifende Erklärungen sind hier nicht notwendig. Was der ErrorHandler ist wird nach der Methode 2 erklärt.&lt;br /&gt;
&lt;br /&gt;
====Methode 2: OnIdle====&lt;br /&gt;
&lt;br /&gt;
OnIdle ist ein besonderes Ereignis, welches das gesamte Programm betrifft. Wenn die Anwendung nichts zu tun hat, also faul ist (engl. idle), tritt das Ereignis ein.&lt;br /&gt;
&lt;br /&gt;
Die Methode mit OnIdle kann gleich mit zum Auswerten der Framezahlen (Anzahl Bildwiederholungen pro Sekunde) benutzt werden (Framecounter). Der nachfolgende Code enthält selbigen bereits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
begin&lt;br /&gt;
  StartTime:= GetTickCount;&lt;br /&gt;
  Render;&lt;br /&gt;
  DrawTime:= GetTickCount - StartTime;&lt;br /&gt;
  Inc(TimeCount, DrawTime);&lt;br /&gt;
  Inc(FrameCount);&lt;br /&gt;
&lt;br /&gt;
  if TimeCount &amp;gt;= 1000 then begin&lt;br /&gt;
    Frames:= FrameCount;&lt;br /&gt;
    TimeCount:= TimeCount - 1000;&lt;br /&gt;
    FrameCount:= 0;&lt;br /&gt;
    Caption:= InttoStr(Frames) + 'FPS';&lt;br /&gt;
    ErrorHandler;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  Done:= false;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Mittels GetTickCount wird die Systemzeit gemessen. Dies ist nicht nötig um &lt;br /&gt;
erfolgreich zu zeichnen, sondern dient ausschließlich der Berechnung der Framerate. Diese wiederum ist ein guter Performancemesser.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Hier erfolgt der Aufruf unserer Zeichenroutine.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 9:''' Der hier angeordnete Block wird nur pro Sekunde einmal ausgeführt und sorgt &lt;br /&gt;
dafür, dass die Framerate angezeigt wird. Außerdem wird der Errorhandler aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' Der Errorhandler wird im Anschluß beschrieben.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 17:''' Wenn ''Done'' nach der Ausführung ''false'' ist und das Programm wieder nichts zu tun &lt;br /&gt;
hat, wird OnIdle erneut ausgeführt. Wenn ''Done = true'' ist wird OnIdle nur einmal ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Um auf das &amp;quot;Idle-Event&amp;quot; reagieren zu können, müsst ihr jetzt nur noch diese Funktion an das Event koppeln. Das macht ihr, indem ihr den nachfolgenden Code in die letzte Zeile eurer FormCreate-Methode schreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;Application.OnIdle := IdleHandler;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie ihr bald selbst feststellen werdet, sorgt diese Methode für eine hundertprozentige Prozessorauslastung. Umgehen könnt ihr dies mit einem kleinen Trick:&lt;br /&gt;
&lt;br /&gt;
Fügt vor dem &amp;quot;Done := false&amp;quot; (Zeile 17 des IdleHandlers) noch ein sleep(1) oder sleep(5) ein. Dadurch sinkt die Prozessorlast auf ca. 80%, was schon ein Fortschritt ist.&lt;br /&gt;
&lt;br /&gt;
===Der ErrorHandler - Fehler erkannt, Fehler gebannt===&lt;br /&gt;
Der Errorhandler ist wieder eine total einfache Funktion, denn OpenGL bietet von Haus aus eine Möglichkeit OpenGL-Fehler zu erkennen. Deshalb ist der ErrorHandler auch so klein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.ErrorHandler;&lt;br /&gt;
begin&lt;br /&gt;
  Form1.Caption := gluErrorString(glGetError);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enttäuscht? Ihr könnt den ErrorHandler nach belieben auch komplexer machen. Zum Beispiel könnt Ihr anstatt die Fehler im Fenstertitel anzuzeigen lieber den Fehler in ein Logfile schreiben. Ganz nebenbei: Falls kein Fehler auftritt liefert [[glGetError]] '''GL_NO_ERROR'''.&lt;br /&gt;
&lt;br /&gt;
===Das fertige Templateformular===&lt;br /&gt;
Eure Klasse TForm1 sollte also jetzt so, oder so ähnlich aussehen:&lt;br /&gt;
&amp;lt;pascal&amp;gt;TForm1 = class(TForm)&lt;br /&gt;
    procedure FormCreate(Sender: TObject);&lt;br /&gt;
    procedure IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
    procedure FormResize(Sender: TObject);&lt;br /&gt;
    procedure FormDestroy(Sender: TObject);&lt;br /&gt;
  private    { Private-Deklarationen }&lt;br /&gt;
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter&lt;br /&gt;
    Frames, DrawTime                  : Cardinal; //&amp;amp; Timebased Movement&lt;br /&gt;
    procedure SetupGL;&lt;br /&gt;
    procedure Init;&lt;br /&gt;
    procedure Render;&lt;br /&gt;
    procedure ErrorHandler;&lt;br /&gt;
  public    { Public-Deklarationen }&lt;br /&gt;
    DC                                : HDC;  //Handle auf Zeichenfläche&lt;br /&gt;
    RC                                : HGLRC;//Rendering Context&lt;br /&gt;
  end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Wie man sieht benutzt mein Template die zweite Methode (OnIdle).&lt;br /&gt;
&lt;br /&gt;
'''Zeile 8:''' Was [[Timebased Movement]] ist könnt ihr ja mal nachlesen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14/15:''' HDC und HGLRC sind Typen die von Windows zur Verfügung gestellt werden. Ihr findet sie in der Unit &amp;quot;Windows&amp;quot;. (Diese Unit sollte bei einem neuen Projekt bereits durch Delphi eingebunden worden sein.)&lt;br /&gt;
&lt;br /&gt;
So... fertig. Eigentlich seid Ihr jetzt soweit von den Tutorialschreibern so richtig mit OpenGL-Wissen voll gepumpt zu werden. Das nachfolgende Kapitel könnt Ihr euch trotzdem ruhigen Gewissens durchlesen. Wer es liest tappt vielleicht nicht gleich bei der ersten Frage im DGL-Forum ins berüchtigte Fettnäpfchen.&lt;br /&gt;
&lt;br /&gt;
==Tipps für den OpenGL Anfänger==&lt;br /&gt;
Wenn man mit OpenGL anfängt ist man meist total perplex und ein &amp;quot;Das war ja einfach!&amp;quot; huscht einem nicht nur einmal über die Lippen. Vor allem zu Beginn Eurer OpenGL-Karriere werdet Ihr viel lernen und dabei nur auf verhältnismäßig geringen Widerstand stoßen. Aber glaubt mir es gibt ihn...&lt;br /&gt;
&lt;br /&gt;
Häufig tauchen hoch motivierte OpenGL Anfänger im Forum auf und verkünden stolz, sie würden gerade an einer Engine arbeiten die ''&amp;quot;nur auf Doom 1 Niveau arbeiten soll&amp;quot;''. &lt;br /&gt;
&lt;br /&gt;
Dazu gibt es häufig eine durchaus beachtliche Anzahl von Forenmitgliedern die dann ungefähr folgendes sagen: ''&amp;quot;Fang gar nicht erst damit an. Vergiss es, und komm in einem Jahr noch mal darauf zurück!&amp;quot;'' (Die Forensuche sollte euch einige dieser Threads zeigen)&lt;br /&gt;
&lt;br /&gt;
Sind das böse Pessimisten, die Probleme nutzen um aufzugeben? '''Nein!''' Sie haben zumeist die Erfahrungen gemacht, die Ihr noch machen werdet. Deshalb will ich euch an dieser Stelle einweihen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;1. Je älter der Code ist desto besser wird er.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider nein. Code und Wein unterscheiden sich hier leider grundlegend. Viele... die meisten... eigentlich alle von uns bekommen Ausschlag, wenn sie sich ihren Code von vor 1 Jahr angucken. Erst wenn man so schätzungsweise 3 bis 5 Jahre mit OpenGL gearbeitet hat, hat man ein echtes Gefühl für den Code. Am Anfang hat man nämlich, ob man will oder nicht, die Tendenz sich schon nach den ersten 3 Wochen Programmierarbeit den Code so zu zerschießen, dass die weitere Arbeit keinen Spaß mehr macht.&lt;br /&gt;
&lt;br /&gt;
''Ich selbst wollte jetzt ein Projekt weiterbearbeiten, welches ungefähr ein 3/4 Jahr alt ist... Ich hab den Code weggeworfen und das fast fertige Spiel neu angefangen. (Glaubt mir: Aus solchen Fehlern lernt man!)''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;2. Große Projekte = Großer Ruhm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stimmt! ABER Ruhm gibt es in der Szene nur für beendete Projekte. Und dreimal dürft Ihr raten was durch die im Punkt 1 angesprochenen Probleme meist nicht mit euren Projekten passiert...&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr OpenGL nur zur Visualisierung von z.&amp;amp;nbsp;B. wissenschaftlichen Ergebnissen benutzt, ist die Arbeit im Bezug auf OpenGL sehr übersichtlich. Wenn Ihr allerdings Spiele programmieren wollt, werdet Ihr schnell merken, dass Probleme auf euch zukommen werden, die euch beim Projektstart völlig unbekannt waren. Dies ist ein sicheres Zeichen dafür, dass doch noch etwas mehr Erfahrung nötig sein wird.&lt;br /&gt;
&lt;br /&gt;
'''Und woher soll ich bitte Erfahrung nehmen?'''&lt;br /&gt;
&lt;br /&gt;
Darin liegt der Trick:&lt;br /&gt;
&lt;br /&gt;
Alle OpenGLer haben einmal &amp;quot;klein&amp;quot; angefangen. Berühmt-berüchtigt sind die 3DPong-Clone, die zahlreich im Internet anzufinden sind. Auch Tetris-, Memory- oder &amp;quot;Vier Gewinnt&amp;quot;-Clone sind solche stillen Zeugen eines großen Lernvorgangs. Das Besondere an solchen Spielen ist, dass die Spiellogik relativ einfach ist und euch damit nur wenig von der Visualisierung ablenkt. &lt;br /&gt;
&lt;br /&gt;
Ihr denkt jetzt bestimmt &amp;quot;Was kann man denn schon in so nem Clon unterbringen?&amp;quot; '''VERDAMMT VIEL!''' Hier mal ein kleiner Auszug:&lt;br /&gt;
&lt;br /&gt;
*3D-Spieldarstellung&lt;br /&gt;
*2D Menüführung ([[glOrtho]])&lt;br /&gt;
*[[Blending]] &lt;br /&gt;
*[[Textur]]en &lt;br /&gt;
*Licht und Materialien (Ihr werdet Augen machen!)&lt;br /&gt;
*[[Selektion]] (Hin und wieder zum Haare raufen.)&lt;br /&gt;
*Kamerasteuerung /Bewegung durch die Szene (Da gibt es ganze Tutorials dazu)&lt;br /&gt;
&lt;br /&gt;
Als Ansporn solltet Ihr euch am Anfang ein kleines Ziel setzen und sagen &amp;quot;Ich möchte den besten und schönsten XYZ-Clon im ganzen Internet schaffen!&amp;quot;. So etwas trifft in der Szene auf wesentlich mehr Anerkennung als wenn mal wieder ein Anfänger etwas von Engine und Doom X faselt.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr ein oder zwei solcher Projekte abgeschlossen habt, und regelmäßig im Forum bzw. Wiki gelesen habt, werdet Ihr es schon merken, wenn Euer Traumprojekt endlich in Angriff genommen werden kann. (Ganz vergessen müsst ihr es nämlich doch nicht ;) )&lt;br /&gt;
&lt;br /&gt;
'''Als kurze Zusammenfassung solltet Ihr euch merken:'''&lt;br /&gt;
&lt;br /&gt;
*Ein fertiges Projekt bringt euch Ruhm (Seelenbalsam).&lt;br /&gt;
*Ein hübsches, fertiges Projekt bringt euch mehr Ruhm.&lt;br /&gt;
*Ein großes, fertiges, hübsches Projekt bringt euch noch mehr Ruhm.&lt;br /&gt;
&lt;br /&gt;
*Ein abgebrochenes oder eingefrorenes Projekt bringt euch Frust.&lt;br /&gt;
*Ein großes, abgebrochenes Projekt bringt euch noch mehr Frust, denn der verschwendeten Zeit werdet Ihr nachtrauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;3.Das es lang dauert ist egal. Ich interessiere mich halt dafür.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Aussage gilt nur dann, wenn Ihr schon über ein Jahr an ein und demselben Projekt gearbeitet habt. Anfänglich ist das kein Problem. Aber wenn man lange an etwas arbeitet und die gemachten Änderungen sind nicht sichtbar (weil sie z.&amp;amp;nbsp;B. den eigentlichen Motor der Anwendung betreffen und nicht die Ausgabe), dann verliert man schon mal die Lust. Folge sind die berüchtigten &amp;quot;Erfolgsmeldungen&amp;quot; wie: &amp;quot;Das Projekt wurde von mir bis auf weiteres aufs Eis gelegt. Ich werde sicherlich später daran weiterarbeiten.&amp;quot; In Verbindung mit Punkt 1 und dem letzen Satz aus Punkt 2 sollte euch das Endergebnis klar sein.&lt;br /&gt;
&lt;br /&gt;
==Nachwort==&lt;br /&gt;
&lt;br /&gt;
Soviel zur Euphoriebremse. OpenGL ist toll. OpenGL ist die Lösung für Eure Traumanwendung. Aber die wird auch mit OpenGL nicht von heute auf morgen programmiert. Deshalb heißt es Tutorials lesen kleine Testanwendungen schreiben um Effekte zu testen und Projekte bearbeiten. Dann wird es auch etwas mit den Traumprojekten. Zudem kann man anfangs auch versuchen in sehr kleinen Anwendungen einen Effekt auszuprobieren und diesen in Form eines kleinen Beispielprogramms oder eines Tutorials zu veröffenlichen. Somit lernt man nicht nur selbst etwas dazu...&lt;br /&gt;
&lt;br /&gt;
Nach diesen unglaublich Weise klingenden Worten die ich mit einem hoch ernsten Gesicht geschrieben habe, könnt ihr euch jetzt hochmotiviert an die restlichen Tutorials machen.&lt;br /&gt;
&lt;br /&gt;
Bis bald im [http://delphiGL.com/forum Forum]&lt;br /&gt;
&lt;br /&gt;
'''Euer'''&lt;br /&gt;
&lt;br /&gt;
'''Flash (Kevin Fleischer)'''&lt;br /&gt;
&lt;br /&gt;
PS: Feedback wird nicht nur gewünscht, sondern ausdrücklich gefordert. Deshalb: Ab mit deinen Meinungen und Ratschläge ins [http://www.delphigl.com/forum/viewforum.php?f=8 Feedback-Forum]!&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|-|[[Tutorial_lektion1]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Quickstart]]&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19348</id>
		<title>Tutorial Quickstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19348"/>
				<updated>2006-08-21T16:26:05Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: /* Methode 1: Timer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Quickstart: Delphi &amp;amp; OpenGL=&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Willkommen beim Delphi &amp;amp; OpenGL Quickstart. Diese kurze Einleitung soll euch auf die Tutorials bei DelphiGL.com und allgemein auf die Grafikprogrammierung mit OpenGL und Delphi vorbereiten. Dieser Quickstart ist kein Tutorial für sich, sondern soll ein Grundgefühl vermitteln wie OpenGL und Delphi miteinander arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wozu OpenGL? Mit OpenGL kann man eine Vielzahl von Aufgaben bewältigen. Ob man Forschungsergebnisse aller Art visualisieren, 2D oder 3D Spiele schreiben oder einfach seiner Anwendung eine Oberfläche geben möchte, die nicht dem windowsgrauen Standardlook entspricht. All das ist möglich mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
==Wie fange ich an?==&lt;br /&gt;
Genau zwei Dinge braucht der OpenGL-Programmierer um effektiv  arbeiten zu können:&lt;br /&gt;
#Einen OpenGL Header&lt;br /&gt;
#Eine Codebasis von der aus man neue Projekte starten kann (ein sog. Template)&lt;br /&gt;
&lt;br /&gt;
===Der OpenGL-Header===&lt;br /&gt;
Das is ja easy! Denn Delphi bringt ja schon einen OpenGL-Header mit...&lt;br /&gt;
&lt;br /&gt;
'''STOP!'''&lt;br /&gt;
&lt;br /&gt;
Denn wir reden von einem guten Header. Leider ist der original von Delphi mitgelieferte Header alles andere als zu empfehlen. Er ist fehlerhaft, hält sich nicht an OpenGL-Normen und außerdem ist er absolut veraltet.&lt;br /&gt;
&lt;br /&gt;
Was nun? Ganz einfach: Bei [http://www.DelphiGL.com DelphiGL.com] (kurz DGL) gibt es '''DEN''' OpenGL-Header für alle Pascalsprachen: &lt;br /&gt;
'''Die [[DGLOpenGL.pas]].'''&lt;br /&gt;
&lt;br /&gt;
Diesen solltet Ihr euch jetzt besorgen, wenn Ihr ihn nicht schon habt. Der Header wird bei neuen OpenGL-Versionen vom DGL-Team aktualisiert.&lt;br /&gt;
&lt;br /&gt;
===Codebasis/Templates===&lt;br /&gt;
So... das war schon alles was Ihr aus dem Netz benötigt. Den Rest machen wir jetzt per Hand.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel zeige ich euch wie man sich ein einfaches [[Template]] schreibt. Natürlich hat DelphiGL.com auch bereits [http://www.delphigl.com/download.php?cat=1 fertige Lösungen], die durchaus zu empfehlen sind und auch extra Features wie Vollbildrendering besitzen. ABER aus Erfahrung kann ich sagen: Man findet sich im eigenen Code viel einfacher zurecht. (Und die Extras kann man nachher immer noch einbauen.)&lt;br /&gt;
&lt;br /&gt;
==Das Template - Delphi fit für OpenGL machen==&lt;br /&gt;
Bevor man wirklich loslegen kann, muss noch die runtergeladene DGLOpenGL.pas an den richtigen Ort gebracht werden. Gut wäre z.&amp;amp;nbsp;B., sie in das Verzeichnis &amp;quot;\lib&amp;quot; in Eurem Delphiverzeichnis zu legen. (Wenn ihr den [[DGLSDK]] verwendet wurden die Suchpfade schon eingerichtet.)&lt;br /&gt;
&lt;br /&gt;
Dann startet mal Delphi. Vor euch sollte jetzt ein leeres Projekt erscheinen. Das leere Formular kann gleich minimiert werden, denn jetzt wird erstmal hübsch gecodet.&lt;br /&gt;
&lt;br /&gt;
''(Am Ende von Kapitel 1.3 findet ihr den Kopf der Template-Klasse. Dort seht ihr auch welche Variablen, von welchem Typ deklariert werden müssen. )''&lt;br /&gt;
&lt;br /&gt;
===Initialisieren von OpenGL===&lt;br /&gt;
Dieser Teil ließ früher dem OpenGL Anfänger die Haare nicht nur zu Berge stehen, sondern gleich ausfallen. Dank der DGLOpenGL.pas wurde das aber um Längen einfacher. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal solltet Ihr die DGLOpenGL.pas in die '''uses'''-Klausel des '''interface'''-Teils der Unit1 schreiben.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung soll direkt beim Erstellen des Formulars gemacht werden. Deshalb kommt der folgende Quelltext ins OnCreate-Ereignis des Formulars.&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DC:= GetDC(Handle);&lt;br /&gt;
  if not InitOpenGL then Application.Terminate;&lt;br /&gt;
  RC:= CreateRenderingContext( DC,&lt;br /&gt;
                               [opDoubleBuffered],&lt;br /&gt;
                               32,&lt;br /&gt;
                               24,&lt;br /&gt;
                               0,0,0,&lt;br /&gt;
                               0);&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
'''Zeile 3:''' Hier wird der Gerätekontext (Device Context) von Formular Form1 abgefragt.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mit InitOpenGL wird OpenGL initialisiert. Wenn das nicht funktioniert wird die gesamte Anwendung sofort beendet. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 5:''' Hier wird der [[Renderkontext]] erzeugt. Den braucht OpenGL zum Zeichnen auf das Formular. Was die Parameter genau bewirken lernt ihr im [[Tutorial_lektion1]].&lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Abschließend wird der Renderkontext aktiviert. OpenGL ist jetzt prinzipiell startbereit.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|DC und RC sind Eigenschaften des Formulars. Siehe [[Tutorial_quickstart#Das_fertige_Templateformular|Definition des Templateformulars]].}}&lt;br /&gt;
&lt;br /&gt;
Nach dieser durchaus simplen Initialisierung (man kann auch alles per Hand machen was InitOpenGL macht!) steht OpenGL ziemlich nackt da. Soll heißen, alle OpenGL Eigenschaften/Zustände stehen auf den definierten Anfangswerten. Es kommt aber durchaus oft - eigentlich ständig - vor, dass bestimmte Einstellungen von OpenGL benutzt werden sollen. Deshalb schreiben wir uns noch eine kleine Zusatzprozedur: SetupOpenGL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.SetupGL;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe&lt;br /&gt;
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren&lt;br /&gt;
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was hier passiert wird durch die Kommentare bereits erklärt (Für mehr Infos siehe [[Tiefentest]] bzw. [[Backface Culling]]). Die Hintergrundfarbe könnt ihr nach Belieben einstellen. (Wenn ihr später einmal geschlossene Szenen rendern wollt, dann ist es günstig eine sehr schräge Farbe als Hintergrundfarbe einzustellen, so findet man leichter Fehler in der Szene.)&lt;br /&gt;
&lt;br /&gt;
Außerdem hat man ja hin und wieder auch noch globale Variablen, die man initialisieren möchte. Da wir mit solchen Sachen unser schön aufgeräumtes '''FormCreate''' nicht zumüllen wollen bietet sich ein Unterprogramm namens '''InitGlobals''' oder kurz '''Init''' an.&lt;br /&gt;
Beide Unterprogramme (SetupGL und Init) sollten am Ende von '''FormCreate''' gerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  [...]&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
  SetupGL;&lt;br /&gt;
  Init;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Die Ereignisbehandlung===&lt;br /&gt;
Für OpenGL sind vor allem die Ereignisse von Bedeutung, die an der Zeichenfläche von OpenGL herumwerkeln. Da OpenGL direkt auf das Formular (oder auch auf ein Panel) zeichnet, müssen Ereignisse, die diese Zeichenfläche ändern, behandelt werden. Dies wären das '''OnResize-''' und das '''OnDestroy'''-Ereignis.&lt;br /&gt;
&lt;br /&gt;
Zuerst '''FormResize''':&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormResize(Sender: TObject);&lt;br /&gt;
var tmpBool : Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  glViewport(0, 0, ClientWidth, ClientHeight);&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);    &lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  IdleHandler(Sender, tmpBool);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen im '''const''' Teil die beiden Konstanten Near- bzw. FarClipping definiert werden. Diese geben die Entfernung für die [[Clipping Plane|Clippingebenen]] (Szenenbegrenzung) an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  NearClipping = 1;&lt;br /&gt;
  FarClipping  = 1000;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zu FormResize''':&lt;br /&gt;
&lt;br /&gt;
'''Zeile 2:''' Diese Boolean-Variable wird in Zeile 11 verwendet und ist nur ein Dummy.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mittels [[glViewport]] sagt Ihr OpenGL, wie groß die OpenGL-Ausgabe werden soll. Genau diese Größe hatte sich ja durch das Resize verändert.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 5/9:''' Hier seht Ihr 2 der 3 möglichen Matrixmodi. '''GL_PROJECTION''' wird benutzt um nachfolgend die OpenGL-Ausgabe zu manipulieren, '''GL_MODELVIEW''' benutzt man, um OpenGL mit Daten zu füttern.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 6:''' [[glLoadIdentity]] füllt die aktuelle Matrix mit der Identitätsmatrix. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird eingestellt wie der Betrachter die Welt sehen soll. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Was der IdleHandler macht kommt später im Abschnitt 1.3.3 (Zeichenroutine).&lt;br /&gt;
&lt;br /&gt;
Nun noch schnell das '''FormDestroy''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DeactivateRenderingContext;&lt;br /&gt;
  DestroyRenderingContext(RC);&lt;br /&gt;
  ReleaseDC(Handle, DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was es macht? Steht doch da: Den RenderingContext deaktivieren und freigeben.&lt;br /&gt;
&lt;br /&gt;
===Die Zeichenroutine===&lt;br /&gt;
Das Herzstück unseres Templates fehlte bisher. Irgendwann muss der Grafikkarte ja auch gesagt werden, was sie denn überhaupt ausgeben soll. Das kommt jetzt: '''TForm1.Render'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Render;&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
&lt;br /&gt;
  glTranslatef(0, 0, -5);&lt;br /&gt;
&lt;br /&gt;
  glBegin(GL_QUADS);&lt;br /&gt;
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);&lt;br /&gt;
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);&lt;br /&gt;
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);&lt;br /&gt;
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);&lt;br /&gt;
  glEnd;&lt;br /&gt;
&lt;br /&gt;
  SwapBuffers(DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Dieser Aufruf sorgt dafür, dass der [[Farbpuffer]] und [[Tiefenpuffer]] gelöscht werden. Wenn man das nicht macht, sieht man alles mögliche, nur nicht das was Ihr rendern wollt. Probiert es ruhig mal ohne aus! Man wird dadurch nicht dümmer.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird wieder die Perspektive gesetzt. Dieser Aufruf und der bei '''FormResize''' &lt;br /&gt;
müssen von den Parametern identisch sein. Sonst sieht die Ausgabe nach einem Resize kurz anders aus. &lt;br /&gt;
Wenn sich die Perspektive zwischen den Renderdurchgängen nicht ändert kann das auch weg gelassen werden.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 12:''' Dieser Aufruf verschiebt die &amp;quot;Kamera&amp;quot; (so etwas gibt es eigentlich nicht, aber das nur am Rande. Mehr zu diesem Thema gibts im [[Tutorial Matrix2]]) etwas nach hinten. Schließlich wollen wir das, was wir zeichnen auch sehen. Alles was zu nah ist wird durch die '''Near-[[Clipping Plane]]''' abgeschnitten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:GlShadeModel_SMOOTH.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' [[glBegin]]/[[glEnd]] kapseln die eigentlichen Zeichenbefehle. Diese sorgen hier für ein '''hübsches buntes Viereck'''. Das soll für den ersten Test ausreichen. Wichtig ist in dem Zusammenhang noch folgendes: OpenGL ist es egal woher ein Befehl kommt. Alles wird ausgewertet und landet unter Umständen im Framebuffer. Ihr könnt also ein Unterprogramm, welches ein Unterprogramm, welches ... ..., welches die OpenGL Befehle enthält schreiben. Das interessiert OpenGL bzw. die Grafikkarte überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 21:''' [[SwapBuffers]] sorgt dafür, dass der Inhalt des [[Framebuffer]]s auf dem &lt;br /&gt;
Bildschirm erscheint. Ohne diesen Befehl seht Ihr gar nichts von OpenGL. (Interessanter Artikel dazu: [[Doppelpufferung]])&lt;br /&gt;
&lt;br /&gt;
So... ganz toll. Jetzt habt Ihr Eure Zeichenfunktion... und nun? Irgendwie müsst Ihr diese auch aufrufen. Das wäre aber zu einfach. Die Ausgabe ändert sich ja normalerweise (z.&amp;amp;nbsp;B. in Spielen). Deshalb muss die Zeichenfunktion immer wieder ausgegeben werden. Dazu gibt es zwei Möglichkeiten, die beide Ihre Vor- und Nachteile haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Argument&lt;br /&gt;
!Timer&lt;br /&gt;
!OnIdle&lt;br /&gt;
|-&lt;br /&gt;
|Maximale Framezahl erreichbar &amp;lt;br&amp;gt;&amp;quot;Benchmark&amp;quot;&lt;br /&gt;
|nein&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Framezahl steuerbar&lt;br /&gt;
|ja&lt;br /&gt;
|bedingt (/umständlich)&lt;br /&gt;
|-&lt;br /&gt;
|Für flüssige Animationen nutzbar&amp;lt;br&amp;gt;(Egoshooter)&lt;br /&gt;
|bedingt/schlecht&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für Menüs nutzbar&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für einfache Animationen nutzbar&amp;lt;br&amp;gt;(Strategiespiele)&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Laptopfreundlich (Anti-Akku-Killer)&lt;br /&gt;
|ja&lt;br /&gt;
|NEIN!&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer einfache Anwendungen schreiben möchte, die auch mit 25 FpS (Bilder Pro Sekunde) auskommen und den Akku von Laptopusern schonen will, sollte die Timervariante nutzen. Wer die Potenziale der Grafikkarten voll ausnutzen möchte sollte OnIdle verwenden.&lt;br /&gt;
&lt;br /&gt;
====Methode 1: Timer====&lt;br /&gt;
Bei dieser Methode muss ein Timer (zu finden bei den Systemkomponenten) auf das Formular gezogen werden. Der Timer besitzt eine Eigenschaft names &amp;quot;Interval&amp;quot;. Mit dieser Eigenschaft kann man einstellen, nach wie vielen Millisekunden das Ereignis OnTimer ausgelöst wird. Man kann &amp;quot;Interval&amp;quot; nicht beliebig verkleinern. Werte unter 25 können vom Standardtimer den Windows verwendet nicht mehr korrekt erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt von OnTimer könnte dieser sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
   inc(FrameCount);&lt;br /&gt;
   Render;&lt;br /&gt;
   If FrameCount = 20 then&lt;br /&gt;
      begin&lt;br /&gt;
           ErrorHandler;&lt;br /&gt;
           FrameCount := 0;&lt;br /&gt;
      end;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tiefgreifende Erklärungen sind hier nicht notwendig. Was der ErrorHandler ist wird nach der Methode 2 erklärt.&lt;br /&gt;
&lt;br /&gt;
====Methode 2: OnIdle====&lt;br /&gt;
&lt;br /&gt;
OnIdle ist ein besonderes Ereignis, welches das gesamte Programm betrifft. Wenn die Anwendung nichts zu tun hat, also faul ist (engl. idle), tritt das Ereignis ein.&lt;br /&gt;
&lt;br /&gt;
Die Methode mit OnIdle kann gleich mit zum Auswerten der Framezahlen (Anzahl Bildwiederholungen pro Sekunde) benutzt werden (Framecounter). Der nachfolgende Code enthält selbigen bereits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
begin&lt;br /&gt;
  StartTime:= GetTickCount;&lt;br /&gt;
  Render;&lt;br /&gt;
  DrawTime:= GetTickCount - StartTime;&lt;br /&gt;
  Inc(TimeCount, DrawTime);&lt;br /&gt;
  Inc(FrameCount);&lt;br /&gt;
&lt;br /&gt;
  if TimeCount &amp;gt;= 1000 then begin&lt;br /&gt;
    Frames:= FrameCount;&lt;br /&gt;
    TimeCount:= TimeCount - 1000;&lt;br /&gt;
    FrameCount:= 0;&lt;br /&gt;
    Caption:= InttoStr(Frames) + 'FPS';&lt;br /&gt;
    ErrorHandler;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  Done:= false;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Mittels GetTickCount wird die Systemzeit gemessen. Dies ist nicht nötig um &lt;br /&gt;
erfolgreich zu zeichnen, sondern dient ausschließlich der Berechnung der Framerate. Diese wiederum ist ein guter Performancemesser.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Hier erfolgt der Aufruf unserer Zeichenroutine.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 9:''' Der hier angeordnete Block wird nur pro Sekunde einmal ausgeführt und sorgt &lt;br /&gt;
dafür, dass die Framerate angezeigt wird. Außerdem wird der Errorhandler aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' Der Errorhandler wird im Anschluß beschrieben.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 17:''' Wenn ''Done'' nach der Ausführung ''false'' ist und das Programm wieder nichts zu tun &lt;br /&gt;
hat, wird OnIdle erneut ausgeführt. Wenn ''Done = true'' ist wird OnIdle nur einmal ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Um auf das &amp;quot;Idle-Event&amp;quot; reagieren zu können, müsst ihr jetzt nur noch diese Funktion an das Event koppeln. Das macht ihr, indem ihr den nachfolgenden Code in die letzte Zeile eurer FormCreate-Methode schreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;Application.OnIdle := IdleHandler;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie ihr bald selbst feststellen werdet, sorgt diese Methode für eine hundertprozentige Prozessorauslastung. Umgehen könnt ihr dies mit einem kleinen Trick:&lt;br /&gt;
&lt;br /&gt;
Fügt vor dem &amp;quot;Done := false&amp;quot; (Zeile 17 des IdleHandlers) noch ein sleep(1) oder sleep(5) ein. Dadurch sinkt die Prozessorlast auf ca. 80%, was schon ein Fortschritt ist.&lt;br /&gt;
&lt;br /&gt;
===Der ErrorHandler - Fehler erkannt, Fehler gebannt===&lt;br /&gt;
Der Errorhandler ist wieder eine total einfache Funktion, denn OpenGL bietet von Haus aus eine Möglichkeit OpenGL-Fehler zu erkennen. Deshalb ist der ErrorHandler auch so klein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.ErrorHandler;&lt;br /&gt;
begin&lt;br /&gt;
  Form1.Caption := gluErrorString(glGetError);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enttäuscht? Ihr könnt den ErrorHandler nach belieben auch komplexer machen. Zum Beispiel könnt Ihr anstatt die Fehler im Fenstertitel anzuzeigen lieber den Fehler in ein Logfile schreiben. Ganz nebenbei: Falls kein Fehler auftritt liefert [[glGetError]] '''GL_NO_ERROR'''.&lt;br /&gt;
&lt;br /&gt;
===Das fertige Templateformular===&lt;br /&gt;
Eure Klasse TForm1 sollte also jetzt so, oder so ähnlich aussehen:&lt;br /&gt;
&amp;lt;pascal&amp;gt;TForm1 = class(TForm)&lt;br /&gt;
    procedure FormCreate(Sender: TObject);&lt;br /&gt;
    procedure IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
    procedure FormResize(Sender: TObject);&lt;br /&gt;
    procedure FormDestroy(Sender: TObject);&lt;br /&gt;
  private    { Private-Deklarationen }&lt;br /&gt;
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter&lt;br /&gt;
    Frames, DrawTime                  : Cardinal; //&amp;amp; Timebased Movement&lt;br /&gt;
    procedure SetupGL;&lt;br /&gt;
    procedure Init;&lt;br /&gt;
    procedure Render;&lt;br /&gt;
    procedure ErrorHandler;&lt;br /&gt;
  public    { Public-Deklarationen }&lt;br /&gt;
    DC                                : HDC;  //Handle auf Zeichenfläche&lt;br /&gt;
    RC                                : HGLRC;//Rendering Context&lt;br /&gt;
  end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Wie man sieht benutzt mein Template die zweite Methode (OnIdle).&lt;br /&gt;
&lt;br /&gt;
'''Zeile 8:''' Was [[Timebased Movement]] ist könnt ihr ja mal nachlesen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14/15:''' HDC und HGLRC sind Typen die von Windows zur Verfügung gestellt werden. Ihr findet sie in der Unit &amp;quot;Windows&amp;quot;. (Diese Unit sollte bei einem neuen Projekt bereits durch Delphi eingebunden worden sein.)&lt;br /&gt;
&lt;br /&gt;
So... fertig. Eigentlich seid Ihr jetzt soweit von den Tutorialschreibern so richtig mit OpenGL-Wissen voll gepumpt zu werden. Das nachfolgende Kapitel könnt Ihr euch trotzdem ruhigen Gewissens durchlesen. Wer es liest tappt vielleicht nicht gleich bei der ersten Frage im DGL-Forum ins berüchtigte Fettnäpfchen.&lt;br /&gt;
&lt;br /&gt;
==Tipps für den OpenGL Anfänger==&lt;br /&gt;
Wenn man mit OpenGL anfängt ist man meist total perplex und ein &amp;quot;Das war ja einfach!&amp;quot; huscht einem nicht nur einmal über die Lippen. Vor allem zu Beginn Eurer OpenGL-Karriere werdet Ihr viel lernen und dabei nur auf verhältnismäßig geringen Widerstand stoßen. Aber glaubt mir es gibt ihn...&lt;br /&gt;
&lt;br /&gt;
Häufig tauchen hoch motivierte OpenGL Anfänger im Forum auf und verkünden stolz, sie würden gerade an einer Engine arbeiten die ''&amp;quot;nur auf Doom 1 Niveau arbeiten soll&amp;quot;''. &lt;br /&gt;
&lt;br /&gt;
Dazu gibt es häufig eine durchaus beachtliche Anzahl von Forenmitgliedern die dann ungefähr folgendes sagen: ''&amp;quot;Fang gar nicht erst damit an. Vergiss es, und komm in einem Jahr noch mal darauf zurück!&amp;quot;'' (Die Forensuche sollte euch einige dieser Threads zeigen)&lt;br /&gt;
&lt;br /&gt;
Sind das böse Pessimisten, die Probleme nutzen um aufzugeben? '''Nein!''' Sie haben zumeist die Erfahrungen gemacht, die Ihr noch machen werdet. Deshalb will ich euch an dieser Stelle einweihen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;1. Je älter der Code ist desto besser wird er.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider nein. Code und Wein unterscheiden sich hier leider grundlegend. Viele... die meisten... eigentlich alle von uns bekommen Ausschlag, wenn sie sich ihren Code von vor 1 Jahr angucken. Erst wenn man so schätzungsweise 3 bis 5 Jahre mit OpenGL gearbeitet hat, hat man ein echtes Gefühl für den Code. Am Anfang hat man nämlich, ob man will oder nicht, die Tendenz schon nach den ersten 3 Wochen Programmierarbeit sich den Code so zu zerschießen, dass die weitere Arbeit keinen Spaß mehr macht.&lt;br /&gt;
&lt;br /&gt;
''Ich selbst wollte jetzt ein Projekt weiterbearbeiten, welches ungefähr ein 3/4 Jahr alt ist... Ich hab den Code weggeworfen und das fast fertige Spiel neu angefangen. (Glaubt mir: Aus solchen Fehlern lernt man!)''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;2. Große Projekte = Großer Ruhm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stimmt! ABER Ruhm gibt es in der Szene nur für beendete Projekte. Und dreimal dürft Ihr raten was durch die im Punkt 1 angesprochenen Probleme meist nicht mit euren Projekten passiert...&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr OpenGL nur zur Visualisierung von z.&amp;amp;nbsp;B. wissenschaftlichen Ergebnissen benutzt, ist die Arbeit im Bezug auf OpenGL sehr übersichtlich. Wenn Ihr allerdings Spiele programmieren wollt, werdet Ihr schnell merken, dass Probleme auf euch zukommen werden, die euch beim Projektstart völlig unbekannt waren. Dies ist ein sicheres Zeichen dafür, dass doch noch etwas mehr Erfahrung nötig sein wird.&lt;br /&gt;
&lt;br /&gt;
'''Und woher soll ich bitte Erfahrung nehmen?'''&lt;br /&gt;
&lt;br /&gt;
Darin liegt der Trick:&lt;br /&gt;
&lt;br /&gt;
Alle OpenGLer haben einmal &amp;quot;klein&amp;quot; angefangen. Berühmt-berüchtigt sind die 3DPong-Clone, die zahlreich im Internet anzufinden sind. Auch Tetris-, Memory- oder &amp;quot;Vier Gewinnt&amp;quot;-Clone sind solche stillen Zeugen eines großen Lernvorgangs. Das Besondere an solchen Spielen ist, dass die Spiellogik relativ einfach ist und euch damit nur wenig von der Visualisierung ablenkt. &lt;br /&gt;
&lt;br /&gt;
Ihr denkt jetzt bestimmt &amp;quot;Was kann man denn schon in so nem Clon unterbringen?&amp;quot; '''VERDAMMT VIEL!''' Hier mal ein kleiner Auszug:&lt;br /&gt;
&lt;br /&gt;
*3D-Spieldarstellung&lt;br /&gt;
*2D Menüführung ([[glOrtho]])&lt;br /&gt;
*[[Blending]] &lt;br /&gt;
*[[Textur]]en &lt;br /&gt;
*Licht und Materialien (Ihr werdet Augen machen!)&lt;br /&gt;
*[[Selektion]] (Hin und wieder zum Haare raufen.)&lt;br /&gt;
*Kamerasteuerung /Bewegung durch die Szene (Da gibt es ganze Tutorials dazu)&lt;br /&gt;
&lt;br /&gt;
Als Ansporn solltet Ihr euch am Anfang ein kleines Ziel setzen und sagen &amp;quot;Ich möchte den besten und schönsten XYZ-Clon im ganzen Internet schaffen!&amp;quot;. So etwas trifft in der Szene auf wesentlich mehr Anerkennung als wenn mal wieder ein Anfänger etwas von Engine und Doom X faselt.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr ein oder zwei solcher Projekte abgeschlossen habt, und regelmäßig im Forum bzw. Wiki gelesen habt werdet Ihr schon merken, wenn Euer Traumprojekt endlich in Angriff genommen werden kann. (Ganz vergessen müsst ihr es nämlich doch nicht ;) )&lt;br /&gt;
&lt;br /&gt;
'''Als kurze Zusammenfassung solltet Ihr euch merken:'''&lt;br /&gt;
&lt;br /&gt;
*Ein fertiges Projekt bringt euch Ruhm (Seelenbalsam).&lt;br /&gt;
*Ein hübsches, fertiges Projekt bringt euch mehr Ruhm.&lt;br /&gt;
*Ein großes, fertiges, hübsches Projekt bringt euch noch mehr Ruhm.&lt;br /&gt;
&lt;br /&gt;
*Ein abgebrochenes oder eingefrorenes Projekt bringt euch Frust.&lt;br /&gt;
*Ein großes, abgebrochenes Projekt bringt euch noch mehr Frust, denn der verschwendeten Zeit werdet Ihr nachtrauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;3.Das es lang dauert ist egal. Ich interessiere mich halt dafür.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Aussage gilt nur dann, wenn Ihr schon über ein Jahr an ein und demselben Projekt gearbeitet habt. Anfänglich ist das kein Problem. Aber wenn man lange an etwas arbeitet und die gemachten Änderungen sind nicht sichtbar (weil sie z.&amp;amp;nbsp;B. den eigentlichen Motor der Anwendung betreffen und nicht die Ausgabe) dann verliert man schon mal die Lust. Folge sind die berüchtigten &amp;quot;Erfolgsmeldungen&amp;quot; wie: &amp;quot;Das Projekt wurde von mir bis auf weiteres aufs Eis gelegt. Ich werde sicherlich später daran weiterarbeiten.&amp;quot; In Verbindung mit Punkt 1 und den letzen Satz aus Punkt 2 sollte euch das Endergebnis klar sein.&lt;br /&gt;
&lt;br /&gt;
==Nachwort==&lt;br /&gt;
&lt;br /&gt;
Soviel zur Euphoriebremse. OpenGL ist toll. OpenGL ist die Lösung für Eure Traumanwendung. Aber die wird auch mit OpenGL nicht von heute auf morgen programmiert. Deshalb heißt es Tutorials lesen kleine Testanwendungen schreiben um Effekte zu testen und Projekte bearbeiten. Dann wird es auch etwas mit den Traumprojekten. Zudem kann man anfangs auch versuchen in sehr kleinen Anwendungen einen Effekt auszuprobieren und diesen in Form eines kleinen Beispielprogramms oder eines Tutorials zu veröffenlichen. Somit lernt man nicht nur selbst etwas dazu...&lt;br /&gt;
&lt;br /&gt;
Nach diesen unglaublich Weise klingenden Worten die ich mit einem hoch ernsten Gesicht geschrieben habe, könnt ihr euch jetzt hochmotiviert an die restlichen Tutorials machen.&lt;br /&gt;
&lt;br /&gt;
Bis bald im [http://delphiGL.com/forum Forum]&lt;br /&gt;
&lt;br /&gt;
'''Euer'''&lt;br /&gt;
&lt;br /&gt;
'''Flash (Kevin Fleischer)'''&lt;br /&gt;
&lt;br /&gt;
PS: Feedback wird nicht nur gewünscht, sondern ausdrücklich gefordert. Deshalb: Ab mit deinen Meinungen und Ratschläge ins [http://www.delphigl.com/forum/viewforum.php?f=8 Feedback-Forum]!&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|-|[[Tutorial_lektion1]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Quickstart]]&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19347</id>
		<title>Tutorial Quickstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19347"/>
				<updated>2006-08-21T16:22:14Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: /* Die Ereignisbehandlung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Quickstart: Delphi &amp;amp; OpenGL=&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Willkommen beim Delphi &amp;amp; OpenGL Quickstart. Diese kurze Einleitung soll euch auf die Tutorials bei DelphiGL.com und allgemein auf die Grafikprogrammierung mit OpenGL und Delphi vorbereiten. Dieser Quickstart ist kein Tutorial für sich, sondern soll ein Grundgefühl vermitteln wie OpenGL und Delphi miteinander arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wozu OpenGL? Mit OpenGL kann man eine Vielzahl von Aufgaben bewältigen. Ob man Forschungsergebnisse aller Art visualisieren, 2D oder 3D Spiele schreiben oder einfach seiner Anwendung eine Oberfläche geben möchte, die nicht dem windowsgrauen Standardlook entspricht. All das ist möglich mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
==Wie fange ich an?==&lt;br /&gt;
Genau zwei Dinge braucht der OpenGL-Programmierer um effektiv  arbeiten zu können:&lt;br /&gt;
#Einen OpenGL Header&lt;br /&gt;
#Eine Codebasis von der aus man neue Projekte starten kann (ein sog. Template)&lt;br /&gt;
&lt;br /&gt;
===Der OpenGL-Header===&lt;br /&gt;
Das is ja easy! Denn Delphi bringt ja schon einen OpenGL-Header mit...&lt;br /&gt;
&lt;br /&gt;
'''STOP!'''&lt;br /&gt;
&lt;br /&gt;
Denn wir reden von einem guten Header. Leider ist der original von Delphi mitgelieferte Header alles andere als zu empfehlen. Er ist fehlerhaft, hält sich nicht an OpenGL-Normen und außerdem ist er absolut veraltet.&lt;br /&gt;
&lt;br /&gt;
Was nun? Ganz einfach: Bei [http://www.DelphiGL.com DelphiGL.com] (kurz DGL) gibt es '''DEN''' OpenGL-Header für alle Pascalsprachen: &lt;br /&gt;
'''Die [[DGLOpenGL.pas]].'''&lt;br /&gt;
&lt;br /&gt;
Diesen solltet Ihr euch jetzt besorgen, wenn Ihr ihn nicht schon habt. Der Header wird bei neuen OpenGL-Versionen vom DGL-Team aktualisiert.&lt;br /&gt;
&lt;br /&gt;
===Codebasis/Templates===&lt;br /&gt;
So... das war schon alles was Ihr aus dem Netz benötigt. Den Rest machen wir jetzt per Hand.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel zeige ich euch wie man sich ein einfaches [[Template]] schreibt. Natürlich hat DelphiGL.com auch bereits [http://www.delphigl.com/download.php?cat=1 fertige Lösungen], die durchaus zu empfehlen sind und auch extra Features wie Vollbildrendering besitzen. ABER aus Erfahrung kann ich sagen: Man findet sich im eigenen Code viel einfacher zurecht. (Und die Extras kann man nachher immer noch einbauen.)&lt;br /&gt;
&lt;br /&gt;
==Das Template - Delphi fit für OpenGL machen==&lt;br /&gt;
Bevor man wirklich loslegen kann, muss noch die runtergeladene DGLOpenGL.pas an den richtigen Ort gebracht werden. Gut wäre z.&amp;amp;nbsp;B., sie in das Verzeichnis &amp;quot;\lib&amp;quot; in Eurem Delphiverzeichnis zu legen. (Wenn ihr den [[DGLSDK]] verwendet wurden die Suchpfade schon eingerichtet.)&lt;br /&gt;
&lt;br /&gt;
Dann startet mal Delphi. Vor euch sollte jetzt ein leeres Projekt erscheinen. Das leere Formular kann gleich minimiert werden, denn jetzt wird erstmal hübsch gecodet.&lt;br /&gt;
&lt;br /&gt;
''(Am Ende von Kapitel 1.3 findet ihr den Kopf der Template-Klasse. Dort seht ihr auch welche Variablen, von welchem Typ deklariert werden müssen. )''&lt;br /&gt;
&lt;br /&gt;
===Initialisieren von OpenGL===&lt;br /&gt;
Dieser Teil ließ früher dem OpenGL Anfänger die Haare nicht nur zu Berge stehen, sondern gleich ausfallen. Dank der DGLOpenGL.pas wurde das aber um Längen einfacher. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal solltet Ihr die DGLOpenGL.pas in die '''uses'''-Klausel des '''interface'''-Teils der Unit1 schreiben.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung soll direkt beim Erstellen des Formulars gemacht werden. Deshalb kommt der folgende Quelltext ins OnCreate-Ereignis des Formulars.&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DC:= GetDC(Handle);&lt;br /&gt;
  if not InitOpenGL then Application.Terminate;&lt;br /&gt;
  RC:= CreateRenderingContext( DC,&lt;br /&gt;
                               [opDoubleBuffered],&lt;br /&gt;
                               32,&lt;br /&gt;
                               24,&lt;br /&gt;
                               0,0,0,&lt;br /&gt;
                               0);&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
'''Zeile 3:''' Hier wird der Gerätekontext (Device Context) von Formular Form1 abgefragt.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mit InitOpenGL wird OpenGL initialisiert. Wenn das nicht funktioniert wird die gesamte Anwendung sofort beendet. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 5:''' Hier wird der [[Renderkontext]] erzeugt. Den braucht OpenGL zum Zeichnen auf das Formular. Was die Parameter genau bewirken lernt ihr im [[Tutorial_lektion1]].&lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Abschließend wird der Renderkontext aktiviert. OpenGL ist jetzt prinzipiell startbereit.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|DC und RC sind Eigenschaften des Formulars. Siehe [[Tutorial_quickstart#Das_fertige_Templateformular|Definition des Templateformulars]].}}&lt;br /&gt;
&lt;br /&gt;
Nach dieser durchaus simplen Initialisierung (man kann auch alles per Hand machen was InitOpenGL macht!) steht OpenGL ziemlich nackt da. Soll heißen, alle OpenGL Eigenschaften/Zustände stehen auf den definierten Anfangswerten. Es kommt aber durchaus oft - eigentlich ständig - vor, dass bestimmte Einstellungen von OpenGL benutzt werden sollen. Deshalb schreiben wir uns noch eine kleine Zusatzprozedur: SetupOpenGL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.SetupGL;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe&lt;br /&gt;
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren&lt;br /&gt;
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was hier passiert wird durch die Kommentare bereits erklärt (Für mehr Infos siehe [[Tiefentest]] bzw. [[Backface Culling]]). Die Hintergrundfarbe könnt ihr nach Belieben einstellen. (Wenn ihr später einmal geschlossene Szenen rendern wollt, dann ist es günstig eine sehr schräge Farbe als Hintergrundfarbe einzustellen, so findet man leichter Fehler in der Szene.)&lt;br /&gt;
&lt;br /&gt;
Außerdem hat man ja hin und wieder auch noch globale Variablen, die man initialisieren möchte. Da wir mit solchen Sachen unser schön aufgeräumtes '''FormCreate''' nicht zumüllen wollen bietet sich ein Unterprogramm namens '''InitGlobals''' oder kurz '''Init''' an.&lt;br /&gt;
Beide Unterprogramme (SetupGL und Init) sollten am Ende von '''FormCreate''' gerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  [...]&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
  SetupGL;&lt;br /&gt;
  Init;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Die Ereignisbehandlung===&lt;br /&gt;
Für OpenGL sind vor allem die Ereignisse von Bedeutung, die an der Zeichenfläche von OpenGL herumwerkeln. Da OpenGL direkt auf das Formular (oder auch auf ein Panel) zeichnet, müssen Ereignisse, die diese Zeichenfläche ändern, behandelt werden. Dies wären das '''OnResize-''' und das '''OnDestroy'''-Ereignis.&lt;br /&gt;
&lt;br /&gt;
Zuerst '''FormResize''':&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormResize(Sender: TObject);&lt;br /&gt;
var tmpBool : Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  glViewport(0, 0, ClientWidth, ClientHeight);&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);    &lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  IdleHandler(Sender, tmpBool);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen im '''const''' Teil die beiden Konstanten Near- bzw. FarClipping definiert werden. Diese geben die Entfernung für die [[Clipping Plane|Clippingebenen]] (Szenenbegrenzung) an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  NearClipping = 1;&lt;br /&gt;
  FarClipping  = 1000;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zu FormResize''':&lt;br /&gt;
&lt;br /&gt;
'''Zeile 2:''' Diese Boolean-Variable wird in Zeile 11 verwendet und ist nur ein Dummy.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mittels [[glViewport]] sagt Ihr OpenGL, wie groß die OpenGL-Ausgabe werden soll. Genau diese Größe hatte sich ja durch das Resize verändert.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 5/9:''' Hier seht Ihr 2 der 3 möglichen Matrixmodi. '''GL_PROJECTION''' wird benutzt um nachfolgend die OpenGL-Ausgabe zu manipulieren, '''GL_MODELVIEW''' benutzt man, um OpenGL mit Daten zu füttern.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 6:''' [[glLoadIdentity]] füllt die aktuelle Matrix mit der Identitätsmatrix. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird eingestellt wie der Betrachter die Welt sehen soll. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Was der IdleHandler macht kommt später im Abschnitt 1.3.3 (Zeichenroutine).&lt;br /&gt;
&lt;br /&gt;
Nun noch schnell das '''FormDestroy''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DeactivateRenderingContext;&lt;br /&gt;
  DestroyRenderingContext(RC);&lt;br /&gt;
  ReleaseDC(Handle, DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was es macht? Steht doch da: Den RenderingContext deaktivieren und freigeben.&lt;br /&gt;
&lt;br /&gt;
===Die Zeichenroutine===&lt;br /&gt;
Das Herzstück unseres Templates fehlte bisher. Irgendwann muss der Grafikkarte ja auch gesagt werden, was sie denn überhaupt ausgeben soll. Das kommt jetzt: '''TForm1.Render'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Render;&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
&lt;br /&gt;
  glTranslatef(0, 0, -5);&lt;br /&gt;
&lt;br /&gt;
  glBegin(GL_QUADS);&lt;br /&gt;
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);&lt;br /&gt;
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);&lt;br /&gt;
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);&lt;br /&gt;
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);&lt;br /&gt;
  glEnd;&lt;br /&gt;
&lt;br /&gt;
  SwapBuffers(DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Dieser Aufruf sorgt dafür, dass der [[Farbpuffer]] und [[Tiefenpuffer]] gelöscht werden. Wenn man das nicht macht, sieht man alles mögliche, nur nicht das was Ihr rendern wollt. Probiert es ruhig mal ohne aus! Man wird dadurch nicht dümmer.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird wieder die Perspektive gesetzt. Dieser Aufruf und der bei '''FormResize''' &lt;br /&gt;
müssen von den Parametern identisch sein. Sonst sieht die Ausgabe nach einem Resize kurz anders aus. &lt;br /&gt;
Wenn sich die Perspektive zwischen den Renderdurchgängen nicht ändert kann das auch weg gelassen werden.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 12:''' Dieser Aufruf verschiebt die &amp;quot;Kamera&amp;quot; (so etwas gibt es eigentlich nicht, aber das nur am Rande. Mehr zu diesem Thema gibts im [[Tutorial Matrix2]]) etwas nach hinten. Schließlich wollen wir das, was wir zeichnen auch sehen. Alles was zu nah ist wird durch die '''Near-[[Clipping Plane]]''' abgeschnitten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:GlShadeModel_SMOOTH.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' [[glBegin]]/[[glEnd]] kapseln die eigentlichen Zeichenbefehle. Diese sorgen hier für ein '''hübsches buntes Viereck'''. Das soll für den ersten Test ausreichen. Wichtig ist in dem Zusammenhang noch folgendes: OpenGL ist es egal woher ein Befehl kommt. Alles wird ausgewertet und landet unter Umständen im Framebuffer. Ihr könnt also ein Unterprogramm, welches ein Unterprogramm, welches ... ..., welches die OpenGL Befehle enthält schreiben. Das interessiert OpenGL bzw. die Grafikkarte überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 21:''' [[SwapBuffers]] sorgt dafür, dass der Inhalt des [[Framebuffer]]s auf dem &lt;br /&gt;
Bildschirm erscheint. Ohne diesen Befehl seht Ihr gar nichts von OpenGL. (Interessanter Artikel dazu: [[Doppelpufferung]])&lt;br /&gt;
&lt;br /&gt;
So... ganz toll. Jetzt habt Ihr Eure Zeichenfunktion... und nun? Irgendwie müsst Ihr diese auch aufrufen. Das wäre aber zu einfach. Die Ausgabe ändert sich ja normalerweise (z.&amp;amp;nbsp;B. in Spielen). Deshalb muss die Zeichenfunktion immer wieder ausgegeben werden. Dazu gibt es zwei Möglichkeiten, die beide Ihre Vor- und Nachteile haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Argument&lt;br /&gt;
!Timer&lt;br /&gt;
!OnIdle&lt;br /&gt;
|-&lt;br /&gt;
|Maximale Framezahl erreichbar &amp;lt;br&amp;gt;&amp;quot;Benchmark&amp;quot;&lt;br /&gt;
|nein&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Framezahl steuerbar&lt;br /&gt;
|ja&lt;br /&gt;
|bedingt (/umständlich)&lt;br /&gt;
|-&lt;br /&gt;
|Für flüssige Animationen nutzbar&amp;lt;br&amp;gt;(Egoshooter)&lt;br /&gt;
|bedingt/schlecht&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für Menüs nutzbar&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für einfache Animationen nutzbar&amp;lt;br&amp;gt;(Strategiespiele)&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Laptopfreundlich (Anti-Akku-Killer)&lt;br /&gt;
|ja&lt;br /&gt;
|NEIN!&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer einfache Anwendungen schreiben möchte, die auch mit 25 FpS (Bilder Pro Sekunde) auskommen und den Akku von Laptopusern schonen will, sollte die Timervariante nutzen. Wer die Potenziale der Grafikkarten voll ausnutzen möchte sollte OnIdle verwenden.&lt;br /&gt;
&lt;br /&gt;
====Methode 1: Timer====&lt;br /&gt;
Bei dieser Methode muss ein Timer (zu finden bei den Systemkomponenten) auf das Formular gezogen werden. Der Timer besitzt eine Eigenschaft names &amp;quot;Interval&amp;quot;. Mit dieser Eigenschaft kann man einstellen  nach wie vielen Millisekunden das Ereignis OnTimer ausgelöst wird. Man kann &amp;quot;Interval&amp;quot; nicht beliebig verkleinern. Werte unter 25 können vom Standardtimer den Windows verwendet nicht mehr korrekt erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt von OnTimer könnte dieser sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
   inc(FrameCount);&lt;br /&gt;
   Render;&lt;br /&gt;
   If FrameCount = 20 then&lt;br /&gt;
      begin&lt;br /&gt;
           ErrorHandler;&lt;br /&gt;
           FrameCount := 0;&lt;br /&gt;
      end;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tiefgreifende Erklärungen sind hier nicht notwendig. Was der ErrorHandler ist wird nach der Methode 2 erklärt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Methode 2: OnIdle====&lt;br /&gt;
&lt;br /&gt;
OnIdle ist ein besonderes Ereignis, welches das gesamte Programm betrifft. Wenn die Anwendung nichts zu tun hat, also faul ist (engl. idle), tritt das Ereignis ein.&lt;br /&gt;
&lt;br /&gt;
Die Methode mit OnIdle kann gleich mit zum Auswerten der Framezahlen (Anzahl Bildwiederholungen pro Sekunde) benutzt werden (Framecounter). Der nachfolgende Code enthält selbigen bereits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
begin&lt;br /&gt;
  StartTime:= GetTickCount;&lt;br /&gt;
  Render;&lt;br /&gt;
  DrawTime:= GetTickCount - StartTime;&lt;br /&gt;
  Inc(TimeCount, DrawTime);&lt;br /&gt;
  Inc(FrameCount);&lt;br /&gt;
&lt;br /&gt;
  if TimeCount &amp;gt;= 1000 then begin&lt;br /&gt;
    Frames:= FrameCount;&lt;br /&gt;
    TimeCount:= TimeCount - 1000;&lt;br /&gt;
    FrameCount:= 0;&lt;br /&gt;
    Caption:= InttoStr(Frames) + 'FPS';&lt;br /&gt;
    ErrorHandler;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  Done:= false;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Mittels GetTickCount wird die Systemzeit gemessen. Dies ist nicht nötig um &lt;br /&gt;
erfolgreich zu zeichnen, sondern dient ausschließlich der Berechnung der Framerate. Diese wiederum ist ein guter Performancemesser.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Hier erfolgt der Aufruf unserer Zeichenroutine.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 9:''' Der hier angeordnete Block wird nur pro Sekunde einmal ausgeführt und sorgt &lt;br /&gt;
dafür, dass die Framerate angezeigt wird. Außerdem wird der Errorhandler aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' Der Errorhandler wird im Anschluß beschrieben.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 17:''' Wenn ''Done'' nach der Ausführung ''false'' ist und das Programm wieder nichts zu tun &lt;br /&gt;
hat, wird OnIdle erneut ausgeführt. Wenn ''Done = true'' ist wird OnIdle nur einmal ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Um auf das &amp;quot;Idle-Event&amp;quot; reagieren zu können, müsst ihr jetzt nur noch diese Funktion an das Event koppeln. Das macht ihr, indem ihr den nachfolgenden Code in die letzte Zeile eurer FormCreate-Methode schreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;Application.OnIdle := IdleHandler;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie ihr bald selbst feststellen werdet, sorgt diese Methode für eine hundertprozentige Prozessorauslastung. Umgehen könnt ihr dies mit einem kleinen Trick:&lt;br /&gt;
&lt;br /&gt;
Fügt vor dem &amp;quot;Done := false&amp;quot; (Zeile 17 des IdleHandlers) noch ein sleep(1) oder sleep(5) ein. Dadurch sinkt die Prozessorlast auf ca. 80%, was schon ein Fortschritt ist.&lt;br /&gt;
&lt;br /&gt;
===Der ErrorHandler - Fehler erkannt, Fehler gebannt===&lt;br /&gt;
Der Errorhandler ist wieder eine total einfache Funktion, denn OpenGL bietet von Haus aus eine Möglichkeit OpenGL-Fehler zu erkennen. Deshalb ist der ErrorHandler auch so klein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.ErrorHandler;&lt;br /&gt;
begin&lt;br /&gt;
  Form1.Caption := gluErrorString(glGetError);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enttäuscht? Ihr könnt den ErrorHandler nach belieben auch komplexer machen. Zum Beispiel könnt Ihr anstatt die Fehler im Fenstertitel anzuzeigen lieber den Fehler in ein Logfile schreiben. Ganz nebenbei: Falls kein Fehler auftritt liefert [[glGetError]] '''GL_NO_ERROR'''.&lt;br /&gt;
&lt;br /&gt;
===Das fertige Templateformular===&lt;br /&gt;
Eure Klasse TForm1 sollte also jetzt so, oder so ähnlich aussehen:&lt;br /&gt;
&amp;lt;pascal&amp;gt;TForm1 = class(TForm)&lt;br /&gt;
    procedure FormCreate(Sender: TObject);&lt;br /&gt;
    procedure IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
    procedure FormResize(Sender: TObject);&lt;br /&gt;
    procedure FormDestroy(Sender: TObject);&lt;br /&gt;
  private    { Private-Deklarationen }&lt;br /&gt;
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter&lt;br /&gt;
    Frames, DrawTime                  : Cardinal; //&amp;amp; Timebased Movement&lt;br /&gt;
    procedure SetupGL;&lt;br /&gt;
    procedure Init;&lt;br /&gt;
    procedure Render;&lt;br /&gt;
    procedure ErrorHandler;&lt;br /&gt;
  public    { Public-Deklarationen }&lt;br /&gt;
    DC                                : HDC;  //Handle auf Zeichenfläche&lt;br /&gt;
    RC                                : HGLRC;//Rendering Context&lt;br /&gt;
  end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Wie man sieht benutzt mein Template die zweite Methode (OnIdle).&lt;br /&gt;
&lt;br /&gt;
'''Zeile 8:''' Was [[Timebased Movement]] ist könnt ihr ja mal nachlesen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14/15:''' HDC und HGLRC sind Typen die von Windows zur Verfügung gestellt werden. Ihr findet sie in der Unit &amp;quot;Windows&amp;quot;. (Diese Unit sollte bei einem neuen Projekt bereits durch Delphi eingebunden worden sein.)&lt;br /&gt;
&lt;br /&gt;
So... fertig. Eigentlich seid Ihr jetzt soweit von den Tutorialschreibern so richtig mit OpenGL-Wissen voll gepumpt zu werden. Das nachfolgende Kapitel könnt Ihr euch trotzdem ruhigen Gewissens durchlesen. Wer es liest tappt vielleicht nicht gleich bei der ersten Frage im DGL-Forum ins berüchtigte Fettnäpfchen.&lt;br /&gt;
&lt;br /&gt;
==Tipps für den OpenGL Anfänger==&lt;br /&gt;
Wenn man mit OpenGL anfängt ist man meist total perplex und ein &amp;quot;Das war ja einfach!&amp;quot; huscht einem nicht nur einmal über die Lippen. Vor allem zu Beginn Eurer OpenGL-Karriere werdet Ihr viel lernen und dabei nur auf verhältnismäßig geringen Widerstand stoßen. Aber glaubt mir es gibt ihn...&lt;br /&gt;
&lt;br /&gt;
Häufig tauchen hoch motivierte OpenGL Anfänger im Forum auf und verkünden stolz, sie würden gerade an einer Engine arbeiten die ''&amp;quot;nur auf Doom 1 Niveau arbeiten soll&amp;quot;''. &lt;br /&gt;
&lt;br /&gt;
Dazu gibt es häufig eine durchaus beachtliche Anzahl von Forenmitgliedern die dann ungefähr folgendes sagen: ''&amp;quot;Fang gar nicht erst damit an. Vergiss es, und komm in einem Jahr noch mal darauf zurück!&amp;quot;'' (Die Forensuche sollte euch einige dieser Threads zeigen)&lt;br /&gt;
&lt;br /&gt;
Sind das böse Pessimisten, die Probleme nutzen um aufzugeben? '''Nein!''' Sie haben zumeist die Erfahrungen gemacht, die Ihr noch machen werdet. Deshalb will ich euch an dieser Stelle einweihen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;1. Je älter der Code ist desto besser wird er.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider nein. Code und Wein unterscheiden sich hier leider grundlegend. Viele... die meisten... eigentlich alle von uns bekommen Ausschlag, wenn sie sich ihren Code von vor 1 Jahr angucken. Erst wenn man so schätzungsweise 3 bis 5 Jahre mit OpenGL gearbeitet hat, hat man ein echtes Gefühl für den Code. Am Anfang hat man nämlich, ob man will oder nicht, die Tendenz schon nach den ersten 3 Wochen Programmierarbeit sich den Code so zu zerschießen, dass die weitere Arbeit keinen Spaß mehr macht.&lt;br /&gt;
&lt;br /&gt;
''Ich selbst wollte jetzt ein Projekt weiterbearbeiten, welches ungefähr ein 3/4 Jahr alt ist... Ich hab den Code weggeworfen und das fast fertige Spiel neu angefangen. (Glaubt mir: Aus solchen Fehlern lernt man!)''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;2. Große Projekte = Großer Ruhm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stimmt! ABER Ruhm gibt es in der Szene nur für beendete Projekte. Und dreimal dürft Ihr raten was durch die im Punkt 1 angesprochenen Probleme meist nicht mit euren Projekten passiert...&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr OpenGL nur zur Visualisierung von z.&amp;amp;nbsp;B. wissenschaftlichen Ergebnissen benutzt, ist die Arbeit im Bezug auf OpenGL sehr übersichtlich. Wenn Ihr allerdings Spiele programmieren wollt, werdet Ihr schnell merken, dass Probleme auf euch zukommen werden, die euch beim Projektstart völlig unbekannt waren. Dies ist ein sicheres Zeichen dafür, dass doch noch etwas mehr Erfahrung nötig sein wird.&lt;br /&gt;
&lt;br /&gt;
'''Und woher soll ich bitte Erfahrung nehmen?'''&lt;br /&gt;
&lt;br /&gt;
Darin liegt der Trick:&lt;br /&gt;
&lt;br /&gt;
Alle OpenGLer haben einmal &amp;quot;klein&amp;quot; angefangen. Berühmt-berüchtigt sind die 3DPong-Clone, die zahlreich im Internet anzufinden sind. Auch Tetris-, Memory- oder &amp;quot;Vier Gewinnt&amp;quot;-Clone sind solche stillen Zeugen eines großen Lernvorgangs. Das Besondere an solchen Spielen ist, dass die Spiellogik relativ einfach ist und euch damit nur wenig von der Visualisierung ablenkt. &lt;br /&gt;
&lt;br /&gt;
Ihr denkt jetzt bestimmt &amp;quot;Was kann man denn schon in so nem Clon unterbringen?&amp;quot; '''VERDAMMT VIEL!''' Hier mal ein kleiner Auszug:&lt;br /&gt;
&lt;br /&gt;
*3D-Spieldarstellung&lt;br /&gt;
*2D Menüführung ([[glOrtho]])&lt;br /&gt;
*[[Blending]] &lt;br /&gt;
*[[Textur]]en &lt;br /&gt;
*Licht und Materialien (Ihr werdet Augen machen!)&lt;br /&gt;
*[[Selektion]] (Hin und wieder zum Haare raufen.)&lt;br /&gt;
*Kamerasteuerung /Bewegung durch die Szene (Da gibt es ganze Tutorials dazu)&lt;br /&gt;
&lt;br /&gt;
Als Ansporn solltet Ihr euch am Anfang ein kleines Ziel setzen und sagen &amp;quot;Ich möchte den besten und schönsten XYZ-Clon im ganzen Internet schaffen!&amp;quot;. So etwas trifft in der Szene auf wesentlich mehr Anerkennung als wenn mal wieder ein Anfänger etwas von Engine und Doom X faselt.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr ein oder zwei solcher Projekte abgeschlossen habt, und regelmäßig im Forum bzw. Wiki gelesen habt werdet Ihr schon merken, wenn Euer Traumprojekt endlich in Angriff genommen werden kann. (Ganz vergessen müsst ihr es nämlich doch nicht ;) )&lt;br /&gt;
&lt;br /&gt;
'''Als kurze Zusammenfassung solltet Ihr euch merken:'''&lt;br /&gt;
&lt;br /&gt;
*Ein fertiges Projekt bringt euch Ruhm (Seelenbalsam).&lt;br /&gt;
*Ein hübsches, fertiges Projekt bringt euch mehr Ruhm.&lt;br /&gt;
*Ein großes, fertiges, hübsches Projekt bringt euch noch mehr Ruhm.&lt;br /&gt;
&lt;br /&gt;
*Ein abgebrochenes oder eingefrorenes Projekt bringt euch Frust.&lt;br /&gt;
*Ein großes, abgebrochenes Projekt bringt euch noch mehr Frust, denn der verschwendeten Zeit werdet Ihr nachtrauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;3.Das es lang dauert ist egal. Ich interessiere mich halt dafür.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Aussage gilt nur dann, wenn Ihr schon über ein Jahr an ein und demselben Projekt gearbeitet habt. Anfänglich ist das kein Problem. Aber wenn man lange an etwas arbeitet und die gemachten Änderungen sind nicht sichtbar (weil sie z.&amp;amp;nbsp;B. den eigentlichen Motor der Anwendung betreffen und nicht die Ausgabe) dann verliert man schon mal die Lust. Folge sind die berüchtigten &amp;quot;Erfolgsmeldungen&amp;quot; wie: &amp;quot;Das Projekt wurde von mir bis auf weiteres aufs Eis gelegt. Ich werde sicherlich später daran weiterarbeiten.&amp;quot; In Verbindung mit Punkt 1 und den letzen Satz aus Punkt 2 sollte euch das Endergebnis klar sein.&lt;br /&gt;
&lt;br /&gt;
==Nachwort==&lt;br /&gt;
&lt;br /&gt;
Soviel zur Euphoriebremse. OpenGL ist toll. OpenGL ist die Lösung für Eure Traumanwendung. Aber die wird auch mit OpenGL nicht von heute auf morgen programmiert. Deshalb heißt es Tutorials lesen kleine Testanwendungen schreiben um Effekte zu testen und Projekte bearbeiten. Dann wird es auch etwas mit den Traumprojekten. Zudem kann man anfangs auch versuchen in sehr kleinen Anwendungen einen Effekt auszuprobieren und diesen in Form eines kleinen Beispielprogramms oder eines Tutorials zu veröffenlichen. Somit lernt man nicht nur selbst etwas dazu...&lt;br /&gt;
&lt;br /&gt;
Nach diesen unglaublich Weise klingenden Worten die ich mit einem hoch ernsten Gesicht geschrieben habe, könnt ihr euch jetzt hochmotiviert an die restlichen Tutorials machen.&lt;br /&gt;
&lt;br /&gt;
Bis bald im [http://delphiGL.com/forum Forum]&lt;br /&gt;
&lt;br /&gt;
'''Euer'''&lt;br /&gt;
&lt;br /&gt;
'''Flash (Kevin Fleischer)'''&lt;br /&gt;
&lt;br /&gt;
PS: Feedback wird nicht nur gewünscht, sondern ausdrücklich gefordert. Deshalb: Ab mit deinen Meinungen und Ratschläge ins [http://www.delphigl.com/forum/viewforum.php?f=8 Feedback-Forum]!&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|-|[[Tutorial_lektion1]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Quickstart]]&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19346</id>
		<title>Tutorial Quickstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19346"/>
				<updated>2006-08-21T16:21:33Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: /* Die Ereignisbehandlung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Quickstart: Delphi &amp;amp; OpenGL=&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Willkommen beim Delphi &amp;amp; OpenGL Quickstart. Diese kurze Einleitung soll euch auf die Tutorials bei DelphiGL.com und allgemein auf die Grafikprogrammierung mit OpenGL und Delphi vorbereiten. Dieser Quickstart ist kein Tutorial für sich, sondern soll ein Grundgefühl vermitteln wie OpenGL und Delphi miteinander arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wozu OpenGL? Mit OpenGL kann man eine Vielzahl von Aufgaben bewältigen. Ob man Forschungsergebnisse aller Art visualisieren, 2D oder 3D Spiele schreiben oder einfach seiner Anwendung eine Oberfläche geben möchte, die nicht dem windowsgrauen Standardlook entspricht. All das ist möglich mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
==Wie fange ich an?==&lt;br /&gt;
Genau zwei Dinge braucht der OpenGL-Programmierer um effektiv  arbeiten zu können:&lt;br /&gt;
#Einen OpenGL Header&lt;br /&gt;
#Eine Codebasis von der aus man neue Projekte starten kann (ein sog. Template)&lt;br /&gt;
&lt;br /&gt;
===Der OpenGL-Header===&lt;br /&gt;
Das is ja easy! Denn Delphi bringt ja schon einen OpenGL-Header mit...&lt;br /&gt;
&lt;br /&gt;
'''STOP!'''&lt;br /&gt;
&lt;br /&gt;
Denn wir reden von einem guten Header. Leider ist der original von Delphi mitgelieferte Header alles andere als zu empfehlen. Er ist fehlerhaft, hält sich nicht an OpenGL-Normen und außerdem ist er absolut veraltet.&lt;br /&gt;
&lt;br /&gt;
Was nun? Ganz einfach: Bei [http://www.DelphiGL.com DelphiGL.com] (kurz DGL) gibt es '''DEN''' OpenGL-Header für alle Pascalsprachen: &lt;br /&gt;
'''Die [[DGLOpenGL.pas]].'''&lt;br /&gt;
&lt;br /&gt;
Diesen solltet Ihr euch jetzt besorgen, wenn Ihr ihn nicht schon habt. Der Header wird bei neuen OpenGL-Versionen vom DGL-Team aktualisiert.&lt;br /&gt;
&lt;br /&gt;
===Codebasis/Templates===&lt;br /&gt;
So... das war schon alles was Ihr aus dem Netz benötigt. Den Rest machen wir jetzt per Hand.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel zeige ich euch wie man sich ein einfaches [[Template]] schreibt. Natürlich hat DelphiGL.com auch bereits [http://www.delphigl.com/download.php?cat=1 fertige Lösungen], die durchaus zu empfehlen sind und auch extra Features wie Vollbildrendering besitzen. ABER aus Erfahrung kann ich sagen: Man findet sich im eigenen Code viel einfacher zurecht. (Und die Extras kann man nachher immer noch einbauen.)&lt;br /&gt;
&lt;br /&gt;
==Das Template - Delphi fit für OpenGL machen==&lt;br /&gt;
Bevor man wirklich loslegen kann, muss noch die runtergeladene DGLOpenGL.pas an den richtigen Ort gebracht werden. Gut wäre z.&amp;amp;nbsp;B., sie in das Verzeichnis &amp;quot;\lib&amp;quot; in Eurem Delphiverzeichnis zu legen. (Wenn ihr den [[DGLSDK]] verwendet wurden die Suchpfade schon eingerichtet.)&lt;br /&gt;
&lt;br /&gt;
Dann startet mal Delphi. Vor euch sollte jetzt ein leeres Projekt erscheinen. Das leere Formular kann gleich minimiert werden, denn jetzt wird erstmal hübsch gecodet.&lt;br /&gt;
&lt;br /&gt;
''(Am Ende von Kapitel 1.3 findet ihr den Kopf der Template-Klasse. Dort seht ihr auch welche Variablen, von welchem Typ deklariert werden müssen. )''&lt;br /&gt;
&lt;br /&gt;
===Initialisieren von OpenGL===&lt;br /&gt;
Dieser Teil ließ früher dem OpenGL Anfänger die Haare nicht nur zu Berge stehen, sondern gleich ausfallen. Dank der DGLOpenGL.pas wurde das aber um Längen einfacher. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal solltet Ihr die DGLOpenGL.pas in die '''uses'''-Klausel des '''interface'''-Teils der Unit1 schreiben.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung soll direkt beim Erstellen des Formulars gemacht werden. Deshalb kommt der folgende Quelltext ins OnCreate-Ereignis des Formulars.&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DC:= GetDC(Handle);&lt;br /&gt;
  if not InitOpenGL then Application.Terminate;&lt;br /&gt;
  RC:= CreateRenderingContext( DC,&lt;br /&gt;
                               [opDoubleBuffered],&lt;br /&gt;
                               32,&lt;br /&gt;
                               24,&lt;br /&gt;
                               0,0,0,&lt;br /&gt;
                               0);&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
'''Zeile 3:''' Hier wird der Gerätekontext (Device Context) von Formular Form1 abgefragt.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mit InitOpenGL wird OpenGL initialisiert. Wenn das nicht funktioniert wird die gesamte Anwendung sofort beendet. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 5:''' Hier wird der [[Renderkontext]] erzeugt. Den braucht OpenGL zum Zeichnen auf das Formular. Was die Parameter genau bewirken lernt ihr im [[Tutorial_lektion1]].&lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Abschließend wird der Renderkontext aktiviert. OpenGL ist jetzt prinzipiell startbereit.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|DC und RC sind Eigenschaften des Formulars. Siehe [[Tutorial_quickstart#Das_fertige_Templateformular|Definition des Templateformulars]].}}&lt;br /&gt;
&lt;br /&gt;
Nach dieser durchaus simplen Initialisierung (man kann auch alles per Hand machen was InitOpenGL macht!) steht OpenGL ziemlich nackt da. Soll heißen, alle OpenGL Eigenschaften/Zustände stehen auf den definierten Anfangswerten. Es kommt aber durchaus oft - eigentlich ständig - vor, dass bestimmte Einstellungen von OpenGL benutzt werden sollen. Deshalb schreiben wir uns noch eine kleine Zusatzprozedur: SetupOpenGL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.SetupGL;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe&lt;br /&gt;
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren&lt;br /&gt;
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was hier passiert wird durch die Kommentare bereits erklärt (Für mehr Infos siehe [[Tiefentest]] bzw. [[Backface Culling]]). Die Hintergrundfarbe könnt ihr nach Belieben einstellen. (Wenn ihr später einmal geschlossene Szenen rendern wollt, dann ist es günstig eine sehr schräge Farbe als Hintergrundfarbe einzustellen, so findet man leichter Fehler in der Szene.)&lt;br /&gt;
&lt;br /&gt;
Außerdem hat man ja hin und wieder auch noch globale Variablen, die man initialisieren möchte. Da wir mit solchen Sachen unser schön aufgeräumtes '''FormCreate''' nicht zumüllen wollen bietet sich ein Unterprogramm namens '''InitGlobals''' oder kurz '''Init''' an.&lt;br /&gt;
Beide Unterprogramme (SetupGL und Init) sollten am Ende von '''FormCreate''' gerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  [...]&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
  SetupGL;&lt;br /&gt;
  Init;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Die Ereignisbehandlung===&lt;br /&gt;
Für OpenGL sind vor allem die Ereignisse von Bedeutung, die an der Zeichenfläche von OpenGL herumwerkeln. Da OpenGL direkt auf das Formular (oder auch auf ein Panel) zeichnet, müssen Ereignisse, die diese Zeichenfläche ändern, behandelt werden. Dies wären das '''OnResize-''' und das '''OnDestroy'''-Ereignis.&lt;br /&gt;
&lt;br /&gt;
Zuerst '''FormResize''':&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormResize(Sender: TObject);&lt;br /&gt;
var tmpBool : Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  glViewport(0, 0, ClientWidth, ClientHeight);&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);    &lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  IdleHandler(Sender, tmpBool);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen im '''const''' Teil die beiden Konstanten Near- bzw. FarClipping definiert werden. Diese geben die Entfernung für die [[Clipping Plane|Clippingebenen]] (Szenenbegrenzung) an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  NearClipping = 1;&lt;br /&gt;
  FarClipping  = 1000;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zu FormResize''':&lt;br /&gt;
&lt;br /&gt;
'''Zeile 2:''' Diese Boolean-Variable wird in Zeile 11 verwendet und ist nur ein Dummy.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mittels [[glViewport]] sagt Ihr OpenGL, wie groß die OpenGL-Ausgabe werden soll. Genau diese Größe hatte sich ja durch das Resize verändert.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 5/9:''' Hier seht Ihr 2 der 3 möglichen Matrixmodi. '''GL_PROJECTION''' wird benutzt um nachfolgend die OpenGL-Ausgabe zu manipulieren, '''GL_MODELVIEW''' benutzt man um OpenGL mit Daten zu füttern.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 6:''' [[glLoadIdentity]] füllt die aktuelle Matrix mit der Identitätsmatrix. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird eingestellt wie der Betrachter die Welt sehen soll. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Was der IdleHandler macht kommt später im Abschnitt 1.3.3 (Zeichenroutine).&lt;br /&gt;
&lt;br /&gt;
Nun noch schnell das '''FormDestroy''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DeactivateRenderingContext;&lt;br /&gt;
  DestroyRenderingContext(RC);&lt;br /&gt;
  ReleaseDC(Handle, DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was es macht? Steht doch da: Den RenderingContext deaktivieren und freigeben.&lt;br /&gt;
&lt;br /&gt;
===Die Zeichenroutine===&lt;br /&gt;
Das Herzstück unseres Templates fehlte bisher. Irgendwann muss der Grafikkarte ja auch gesagt werden, was sie denn überhaupt ausgeben soll. Das kommt jetzt: '''TForm1.Render'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Render;&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
&lt;br /&gt;
  glTranslatef(0, 0, -5);&lt;br /&gt;
&lt;br /&gt;
  glBegin(GL_QUADS);&lt;br /&gt;
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);&lt;br /&gt;
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);&lt;br /&gt;
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);&lt;br /&gt;
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);&lt;br /&gt;
  glEnd;&lt;br /&gt;
&lt;br /&gt;
  SwapBuffers(DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Dieser Aufruf sorgt dafür, dass der [[Farbpuffer]] und [[Tiefenpuffer]] gelöscht werden. Wenn man das nicht macht, sieht man alles mögliche, nur nicht das was Ihr rendern wollt. Probiert es ruhig mal ohne aus! Man wird dadurch nicht dümmer.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird wieder die Perspektive gesetzt. Dieser Aufruf und der bei '''FormResize''' &lt;br /&gt;
müssen von den Parametern identisch sein. Sonst sieht die Ausgabe nach einem Resize kurz anders aus. &lt;br /&gt;
Wenn sich die Perspektive zwischen den Renderdurchgängen nicht ändert kann das auch weg gelassen werden.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 12:''' Dieser Aufruf verschiebt die &amp;quot;Kamera&amp;quot; (so etwas gibt es eigentlich nicht, aber das nur am Rande. Mehr zu diesem Thema gibts im [[Tutorial Matrix2]]) etwas nach hinten. Schließlich wollen wir das, was wir zeichnen auch sehen. Alles was zu nah ist wird durch die '''Near-[[Clipping Plane]]''' abgeschnitten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:GlShadeModel_SMOOTH.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' [[glBegin]]/[[glEnd]] kapseln die eigentlichen Zeichenbefehle. Diese sorgen hier für ein '''hübsches buntes Viereck'''. Das soll für den ersten Test ausreichen. Wichtig ist in dem Zusammenhang noch folgendes: OpenGL ist es egal woher ein Befehl kommt. Alles wird ausgewertet und landet unter Umständen im Framebuffer. Ihr könnt also ein Unterprogramm, welches ein Unterprogramm, welches ... ..., welches die OpenGL Befehle enthält schreiben. Das interessiert OpenGL bzw. die Grafikkarte überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 21:''' [[SwapBuffers]] sorgt dafür, dass der Inhalt des [[Framebuffer]]s auf dem &lt;br /&gt;
Bildschirm erscheint. Ohne diesen Befehl seht Ihr gar nichts von OpenGL. (Interessanter Artikel dazu: [[Doppelpufferung]])&lt;br /&gt;
&lt;br /&gt;
So... ganz toll. Jetzt habt Ihr Eure Zeichenfunktion... und nun? Irgendwie müsst Ihr diese auch aufrufen. Das wäre aber zu einfach. Die Ausgabe ändert sich ja normalerweise (z.&amp;amp;nbsp;B. in Spielen). Deshalb muss die Zeichenfunktion immer wieder ausgegeben werden. Dazu gibt es zwei Möglichkeiten, die beide Ihre Vor- und Nachteile haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Argument&lt;br /&gt;
!Timer&lt;br /&gt;
!OnIdle&lt;br /&gt;
|-&lt;br /&gt;
|Maximale Framezahl erreichbar &amp;lt;br&amp;gt;&amp;quot;Benchmark&amp;quot;&lt;br /&gt;
|nein&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Framezahl steuerbar&lt;br /&gt;
|ja&lt;br /&gt;
|bedingt (/umständlich)&lt;br /&gt;
|-&lt;br /&gt;
|Für flüssige Animationen nutzbar&amp;lt;br&amp;gt;(Egoshooter)&lt;br /&gt;
|bedingt/schlecht&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für Menüs nutzbar&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für einfache Animationen nutzbar&amp;lt;br&amp;gt;(Strategiespiele)&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Laptopfreundlich (Anti-Akku-Killer)&lt;br /&gt;
|ja&lt;br /&gt;
|NEIN!&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer einfache Anwendungen schreiben möchte, die auch mit 25 FpS (Bilder Pro Sekunde) auskommen und den Akku von Laptopusern schonen will, sollte die Timervariante nutzen. Wer die Potenziale der Grafikkarten voll ausnutzen möchte sollte OnIdle verwenden.&lt;br /&gt;
&lt;br /&gt;
====Methode 1: Timer====&lt;br /&gt;
Bei dieser Methode muss ein Timer (zu finden bei den Systemkomponenten) auf das Formular gezogen werden. Der Timer besitzt eine Eigenschaft names &amp;quot;Interval&amp;quot;. Mit dieser Eigenschaft kann man einstellen  nach wie vielen Millisekunden das Ereignis OnTimer ausgelöst wird. Man kann &amp;quot;Interval&amp;quot; nicht beliebig verkleinern. Werte unter 25 können vom Standardtimer den Windows verwendet nicht mehr korrekt erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt von OnTimer könnte dieser sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
   inc(FrameCount);&lt;br /&gt;
   Render;&lt;br /&gt;
   If FrameCount = 20 then&lt;br /&gt;
      begin&lt;br /&gt;
           ErrorHandler;&lt;br /&gt;
           FrameCount := 0;&lt;br /&gt;
      end;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tiefgreifende Erklärungen sind hier nicht notwendig. Was der ErrorHandler ist wird nach der Methode 2 erklärt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Methode 2: OnIdle====&lt;br /&gt;
&lt;br /&gt;
OnIdle ist ein besonderes Ereignis, welches das gesamte Programm betrifft. Wenn die Anwendung nichts zu tun hat, also faul ist (engl. idle), tritt das Ereignis ein.&lt;br /&gt;
&lt;br /&gt;
Die Methode mit OnIdle kann gleich mit zum Auswerten der Framezahlen (Anzahl Bildwiederholungen pro Sekunde) benutzt werden (Framecounter). Der nachfolgende Code enthält selbigen bereits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
begin&lt;br /&gt;
  StartTime:= GetTickCount;&lt;br /&gt;
  Render;&lt;br /&gt;
  DrawTime:= GetTickCount - StartTime;&lt;br /&gt;
  Inc(TimeCount, DrawTime);&lt;br /&gt;
  Inc(FrameCount);&lt;br /&gt;
&lt;br /&gt;
  if TimeCount &amp;gt;= 1000 then begin&lt;br /&gt;
    Frames:= FrameCount;&lt;br /&gt;
    TimeCount:= TimeCount - 1000;&lt;br /&gt;
    FrameCount:= 0;&lt;br /&gt;
    Caption:= InttoStr(Frames) + 'FPS';&lt;br /&gt;
    ErrorHandler;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  Done:= false;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Mittels GetTickCount wird die Systemzeit gemessen. Dies ist nicht nötig um &lt;br /&gt;
erfolgreich zu zeichnen, sondern dient ausschließlich der Berechnung der Framerate. Diese wiederum ist ein guter Performancemesser.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Hier erfolgt der Aufruf unserer Zeichenroutine.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 9:''' Der hier angeordnete Block wird nur pro Sekunde einmal ausgeführt und sorgt &lt;br /&gt;
dafür, dass die Framerate angezeigt wird. Außerdem wird der Errorhandler aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' Der Errorhandler wird im Anschluß beschrieben.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 17:''' Wenn ''Done'' nach der Ausführung ''false'' ist und das Programm wieder nichts zu tun &lt;br /&gt;
hat, wird OnIdle erneut ausgeführt. Wenn ''Done = true'' ist wird OnIdle nur einmal ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Um auf das &amp;quot;Idle-Event&amp;quot; reagieren zu können, müsst ihr jetzt nur noch diese Funktion an das Event koppeln. Das macht ihr, indem ihr den nachfolgenden Code in die letzte Zeile eurer FormCreate-Methode schreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;Application.OnIdle := IdleHandler;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie ihr bald selbst feststellen werdet, sorgt diese Methode für eine hundertprozentige Prozessorauslastung. Umgehen könnt ihr dies mit einem kleinen Trick:&lt;br /&gt;
&lt;br /&gt;
Fügt vor dem &amp;quot;Done := false&amp;quot; (Zeile 17 des IdleHandlers) noch ein sleep(1) oder sleep(5) ein. Dadurch sinkt die Prozessorlast auf ca. 80%, was schon ein Fortschritt ist.&lt;br /&gt;
&lt;br /&gt;
===Der ErrorHandler - Fehler erkannt, Fehler gebannt===&lt;br /&gt;
Der Errorhandler ist wieder eine total einfache Funktion, denn OpenGL bietet von Haus aus eine Möglichkeit OpenGL-Fehler zu erkennen. Deshalb ist der ErrorHandler auch so klein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.ErrorHandler;&lt;br /&gt;
begin&lt;br /&gt;
  Form1.Caption := gluErrorString(glGetError);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enttäuscht? Ihr könnt den ErrorHandler nach belieben auch komplexer machen. Zum Beispiel könnt Ihr anstatt die Fehler im Fenstertitel anzuzeigen lieber den Fehler in ein Logfile schreiben. Ganz nebenbei: Falls kein Fehler auftritt liefert [[glGetError]] '''GL_NO_ERROR'''.&lt;br /&gt;
&lt;br /&gt;
===Das fertige Templateformular===&lt;br /&gt;
Eure Klasse TForm1 sollte also jetzt so, oder so ähnlich aussehen:&lt;br /&gt;
&amp;lt;pascal&amp;gt;TForm1 = class(TForm)&lt;br /&gt;
    procedure FormCreate(Sender: TObject);&lt;br /&gt;
    procedure IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
    procedure FormResize(Sender: TObject);&lt;br /&gt;
    procedure FormDestroy(Sender: TObject);&lt;br /&gt;
  private    { Private-Deklarationen }&lt;br /&gt;
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter&lt;br /&gt;
    Frames, DrawTime                  : Cardinal; //&amp;amp; Timebased Movement&lt;br /&gt;
    procedure SetupGL;&lt;br /&gt;
    procedure Init;&lt;br /&gt;
    procedure Render;&lt;br /&gt;
    procedure ErrorHandler;&lt;br /&gt;
  public    { Public-Deklarationen }&lt;br /&gt;
    DC                                : HDC;  //Handle auf Zeichenfläche&lt;br /&gt;
    RC                                : HGLRC;//Rendering Context&lt;br /&gt;
  end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Wie man sieht benutzt mein Template die zweite Methode (OnIdle).&lt;br /&gt;
&lt;br /&gt;
'''Zeile 8:''' Was [[Timebased Movement]] ist könnt ihr ja mal nachlesen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14/15:''' HDC und HGLRC sind Typen die von Windows zur Verfügung gestellt werden. Ihr findet sie in der Unit &amp;quot;Windows&amp;quot;. (Diese Unit sollte bei einem neuen Projekt bereits durch Delphi eingebunden worden sein.)&lt;br /&gt;
&lt;br /&gt;
So... fertig. Eigentlich seid Ihr jetzt soweit von den Tutorialschreibern so richtig mit OpenGL-Wissen voll gepumpt zu werden. Das nachfolgende Kapitel könnt Ihr euch trotzdem ruhigen Gewissens durchlesen. Wer es liest tappt vielleicht nicht gleich bei der ersten Frage im DGL-Forum ins berüchtigte Fettnäpfchen.&lt;br /&gt;
&lt;br /&gt;
==Tipps für den OpenGL Anfänger==&lt;br /&gt;
Wenn man mit OpenGL anfängt ist man meist total perplex und ein &amp;quot;Das war ja einfach!&amp;quot; huscht einem nicht nur einmal über die Lippen. Vor allem zu Beginn Eurer OpenGL-Karriere werdet Ihr viel lernen und dabei nur auf verhältnismäßig geringen Widerstand stoßen. Aber glaubt mir es gibt ihn...&lt;br /&gt;
&lt;br /&gt;
Häufig tauchen hoch motivierte OpenGL Anfänger im Forum auf und verkünden stolz, sie würden gerade an einer Engine arbeiten die ''&amp;quot;nur auf Doom 1 Niveau arbeiten soll&amp;quot;''. &lt;br /&gt;
&lt;br /&gt;
Dazu gibt es häufig eine durchaus beachtliche Anzahl von Forenmitgliedern die dann ungefähr folgendes sagen: ''&amp;quot;Fang gar nicht erst damit an. Vergiss es, und komm in einem Jahr noch mal darauf zurück!&amp;quot;'' (Die Forensuche sollte euch einige dieser Threads zeigen)&lt;br /&gt;
&lt;br /&gt;
Sind das böse Pessimisten, die Probleme nutzen um aufzugeben? '''Nein!''' Sie haben zumeist die Erfahrungen gemacht, die Ihr noch machen werdet. Deshalb will ich euch an dieser Stelle einweihen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;1. Je älter der Code ist desto besser wird er.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider nein. Code und Wein unterscheiden sich hier leider grundlegend. Viele... die meisten... eigentlich alle von uns bekommen Ausschlag, wenn sie sich ihren Code von vor 1 Jahr angucken. Erst wenn man so schätzungsweise 3 bis 5 Jahre mit OpenGL gearbeitet hat, hat man ein echtes Gefühl für den Code. Am Anfang hat man nämlich, ob man will oder nicht, die Tendenz schon nach den ersten 3 Wochen Programmierarbeit sich den Code so zu zerschießen, dass die weitere Arbeit keinen Spaß mehr macht.&lt;br /&gt;
&lt;br /&gt;
''Ich selbst wollte jetzt ein Projekt weiterbearbeiten, welches ungefähr ein 3/4 Jahr alt ist... Ich hab den Code weggeworfen und das fast fertige Spiel neu angefangen. (Glaubt mir: Aus solchen Fehlern lernt man!)''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;2. Große Projekte = Großer Ruhm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stimmt! ABER Ruhm gibt es in der Szene nur für beendete Projekte. Und dreimal dürft Ihr raten was durch die im Punkt 1 angesprochenen Probleme meist nicht mit euren Projekten passiert...&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr OpenGL nur zur Visualisierung von z.&amp;amp;nbsp;B. wissenschaftlichen Ergebnissen benutzt, ist die Arbeit im Bezug auf OpenGL sehr übersichtlich. Wenn Ihr allerdings Spiele programmieren wollt, werdet Ihr schnell merken, dass Probleme auf euch zukommen werden, die euch beim Projektstart völlig unbekannt waren. Dies ist ein sicheres Zeichen dafür, dass doch noch etwas mehr Erfahrung nötig sein wird.&lt;br /&gt;
&lt;br /&gt;
'''Und woher soll ich bitte Erfahrung nehmen?'''&lt;br /&gt;
&lt;br /&gt;
Darin liegt der Trick:&lt;br /&gt;
&lt;br /&gt;
Alle OpenGLer haben einmal &amp;quot;klein&amp;quot; angefangen. Berühmt-berüchtigt sind die 3DPong-Clone, die zahlreich im Internet anzufinden sind. Auch Tetris-, Memory- oder &amp;quot;Vier Gewinnt&amp;quot;-Clone sind solche stillen Zeugen eines großen Lernvorgangs. Das Besondere an solchen Spielen ist, dass die Spiellogik relativ einfach ist und euch damit nur wenig von der Visualisierung ablenkt. &lt;br /&gt;
&lt;br /&gt;
Ihr denkt jetzt bestimmt &amp;quot;Was kann man denn schon in so nem Clon unterbringen?&amp;quot; '''VERDAMMT VIEL!''' Hier mal ein kleiner Auszug:&lt;br /&gt;
&lt;br /&gt;
*3D-Spieldarstellung&lt;br /&gt;
*2D Menüführung ([[glOrtho]])&lt;br /&gt;
*[[Blending]] &lt;br /&gt;
*[[Textur]]en &lt;br /&gt;
*Licht und Materialien (Ihr werdet Augen machen!)&lt;br /&gt;
*[[Selektion]] (Hin und wieder zum Haare raufen.)&lt;br /&gt;
*Kamerasteuerung /Bewegung durch die Szene (Da gibt es ganze Tutorials dazu)&lt;br /&gt;
&lt;br /&gt;
Als Ansporn solltet Ihr euch am Anfang ein kleines Ziel setzen und sagen &amp;quot;Ich möchte den besten und schönsten XYZ-Clon im ganzen Internet schaffen!&amp;quot;. So etwas trifft in der Szene auf wesentlich mehr Anerkennung als wenn mal wieder ein Anfänger etwas von Engine und Doom X faselt.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr ein oder zwei solcher Projekte abgeschlossen habt, und regelmäßig im Forum bzw. Wiki gelesen habt werdet Ihr schon merken, wenn Euer Traumprojekt endlich in Angriff genommen werden kann. (Ganz vergessen müsst ihr es nämlich doch nicht ;) )&lt;br /&gt;
&lt;br /&gt;
'''Als kurze Zusammenfassung solltet Ihr euch merken:'''&lt;br /&gt;
&lt;br /&gt;
*Ein fertiges Projekt bringt euch Ruhm (Seelenbalsam).&lt;br /&gt;
*Ein hübsches, fertiges Projekt bringt euch mehr Ruhm.&lt;br /&gt;
*Ein großes, fertiges, hübsches Projekt bringt euch noch mehr Ruhm.&lt;br /&gt;
&lt;br /&gt;
*Ein abgebrochenes oder eingefrorenes Projekt bringt euch Frust.&lt;br /&gt;
*Ein großes, abgebrochenes Projekt bringt euch noch mehr Frust, denn der verschwendeten Zeit werdet Ihr nachtrauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;3.Das es lang dauert ist egal. Ich interessiere mich halt dafür.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Aussage gilt nur dann, wenn Ihr schon über ein Jahr an ein und demselben Projekt gearbeitet habt. Anfänglich ist das kein Problem. Aber wenn man lange an etwas arbeitet und die gemachten Änderungen sind nicht sichtbar (weil sie z.&amp;amp;nbsp;B. den eigentlichen Motor der Anwendung betreffen und nicht die Ausgabe) dann verliert man schon mal die Lust. Folge sind die berüchtigten &amp;quot;Erfolgsmeldungen&amp;quot; wie: &amp;quot;Das Projekt wurde von mir bis auf weiteres aufs Eis gelegt. Ich werde sicherlich später daran weiterarbeiten.&amp;quot; In Verbindung mit Punkt 1 und den letzen Satz aus Punkt 2 sollte euch das Endergebnis klar sein.&lt;br /&gt;
&lt;br /&gt;
==Nachwort==&lt;br /&gt;
&lt;br /&gt;
Soviel zur Euphoriebremse. OpenGL ist toll. OpenGL ist die Lösung für Eure Traumanwendung. Aber die wird auch mit OpenGL nicht von heute auf morgen programmiert. Deshalb heißt es Tutorials lesen kleine Testanwendungen schreiben um Effekte zu testen und Projekte bearbeiten. Dann wird es auch etwas mit den Traumprojekten. Zudem kann man anfangs auch versuchen in sehr kleinen Anwendungen einen Effekt auszuprobieren und diesen in Form eines kleinen Beispielprogramms oder eines Tutorials zu veröffenlichen. Somit lernt man nicht nur selbst etwas dazu...&lt;br /&gt;
&lt;br /&gt;
Nach diesen unglaublich Weise klingenden Worten die ich mit einem hoch ernsten Gesicht geschrieben habe, könnt ihr euch jetzt hochmotiviert an die restlichen Tutorials machen.&lt;br /&gt;
&lt;br /&gt;
Bis bald im [http://delphiGL.com/forum Forum]&lt;br /&gt;
&lt;br /&gt;
'''Euer'''&lt;br /&gt;
&lt;br /&gt;
'''Flash (Kevin Fleischer)'''&lt;br /&gt;
&lt;br /&gt;
PS: Feedback wird nicht nur gewünscht, sondern ausdrücklich gefordert. Deshalb: Ab mit deinen Meinungen und Ratschläge ins [http://www.delphigl.com/forum/viewforum.php?f=8 Feedback-Forum]!&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|-|[[Tutorial_lektion1]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Quickstart]]&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19345</id>
		<title>Tutorial Quickstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Quickstart&amp;diff=19345"/>
				<updated>2006-08-21T16:18:49Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: /* Das Template - Delphi fit für OpenGL machen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Quickstart: Delphi &amp;amp; OpenGL=&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Willkommen beim Delphi &amp;amp; OpenGL Quickstart. Diese kurze Einleitung soll euch auf die Tutorials bei DelphiGL.com und allgemein auf die Grafikprogrammierung mit OpenGL und Delphi vorbereiten. Dieser Quickstart ist kein Tutorial für sich, sondern soll ein Grundgefühl vermitteln wie OpenGL und Delphi miteinander arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wozu OpenGL? Mit OpenGL kann man eine Vielzahl von Aufgaben bewältigen. Ob man Forschungsergebnisse aller Art visualisieren, 2D oder 3D Spiele schreiben oder einfach seiner Anwendung eine Oberfläche geben möchte, die nicht dem windowsgrauen Standardlook entspricht. All das ist möglich mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
==Wie fange ich an?==&lt;br /&gt;
Genau zwei Dinge braucht der OpenGL-Programmierer um effektiv  arbeiten zu können:&lt;br /&gt;
#Einen OpenGL Header&lt;br /&gt;
#Eine Codebasis von der aus man neue Projekte starten kann (ein sog. Template)&lt;br /&gt;
&lt;br /&gt;
===Der OpenGL-Header===&lt;br /&gt;
Das is ja easy! Denn Delphi bringt ja schon einen OpenGL-Header mit...&lt;br /&gt;
&lt;br /&gt;
'''STOP!'''&lt;br /&gt;
&lt;br /&gt;
Denn wir reden von einem guten Header. Leider ist der original von Delphi mitgelieferte Header alles andere als zu empfehlen. Er ist fehlerhaft, hält sich nicht an OpenGL-Normen und außerdem ist er absolut veraltet.&lt;br /&gt;
&lt;br /&gt;
Was nun? Ganz einfach: Bei [http://www.DelphiGL.com DelphiGL.com] (kurz DGL) gibt es '''DEN''' OpenGL-Header für alle Pascalsprachen: &lt;br /&gt;
'''Die [[DGLOpenGL.pas]].'''&lt;br /&gt;
&lt;br /&gt;
Diesen solltet Ihr euch jetzt besorgen, wenn Ihr ihn nicht schon habt. Der Header wird bei neuen OpenGL-Versionen vom DGL-Team aktualisiert.&lt;br /&gt;
&lt;br /&gt;
===Codebasis/Templates===&lt;br /&gt;
So... das war schon alles was Ihr aus dem Netz benötigt. Den Rest machen wir jetzt per Hand.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel zeige ich euch wie man sich ein einfaches [[Template]] schreibt. Natürlich hat DelphiGL.com auch bereits [http://www.delphigl.com/download.php?cat=1 fertige Lösungen], die durchaus zu empfehlen sind und auch extra Features wie Vollbildrendering besitzen. ABER aus Erfahrung kann ich sagen: Man findet sich im eigenen Code viel einfacher zurecht. (Und die Extras kann man nachher immer noch einbauen.)&lt;br /&gt;
&lt;br /&gt;
==Das Template - Delphi fit für OpenGL machen==&lt;br /&gt;
Bevor man wirklich loslegen kann, muss noch die runtergeladene DGLOpenGL.pas an den richtigen Ort gebracht werden. Gut wäre z.&amp;amp;nbsp;B., sie in das Verzeichnis &amp;quot;\lib&amp;quot; in Eurem Delphiverzeichnis zu legen. (Wenn ihr den [[DGLSDK]] verwendet wurden die Suchpfade schon eingerichtet.)&lt;br /&gt;
&lt;br /&gt;
Dann startet mal Delphi. Vor euch sollte jetzt ein leeres Projekt erscheinen. Das leere Formular kann gleich minimiert werden, denn jetzt wird erstmal hübsch gecodet.&lt;br /&gt;
&lt;br /&gt;
''(Am Ende von Kapitel 1.3 findet ihr den Kopf der Template-Klasse. Dort seht ihr auch welche Variablen, von welchem Typ deklariert werden müssen. )''&lt;br /&gt;
&lt;br /&gt;
===Initialisieren von OpenGL===&lt;br /&gt;
Dieser Teil ließ früher dem OpenGL Anfänger die Haare nicht nur zu Berge stehen, sondern gleich ausfallen. Dank der DGLOpenGL.pas wurde das aber um Längen einfacher. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal solltet Ihr die DGLOpenGL.pas in die '''uses'''-Klausel des '''interface'''-Teils der Unit1 schreiben.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung soll direkt beim Erstellen des Formulars gemacht werden. Deshalb kommt der folgende Quelltext ins OnCreate-Ereignis des Formulars.&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DC:= GetDC(Handle);&lt;br /&gt;
  if not InitOpenGL then Application.Terminate;&lt;br /&gt;
  RC:= CreateRenderingContext( DC,&lt;br /&gt;
                               [opDoubleBuffered],&lt;br /&gt;
                               32,&lt;br /&gt;
                               24,&lt;br /&gt;
                               0,0,0,&lt;br /&gt;
                               0);&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
'''Zeile 3:''' Hier wird der Gerätekontext (Device Context) von Formular Form1 abgefragt.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mit InitOpenGL wird OpenGL initialisiert. Wenn das nicht funktioniert wird die gesamte Anwendung sofort beendet. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 5:''' Hier wird der [[Renderkontext]] erzeugt. Den braucht OpenGL zum Zeichnen auf das Formular. Was die Parameter genau bewirken lernt ihr im [[Tutorial_lektion1]].&lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Abschließend wird der Renderkontext aktiviert. OpenGL ist jetzt prinzipiell startbereit.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|DC und RC sind Eigenschaften des Formulars. Siehe [[Tutorial_quickstart#Das_fertige_Templateformular|Definition des Templateformulars]].}}&lt;br /&gt;
&lt;br /&gt;
Nach dieser durchaus simplen Initialisierung (man kann auch alles per Hand machen was InitOpenGL macht!) steht OpenGL ziemlich nackt da. Soll heißen, alle OpenGL Eigenschaften/Zustände stehen auf den definierten Anfangswerten. Es kommt aber durchaus oft - eigentlich ständig - vor, dass bestimmte Einstellungen von OpenGL benutzt werden sollen. Deshalb schreiben wir uns noch eine kleine Zusatzprozedur: SetupOpenGL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.SetupGL;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe&lt;br /&gt;
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren&lt;br /&gt;
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was hier passiert wird durch die Kommentare bereits erklärt (Für mehr Infos siehe [[Tiefentest]] bzw. [[Backface Culling]]). Die Hintergrundfarbe könnt ihr nach Belieben einstellen. (Wenn ihr später einmal geschlossene Szenen rendern wollt, dann ist es günstig eine sehr schräge Farbe als Hintergrundfarbe einzustellen, so findet man leichter Fehler in der Szene.)&lt;br /&gt;
&lt;br /&gt;
Außerdem hat man ja hin und wieder auch noch globale Variablen, die man initialisieren möchte. Da wir mit solchen Sachen unser schön aufgeräumtes '''FormCreate''' nicht zumüllen wollen bietet sich ein Unterprogramm namens '''InitGlobals''' oder kurz '''Init''' an.&lt;br /&gt;
Beide Unterprogramme (SetupGL und Init) sollten am Ende von '''FormCreate''' gerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  [...]&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
  SetupGL;&lt;br /&gt;
  Init;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Die Ereignisbehandlung===&lt;br /&gt;
Für OpenGL sind vor allem die Ereignisse von Bedeutung, die an der Zeichenfläche von OpenGL herumwerkeln. Da OpenGL direkt auf das Formular (oder auch auf ein Panel) zeichnet, müssen Ereignisse, die diese Zeichenfläche ändern, behandelt werden. Dies wären das '''OnResize-''' und das '''OnDestroy'''-Ereignis.&lt;br /&gt;
&lt;br /&gt;
Zuerst '''FormResize''':&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormResize(Sender: TObject);&lt;br /&gt;
var tmpBool : Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  glViewport(0, 0, ClientWidth, ClientHeight);&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);    &lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  IdleHandler(Sender, tmpBool);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen im '''const''' Teil die beiden Konstanten Near- bzw. FarClipping definiert werden. Diese geben die Entfernung für die [[Clipping Plane|Clippingebenen]] (Szenenbegrenzung) an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;  NearClipping = 1;&lt;br /&gt;
  FarClipping  = 1000;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zu FormResize''':&lt;br /&gt;
&lt;br /&gt;
'''Zeile 2:''' Diese Boolean-Variable wird in Zeile 11 verwendet und ist nur ein Dummy.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Mittels [[glViewport]] sagt Ihr OpenGL wie groß die OpenGL-Ausgabe werden soll. Genau diese Größe hatte sich ja durch das Resize verändert.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 5/9:''' Hier seht Ihr 2 der 3 möglichen Matrixmodi. '''GL_PROJECTION''' wird benutzt um nachfolgend die OpenGL-Ausgabe zu manipulieren, '''GL_MODELVIEW''' benutzt man um OpenGL mit Daten zu füttern.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 6:''' [[glLoadIdentity]] füllt die aktuelle Matrix mit der Identitätsmatrix. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird eingestellt wie der Betrachter die Welt sehen soll. &lt;br /&gt;
&lt;br /&gt;
'''Zeile 11:''' Was der IdleHandler macht kommt später im Abschnitt 1.3.3 (Zeichenroutine).&lt;br /&gt;
&lt;br /&gt;
Nun noch schnell das '''FormDestroy''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DeactivateRenderingContext;&lt;br /&gt;
  DestroyRenderingContext(RC);&lt;br /&gt;
  ReleaseDC(Handle, DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was es macht? Steht doch da: Den RenderingContext deaktivieren und freigeben.&lt;br /&gt;
&lt;br /&gt;
===Die Zeichenroutine===&lt;br /&gt;
Das Herzstück unseres Templates fehlte bisher. Irgendwann muss der Grafikkarte ja auch gesagt werden, was sie denn überhaupt ausgeben soll. Das kommt jetzt: '''TForm1.Render'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Render;&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_PROJECTION);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
&lt;br /&gt;
  glTranslatef(0, 0, -5);&lt;br /&gt;
&lt;br /&gt;
  glBegin(GL_QUADS);&lt;br /&gt;
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);&lt;br /&gt;
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);&lt;br /&gt;
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);&lt;br /&gt;
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);&lt;br /&gt;
  glEnd;&lt;br /&gt;
&lt;br /&gt;
  SwapBuffers(DC);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Dieser Aufruf sorgt dafür, dass der [[Farbpuffer]] und [[Tiefenpuffer]] gelöscht werden. Wenn man das nicht macht, sieht man alles mögliche, nur nicht das was Ihr rendern wollt. Probiert es ruhig mal ohne aus! Man wird dadurch nicht dümmer.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 7:''' Hier wird wieder die Perspektive gesetzt. Dieser Aufruf und der bei '''FormResize''' &lt;br /&gt;
müssen von den Parametern identisch sein. Sonst sieht die Ausgabe nach einem Resize kurz anders aus. &lt;br /&gt;
Wenn sich die Perspektive zwischen den Renderdurchgängen nicht ändert kann das auch weg gelassen werden.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 12:''' Dieser Aufruf verschiebt die &amp;quot;Kamera&amp;quot; (so etwas gibt es eigentlich nicht, aber das nur am Rande. Mehr zu diesem Thema gibts im [[Tutorial Matrix2]]) etwas nach hinten. Schließlich wollen wir das, was wir zeichnen auch sehen. Alles was zu nah ist wird durch die '''Near-[[Clipping Plane]]''' abgeschnitten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:GlShadeModel_SMOOTH.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' [[glBegin]]/[[glEnd]] kapseln die eigentlichen Zeichenbefehle. Diese sorgen hier für ein '''hübsches buntes Viereck'''. Das soll für den ersten Test ausreichen. Wichtig ist in dem Zusammenhang noch folgendes: OpenGL ist es egal woher ein Befehl kommt. Alles wird ausgewertet und landet unter Umständen im Framebuffer. Ihr könnt also ein Unterprogramm, welches ein Unterprogramm, welches ... ..., welches die OpenGL Befehle enthält schreiben. Das interessiert OpenGL bzw. die Grafikkarte überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 21:''' [[SwapBuffers]] sorgt dafür, dass der Inhalt des [[Framebuffer]]s auf dem &lt;br /&gt;
Bildschirm erscheint. Ohne diesen Befehl seht Ihr gar nichts von OpenGL. (Interessanter Artikel dazu: [[Doppelpufferung]])&lt;br /&gt;
&lt;br /&gt;
So... ganz toll. Jetzt habt Ihr Eure Zeichenfunktion... und nun? Irgendwie müsst Ihr diese auch aufrufen. Das wäre aber zu einfach. Die Ausgabe ändert sich ja normalerweise (z.&amp;amp;nbsp;B. in Spielen). Deshalb muss die Zeichenfunktion immer wieder ausgegeben werden. Dazu gibt es zwei Möglichkeiten, die beide Ihre Vor- und Nachteile haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Argument&lt;br /&gt;
!Timer&lt;br /&gt;
!OnIdle&lt;br /&gt;
|-&lt;br /&gt;
|Maximale Framezahl erreichbar &amp;lt;br&amp;gt;&amp;quot;Benchmark&amp;quot;&lt;br /&gt;
|nein&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Framezahl steuerbar&lt;br /&gt;
|ja&lt;br /&gt;
|bedingt (/umständlich)&lt;br /&gt;
|-&lt;br /&gt;
|Für flüssige Animationen nutzbar&amp;lt;br&amp;gt;(Egoshooter)&lt;br /&gt;
|bedingt/schlecht&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für Menüs nutzbar&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Für einfache Animationen nutzbar&amp;lt;br&amp;gt;(Strategiespiele)&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|Laptopfreundlich (Anti-Akku-Killer)&lt;br /&gt;
|ja&lt;br /&gt;
|NEIN!&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer einfache Anwendungen schreiben möchte, die auch mit 25 FpS (Bilder Pro Sekunde) auskommen und den Akku von Laptopusern schonen will, sollte die Timervariante nutzen. Wer die Potenziale der Grafikkarten voll ausnutzen möchte sollte OnIdle verwenden.&lt;br /&gt;
&lt;br /&gt;
====Methode 1: Timer====&lt;br /&gt;
Bei dieser Methode muss ein Timer (zu finden bei den Systemkomponenten) auf das Formular gezogen werden. Der Timer besitzt eine Eigenschaft names &amp;quot;Interval&amp;quot;. Mit dieser Eigenschaft kann man einstellen  nach wie vielen Millisekunden das Ereignis OnTimer ausgelöst wird. Man kann &amp;quot;Interval&amp;quot; nicht beliebig verkleinern. Werte unter 25 können vom Standardtimer den Windows verwendet nicht mehr korrekt erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt von OnTimer könnte dieser sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
   inc(FrameCount);&lt;br /&gt;
   Render;&lt;br /&gt;
   If FrameCount = 20 then&lt;br /&gt;
      begin&lt;br /&gt;
           ErrorHandler;&lt;br /&gt;
           FrameCount := 0;&lt;br /&gt;
      end;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tiefgreifende Erklärungen sind hier nicht notwendig. Was der ErrorHandler ist wird nach der Methode 2 erklärt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Methode 2: OnIdle====&lt;br /&gt;
&lt;br /&gt;
OnIdle ist ein besonderes Ereignis, welches das gesamte Programm betrifft. Wenn die Anwendung nichts zu tun hat, also faul ist (engl. idle), tritt das Ereignis ein.&lt;br /&gt;
&lt;br /&gt;
Die Methode mit OnIdle kann gleich mit zum Auswerten der Framezahlen (Anzahl Bildwiederholungen pro Sekunde) benutzt werden (Framecounter). Der nachfolgende Code enthält selbigen bereits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
begin&lt;br /&gt;
  StartTime:= GetTickCount;&lt;br /&gt;
  Render;&lt;br /&gt;
  DrawTime:= GetTickCount - StartTime;&lt;br /&gt;
  Inc(TimeCount, DrawTime);&lt;br /&gt;
  Inc(FrameCount);&lt;br /&gt;
&lt;br /&gt;
  if TimeCount &amp;gt;= 1000 then begin&lt;br /&gt;
    Frames:= FrameCount;&lt;br /&gt;
    TimeCount:= TimeCount - 1000;&lt;br /&gt;
    FrameCount:= 0;&lt;br /&gt;
    Caption:= InttoStr(Frames) + 'FPS';&lt;br /&gt;
    ErrorHandler;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  Done:= false;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Mittels GetTickCount wird die Systemzeit gemessen. Dies ist nicht nötig um &lt;br /&gt;
erfolgreich zu zeichnen, sondern dient ausschließlich der Berechnung der Framerate. Diese wiederum ist ein guter Performancemesser.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 4:''' Hier erfolgt der Aufruf unserer Zeichenroutine.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 9:''' Der hier angeordnete Block wird nur pro Sekunde einmal ausgeführt und sorgt &lt;br /&gt;
dafür, dass die Framerate angezeigt wird. Außerdem wird der Errorhandler aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14:''' Der Errorhandler wird im Anschluß beschrieben.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 17:''' Wenn ''Done'' nach der Ausführung ''false'' ist und das Programm wieder nichts zu tun &lt;br /&gt;
hat, wird OnIdle erneut ausgeführt. Wenn ''Done = true'' ist wird OnIdle nur einmal ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Um auf das &amp;quot;Idle-Event&amp;quot; reagieren zu können, müsst ihr jetzt nur noch diese Funktion an das Event koppeln. Das macht ihr, indem ihr den nachfolgenden Code in die letzte Zeile eurer FormCreate-Methode schreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;Application.OnIdle := IdleHandler;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie ihr bald selbst feststellen werdet, sorgt diese Methode für eine hundertprozentige Prozessorauslastung. Umgehen könnt ihr dies mit einem kleinen Trick:&lt;br /&gt;
&lt;br /&gt;
Fügt vor dem &amp;quot;Done := false&amp;quot; (Zeile 17 des IdleHandlers) noch ein sleep(1) oder sleep(5) ein. Dadurch sinkt die Prozessorlast auf ca. 80%, was schon ein Fortschritt ist.&lt;br /&gt;
&lt;br /&gt;
===Der ErrorHandler - Fehler erkannt, Fehler gebannt===&lt;br /&gt;
Der Errorhandler ist wieder eine total einfache Funktion, denn OpenGL bietet von Haus aus eine Möglichkeit OpenGL-Fehler zu erkennen. Deshalb ist der ErrorHandler auch so klein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure TForm1.ErrorHandler;&lt;br /&gt;
begin&lt;br /&gt;
  Form1.Caption := gluErrorString(glGetError);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enttäuscht? Ihr könnt den ErrorHandler nach belieben auch komplexer machen. Zum Beispiel könnt Ihr anstatt die Fehler im Fenstertitel anzuzeigen lieber den Fehler in ein Logfile schreiben. Ganz nebenbei: Falls kein Fehler auftritt liefert [[glGetError]] '''GL_NO_ERROR'''.&lt;br /&gt;
&lt;br /&gt;
===Das fertige Templateformular===&lt;br /&gt;
Eure Klasse TForm1 sollte also jetzt so, oder so ähnlich aussehen:&lt;br /&gt;
&amp;lt;pascal&amp;gt;TForm1 = class(TForm)&lt;br /&gt;
    procedure FormCreate(Sender: TObject);&lt;br /&gt;
    procedure IdleHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;
    procedure FormResize(Sender: TObject);&lt;br /&gt;
    procedure FormDestroy(Sender: TObject);&lt;br /&gt;
  private    { Private-Deklarationen }&lt;br /&gt;
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter&lt;br /&gt;
    Frames, DrawTime                  : Cardinal; //&amp;amp; Timebased Movement&lt;br /&gt;
    procedure SetupGL;&lt;br /&gt;
    procedure Init;&lt;br /&gt;
    procedure Render;&lt;br /&gt;
    procedure ErrorHandler;&lt;br /&gt;
  public    { Public-Deklarationen }&lt;br /&gt;
    DC                                : HDC;  //Handle auf Zeichenfläche&lt;br /&gt;
    RC                                : HGLRC;//Rendering Context&lt;br /&gt;
  end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Zeile 3:''' Wie man sieht benutzt mein Template die zweite Methode (OnIdle).&lt;br /&gt;
&lt;br /&gt;
'''Zeile 8:''' Was [[Timebased Movement]] ist könnt ihr ja mal nachlesen.&lt;br /&gt;
&lt;br /&gt;
'''Zeile 14/15:''' HDC und HGLRC sind Typen die von Windows zur Verfügung gestellt werden. Ihr findet sie in der Unit &amp;quot;Windows&amp;quot;. (Diese Unit sollte bei einem neuen Projekt bereits durch Delphi eingebunden worden sein.)&lt;br /&gt;
&lt;br /&gt;
So... fertig. Eigentlich seid Ihr jetzt soweit von den Tutorialschreibern so richtig mit OpenGL-Wissen voll gepumpt zu werden. Das nachfolgende Kapitel könnt Ihr euch trotzdem ruhigen Gewissens durchlesen. Wer es liest tappt vielleicht nicht gleich bei der ersten Frage im DGL-Forum ins berüchtigte Fettnäpfchen.&lt;br /&gt;
&lt;br /&gt;
==Tipps für den OpenGL Anfänger==&lt;br /&gt;
Wenn man mit OpenGL anfängt ist man meist total perplex und ein &amp;quot;Das war ja einfach!&amp;quot; huscht einem nicht nur einmal über die Lippen. Vor allem zu Beginn Eurer OpenGL-Karriere werdet Ihr viel lernen und dabei nur auf verhältnismäßig geringen Widerstand stoßen. Aber glaubt mir es gibt ihn...&lt;br /&gt;
&lt;br /&gt;
Häufig tauchen hoch motivierte OpenGL Anfänger im Forum auf und verkünden stolz, sie würden gerade an einer Engine arbeiten die ''&amp;quot;nur auf Doom 1 Niveau arbeiten soll&amp;quot;''. &lt;br /&gt;
&lt;br /&gt;
Dazu gibt es häufig eine durchaus beachtliche Anzahl von Forenmitgliedern die dann ungefähr folgendes sagen: ''&amp;quot;Fang gar nicht erst damit an. Vergiss es, und komm in einem Jahr noch mal darauf zurück!&amp;quot;'' (Die Forensuche sollte euch einige dieser Threads zeigen)&lt;br /&gt;
&lt;br /&gt;
Sind das böse Pessimisten, die Probleme nutzen um aufzugeben? '''Nein!''' Sie haben zumeist die Erfahrungen gemacht, die Ihr noch machen werdet. Deshalb will ich euch an dieser Stelle einweihen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;1. Je älter der Code ist desto besser wird er.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider nein. Code und Wein unterscheiden sich hier leider grundlegend. Viele... die meisten... eigentlich alle von uns bekommen Ausschlag, wenn sie sich ihren Code von vor 1 Jahr angucken. Erst wenn man so schätzungsweise 3 bis 5 Jahre mit OpenGL gearbeitet hat, hat man ein echtes Gefühl für den Code. Am Anfang hat man nämlich, ob man will oder nicht, die Tendenz schon nach den ersten 3 Wochen Programmierarbeit sich den Code so zu zerschießen, dass die weitere Arbeit keinen Spaß mehr macht.&lt;br /&gt;
&lt;br /&gt;
''Ich selbst wollte jetzt ein Projekt weiterbearbeiten, welches ungefähr ein 3/4 Jahr alt ist... Ich hab den Code weggeworfen und das fast fertige Spiel neu angefangen. (Glaubt mir: Aus solchen Fehlern lernt man!)''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;2. Große Projekte = Großer Ruhm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stimmt! ABER Ruhm gibt es in der Szene nur für beendete Projekte. Und dreimal dürft Ihr raten was durch die im Punkt 1 angesprochenen Probleme meist nicht mit euren Projekten passiert...&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr OpenGL nur zur Visualisierung von z.&amp;amp;nbsp;B. wissenschaftlichen Ergebnissen benutzt, ist die Arbeit im Bezug auf OpenGL sehr übersichtlich. Wenn Ihr allerdings Spiele programmieren wollt, werdet Ihr schnell merken, dass Probleme auf euch zukommen werden, die euch beim Projektstart völlig unbekannt waren. Dies ist ein sicheres Zeichen dafür, dass doch noch etwas mehr Erfahrung nötig sein wird.&lt;br /&gt;
&lt;br /&gt;
'''Und woher soll ich bitte Erfahrung nehmen?'''&lt;br /&gt;
&lt;br /&gt;
Darin liegt der Trick:&lt;br /&gt;
&lt;br /&gt;
Alle OpenGLer haben einmal &amp;quot;klein&amp;quot; angefangen. Berühmt-berüchtigt sind die 3DPong-Clone, die zahlreich im Internet anzufinden sind. Auch Tetris-, Memory- oder &amp;quot;Vier Gewinnt&amp;quot;-Clone sind solche stillen Zeugen eines großen Lernvorgangs. Das Besondere an solchen Spielen ist, dass die Spiellogik relativ einfach ist und euch damit nur wenig von der Visualisierung ablenkt. &lt;br /&gt;
&lt;br /&gt;
Ihr denkt jetzt bestimmt &amp;quot;Was kann man denn schon in so nem Clon unterbringen?&amp;quot; '''VERDAMMT VIEL!''' Hier mal ein kleiner Auszug:&lt;br /&gt;
&lt;br /&gt;
*3D-Spieldarstellung&lt;br /&gt;
*2D Menüführung ([[glOrtho]])&lt;br /&gt;
*[[Blending]] &lt;br /&gt;
*[[Textur]]en &lt;br /&gt;
*Licht und Materialien (Ihr werdet Augen machen!)&lt;br /&gt;
*[[Selektion]] (Hin und wieder zum Haare raufen.)&lt;br /&gt;
*Kamerasteuerung /Bewegung durch die Szene (Da gibt es ganze Tutorials dazu)&lt;br /&gt;
&lt;br /&gt;
Als Ansporn solltet Ihr euch am Anfang ein kleines Ziel setzen und sagen &amp;quot;Ich möchte den besten und schönsten XYZ-Clon im ganzen Internet schaffen!&amp;quot;. So etwas trifft in der Szene auf wesentlich mehr Anerkennung als wenn mal wieder ein Anfänger etwas von Engine und Doom X faselt.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr ein oder zwei solcher Projekte abgeschlossen habt, und regelmäßig im Forum bzw. Wiki gelesen habt werdet Ihr schon merken, wenn Euer Traumprojekt endlich in Angriff genommen werden kann. (Ganz vergessen müsst ihr es nämlich doch nicht ;) )&lt;br /&gt;
&lt;br /&gt;
'''Als kurze Zusammenfassung solltet Ihr euch merken:'''&lt;br /&gt;
&lt;br /&gt;
*Ein fertiges Projekt bringt euch Ruhm (Seelenbalsam).&lt;br /&gt;
*Ein hübsches, fertiges Projekt bringt euch mehr Ruhm.&lt;br /&gt;
*Ein großes, fertiges, hübsches Projekt bringt euch noch mehr Ruhm.&lt;br /&gt;
&lt;br /&gt;
*Ein abgebrochenes oder eingefrorenes Projekt bringt euch Frust.&lt;br /&gt;
*Ein großes, abgebrochenes Projekt bringt euch noch mehr Frust, denn der verschwendeten Zeit werdet Ihr nachtrauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;3.Das es lang dauert ist egal. Ich interessiere mich halt dafür.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Aussage gilt nur dann, wenn Ihr schon über ein Jahr an ein und demselben Projekt gearbeitet habt. Anfänglich ist das kein Problem. Aber wenn man lange an etwas arbeitet und die gemachten Änderungen sind nicht sichtbar (weil sie z.&amp;amp;nbsp;B. den eigentlichen Motor der Anwendung betreffen und nicht die Ausgabe) dann verliert man schon mal die Lust. Folge sind die berüchtigten &amp;quot;Erfolgsmeldungen&amp;quot; wie: &amp;quot;Das Projekt wurde von mir bis auf weiteres aufs Eis gelegt. Ich werde sicherlich später daran weiterarbeiten.&amp;quot; In Verbindung mit Punkt 1 und den letzen Satz aus Punkt 2 sollte euch das Endergebnis klar sein.&lt;br /&gt;
&lt;br /&gt;
==Nachwort==&lt;br /&gt;
&lt;br /&gt;
Soviel zur Euphoriebremse. OpenGL ist toll. OpenGL ist die Lösung für Eure Traumanwendung. Aber die wird auch mit OpenGL nicht von heute auf morgen programmiert. Deshalb heißt es Tutorials lesen kleine Testanwendungen schreiben um Effekte zu testen und Projekte bearbeiten. Dann wird es auch etwas mit den Traumprojekten. Zudem kann man anfangs auch versuchen in sehr kleinen Anwendungen einen Effekt auszuprobieren und diesen in Form eines kleinen Beispielprogramms oder eines Tutorials zu veröffenlichen. Somit lernt man nicht nur selbst etwas dazu...&lt;br /&gt;
&lt;br /&gt;
Nach diesen unglaublich Weise klingenden Worten die ich mit einem hoch ernsten Gesicht geschrieben habe, könnt ihr euch jetzt hochmotiviert an die restlichen Tutorials machen.&lt;br /&gt;
&lt;br /&gt;
Bis bald im [http://delphiGL.com/forum Forum]&lt;br /&gt;
&lt;br /&gt;
'''Euer'''&lt;br /&gt;
&lt;br /&gt;
'''Flash (Kevin Fleischer)'''&lt;br /&gt;
&lt;br /&gt;
PS: Feedback wird nicht nur gewünscht, sondern ausdrücklich gefordert. Deshalb: Ab mit deinen Meinungen und Ratschläge ins [http://www.delphigl.com/forum/viewforum.php?f=8 Feedback-Forum]!&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|-|[[Tutorial_lektion1]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Quickstart]]&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial&amp;diff=19344</id>
		<title>Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial&amp;diff=19344"/>
				<updated>2006-08-21T16:13:35Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: /* Tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite findet ihr alle Tutorials die DelphiGL.com zu bieten hat. Falls ihr zu einem Thema kein Tutorial findet könnt ihr noch einen Blick auf die [[Techniken und Algorithmen]] werfen. Diese enthalten weitere Artikel zu bestimmten Techniken.&lt;br /&gt;
&lt;br /&gt;
=Hinweise=&lt;br /&gt;
Bitte tragt selbst '''keine''' eigenen Tutorials ohne Absprache mit [[Benutzer:Flash (Kevin Fleischer)|Flash]] bzw. [[Benutzer:Phobeus|Phobeus]] hier ein. Tutorials werden prinzipiell vom DGL-Team gegengelesen, ''bevor'' sie veröffentlicht werden.&lt;br /&gt;
&lt;br /&gt;
Wer mit dem Gedanken spielt, ein Tutorial für DGL zu schreiben, sollte sich bereits bei der Themenwahl mit dem DGL-Team absprechen. DGL ist sehr an neuen Tutorials interessiert. Nur sollte man beachten, dass nichts doppelt geschrieben wird, bzw. dass nicht 2 Mann zur selben Zeit das selbe Thema beackern.&lt;br /&gt;
&lt;br /&gt;
==Hinweis für alle Programmieranfänger==&lt;br /&gt;
Falls ihr OpenGL nutzen wollt aber noch keinerlei Programmiererfahrung habt, so solltet ihr zuerst eine Programmiersprache lernen.&lt;br /&gt;
&lt;br /&gt;
DGL kann folgende Tutorials empfehlen:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!Link&lt;br /&gt;
!Sprache&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://dsdt.info/tutorials/ Delphitutorials bei DSDT.info]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|'''D'''elphi '''S'''ource der '''D'''elphi '''T'''reff entstand durch den Zusammenschluss von Delphi-Source und dem Delphi-Treff. Diese Community verfügt über eine ausgezeichnete Sammlung von Tutorials zum Thema &amp;quot;Delphiprogrammierung&amp;quot;. Es werden nicht nur die Grundlagen erklärt sondern nahezu alle Bereiche der Programmierung mit Delphi. Außerdem verfügt diese Community über ein Forum welches mit seiner ''Bastelecke'' auch für Anfänger geeignet ist.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
{{Hinweis|Alle Tutorials sind der [[:Kategorie:Tutorial]] zugeordnet.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Schwierigkeitsgrad&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_1}} &lt;br /&gt;
|Jeder Schritt wird ausführlich erklärt. Absolut Einsteigertauglich.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_2}} &lt;br /&gt;
|Verständnis der Grundprinzipien wird vorraus gesetzt. Die Materie bleibt aber einfach.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_3}}&lt;br /&gt;
|Ihr wisst um was es geht. Es wird erwartet, dass ihr selbst das Thema weiterdenkt.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_4}}  &lt;br /&gt;
|Das Tutorial bietet euch einen Einstieg. Es wird erwartet, dass ihr euch selbst noch eingehender mit den beschriebenen Techniken befasst. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_5}}  &lt;br /&gt;
|Um das Tutorial zu verstehen werden Kenntnisse auf dem entsprechenden Gebiet vorrausgesetzt, welche über Grundwissen hinausgehen. Es wird erwartet, dass ihr euch eingehender mit dem Thema auseinandersetzt und auch andere Quellen lest/gelesen habt. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einsteiger-Tutorials ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
{{Hinweis|Die Einsteiger-Tutorials wurden auf SDL umgestellt. Dadurch wurde das Laden von Texturen erleichtert, vor allem aber ermöglicht SDL plattformunabhängig zu programmieren. Ihr benötigt deshalb die ''SDL.pas''. Diese Datei und alle anderen benötigten Dateien findet ihr im '''[[DGLSDK]]'''}}&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial quickstart|Tutorial Quickstart]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;Quickstart: OpenGL &amp;amp; Delphi&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Für alle, die einen schnellen Einstieg in die OpenGL Programmierung mit Delphi suchen, hat Flash hier einen Einstieg geschaffen. Neben dem erstellen eines eigenen OpenGL-Templates hat er für alle, die Großes mit OpenGL vorhaben, am Ende noch einige Hinweise bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
''Es wird empfohlen dieses Tutorial als erstes zu lesen da hier eine erste Codebasis geschaffen wird. Die Hintergründe werden dann ausführlich in den Lektionen behandelt.''&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion1|Tutorial Lektion 1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;Nicht zu weit aus dem Fenster lehnen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial von Magellan ist für alle Neueinsteiger gedacht. Hier werden Grundlagen von &amp;quot;Was ist OpenGL&amp;quot; bis zu &amp;quot;Wie initialisiere ich OpenGL?&amp;quot; besprochen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion2|Tutorial Lektion 2]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion2.jpg|right]] &amp;quot;Entdeckung einer neuen Welt&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Unter dieser Überschrift empängt euch Phobeus zu eurem ersten OpenGL Tutorial welches sich mit der Anwendung der OpenGL-API befasst.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion3|Tutorial Lektion 3]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion3.gif|right]] &amp;quot;Eine Welt des Grauens?&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Hinter diesem Titel verbirgt sich ein Einsteigertutorial zum Thema Matrizen in OpenGL. Wiederum führt euch Phobeus durch den Stoff.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion4|Tutorial Lektion 4]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion4.png|right]] &amp;quot;Texturen, Tapeten und Ihre Tücken&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Wie bekomme ich ein Bild auf meine Primitiven? Wer sich diese Frage bei den vorigen Tutorials gestellt hat, der bekommt hier nun von Phobeus die Antworten.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion5|Tutorial Lektion 5]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion5.jpg|right]] &amp;quot;Artenvielfalten und Ihre Folgen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial geht Phobeus auf weitere Zeichentechniken und Methoden zur Verbesserung der Performance unter OpenGL ein.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion7|Tutorial Lektion 7]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion7.png|right]] &amp;quot;Verblendet!&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Wenn man halbdurchsichtige Fensterscheiben, Lightmaps oder etwas ähnliches in sein Projekt einbauen will, dann kommt man um Blending nicht herum. Wie man das ganze Nutzen kann ist in diesem Tutorial von Phobeus erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion8|Tutorial Lektion 8]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion8.gif|right]] &amp;quot;Das Wesen von hell und dunkel - Licht&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Ohne Beleuchtung sieht selbst jede 3D-Umgebung platt aus. In diesem Tutorial wird primär der richtige Gebrauch des OpenGL-Lichtes beschrieben. Darüberhinaus wird noch die Berechnung von Normalen erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_2D.jpg|right]] &amp;quot;2D mit OpenGL&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
OpenGL ist zwar primär eine 3D-API, eignet sich aber, nicht zuletzt dank seiner leistungsstarken Hardwarebeschleunigung und der damit verbundenen Features, auch sehr gut für reine 2D-Anwendungen. Dieses Tutorial von Sascha Willems geht sehr ausführlich auf die Nutzung von OpenGL für 2D-Anwendungen ein.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Matrix2]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Matrix2.png|right]] &amp;quot;Matrix2 - Matrizen und Matrixmanipulationen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Das Thema Matrizen stellt OpenGL-Einsteiger regelmäßig vor &amp;quot;unlösbare&amp;quot; Aufgaben:&amp;lt;br&amp;gt;&lt;br /&gt;
''Wieso dreht sich der Würfel so komisch, und nicht um sich selbst?''&amp;lt;br&amp;gt; &lt;br /&gt;
''Wieso verschiebt OpenGL die Kugel denn dahin, und nicht dorthin?''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Tutorial von Flash befasst sich mit den 3 Matrixtypen, die es in OpenGL gibt und erklärt was die Befehle '''glScale, glRotate und glTranslate''' wirklich machen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial SDL Einstieg]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;SDL-Einsteiger-Tutorial&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Crossplattform-Programmierung ist das Zauberwort, welches in den letzten Jahren - dank verstärkter Präsenz von Linux - immer wieder in den Programmierforen des Internets auftaucht. Für Grafikprogrammier ist [[SDL]] hier das Mittel der Wahl. Bekannte Titel wie &amp;quot;Quake III&amp;quot; und &amp;quot;Civilisation - Call to Power&amp;quot; bauen bereits auf diese Bibiothek für ihre Linux-Ports. Phobeus zeigt euch in diesem ersten SDL-Tutorial was SDL ist und wie man es benutzt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grundlagen-Tutorials ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Abseits eckiger Welten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Abseits_eckiger_Welten.gif|right]] &amp;quot;Abseits eckiger Welten&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
3D-Welten bestehen seit eh und je aus Dreiecken, was sie oft recht eckig erscheinen lässt. In diesem Tutorial lernt ihr allerdings wie man mit Hilfe von Evaluatoren in OpenGL auch Rundungen erzeugen kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Renderpass]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Renderpass.jpg|right]] &amp;quot;Renderpass - Die Welt daneben&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
OpenGL bietet nicht nur die Möglichkeit seine Szene direkt auf den Bildschirm zu rendern, sondern auch diese in eine Textur zu rendern um diese dann auf ein Objekt zu kleben. Dadurch ergeben sich diverse neue Möglichkeiten, wie z.B. Spiegel, Portale oder nachträgliche Manipulation der Textur. Wie ihr eure Szene in eine Textur bekommt, erfahrt ihr hier.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Selection]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Selection.gif|right]] &amp;quot;Objectselektion A&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Die Selektion von Objekten braucht man spätestens dann, wenn man ein komfortable Interaktion mit der Spielwelt erstellen will. Mit diesem Tutorial von DCW_MrT ist die Thematik kein Problem mehr.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Objektselektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial_Selection_tut03.jpg|right]] &amp;quot;Objektselektion B&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Wie simpel der Objektselektionsmodus von OpenGL zu benutzen ist, wird in diesem Tutorial von Sascha Willems vermittelt. Dazu gibt es den Source-Code und eine fertig kompilierte Anwendung.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial TexFilter]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_TexFilter.jpg|right]] &amp;quot;Texturfilterung - Texturen-Feintuning&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Texturen sind seit langem ein wichtiger Bestandteil im Bereich der Echtzeitgrafik. OpenGL bietet auf diesem Gebiet auch diverse Möglichkeiten Texturen auch filtern zu lassen. Welche das sind und wie sie sich auswirken, könnt ihr in diesem Tutorial von Delphic nachlesen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kamera1]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Kamera1.gif|right]] &amp;quot;Dreht sich das Universum um uns? und andere philosophische Fragen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial von Delphic geht es um die Kamera. Wie eine Kameraklasse gebaut sein könnte und was sie macht wird hier erklärt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Effekte ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Nebel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Nebel.jpg|right]] &amp;quot;DGL Fogging Tutorial&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Erstaunlich einfach lässt sich mit OpenGL Nebel darstellen. Wie einfach, zeigt euch Lithander in diesem Tutorial. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Partikel1]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Partikel1.gif|right]] &amp;quot;Partikel-Tutorial I&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Partikel-Engine sollte in (fast) jeder Engine enthalten sein. Anhand dieses Tutorials von Lithander könnt ihr den Grundstein dazu legen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial BumpMap]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_BumpMap.png|right]] &amp;quot;Bumpmapping - Plastisches 2D&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Bumpmapping ist eine immer stärker genutzte Technik, um polygonarme Oberflächen ohne Tesselation mit vorgegaukelten Details - abhängig vom Lichteinfall - zu versehen. In diesem Tutorial zeigt euch HomerS, wie man Bumpmapping über die NVIDIA-spezifischen Combiner realisiert.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bumpmaps mit Blender]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_BumbBlend_Preview.png|right]]&lt;br /&gt;
Mit dem kostenlosen 3D-Program Blender können einfache Bumpmaps erstellt werden. Wie das geht, erfahrt ihr in diesem Tutorial von Flo. &lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das Programm &amp;quot;Blender&amp;quot; bekommt ihr kostenlos auf [http://blender3d.org blender3d.org]}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial MultiTexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Multitex05.jpg|right]] &amp;quot;Multitexturing&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wie man mehrere Texturen auf ein Polygon bringen kann, erklärt auch Sascha Willems in diesem Tutorial zum Thema Multitexturing. Multitexturing ist seit OpenGL1.3 Teil des GL-Kerns und kann für z.B. für Lightmapping bzw. Detailmapping verwendet werden.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial StencilSpiegel]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_StencilSpiegel.jpg|right]] &amp;quot;Spiegelungen mit dem Stencil-Buffer&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Eine Echtzeit-Spiegelung ist einer der schönsten Effekte einer 3D-Welt und trägt viel zum Realismus bei. Eine Möglichkeit Spiegelungen über den Stencilpuffer zu realisieren, wird in diesem Tutorial von Sascha Willems erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial StereoSehen]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_StereoSehen.gif|right]]Auch wenn moderne Grafikkarten durch eine immer besser werdende Darstellung dem Benutzer versuchen das Betreten einer virtuellen 3D-Welt vorzugaukeln, so schafft es doch auch das beste Doom3-Monster nur bis zur Glasröhre zu erschrecken, rutscht dann aber quietschend davon ab. Was also tun, wenn man einen Schritt weiter gehen und dem Anwender wirkliches 3D bieten möchte? Wer eine 3D-Brille hat, wird mit diesem Tutorial von Nico Mechaelis eine Möglichkeit finden, die dritte Dimension am Computer zur erschließen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Alphamasking]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Alphamasking_tut04.jpg|right]]In diesem kleinen aber feinen Tutorial erklärt Sascha Willems, wie man Alphamasking dazu verwenden kann, eine Szene optisch aufzuwerten und gleichzeitig Performance zu sparen.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Extensions==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Cubemap]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Cubemap_mini.jpg|right]] &amp;quot;GL_ARB_Texture_Cubemap&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial erklärt Sascha Willems die Grundfunktionen der '''GL_ARB_Texture_Cubemap'''-Extension und zeigt auch weiterführende Techniken auf.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Vertexbufferobject]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial Vertexbufferobject preview.jpg|right]] &amp;quot;GL_ARB_Vertex_Buffer_Object&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Wie man mit dieser Extension Vertexdaten schnell im Grafikkarten- und Hauptspeicher ablegt und darauf zugreift, erklärt Sascha Willems in diesem Tutorial.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Vertexprogramme]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_VP_preview.jpg|right]] &amp;quot;GL_ARB_Vertex_Program&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem umfangreichen Tutorial werden alle wichtigen Bereiche der Programmierung mit der GL_ARB_Vertex_Program-Extension abgedeckt. Man kann es als umfassende deutsche Referenz zu diesem Thema sehen, da auch alle wichtigen Funktionen aufgelistet werden und es auch sonst an nichts fehlt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial NVOcclusionQuery]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_NVO_preview.jpg|right]] &amp;quot;NV_Occlusion_Query&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Lard Middendorf geht in diesem Tutorial auf die Verwendung der NV_Occlusion_Query-Extension ein.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Pixelbuffer]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Pixelbuffer_preview.jpg|right]] &amp;quot;WGL_ARB_Pixel_Buffer&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Sascha Willems erklärt hier leicht verständlich den Umgang mit der Pixelbuffer-Extension. Als Additum wird auch noch auf die Nutzung dieser Extension für Shadowmapping eingegangen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Shader ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial glsl|Tutorial glSlang]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_glsl1.png|right]] &amp;quot;Einführung in GLSL&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Nach langem Ringen und Handeln hat es das ARB letztendlich doch geschafft, eine einheitliche Shaderhochsprache für OpenGL zu veröffentlichen, nämlich ''glSlang''. Mit glSlang können nun auch unter OpenGL Vertex- und Fragment-Shader in einer lesbaren, C-ähnlichen Hochsprache geschrieben werden, was deren Entwicklung stark vereinfacht. Diese Einführung von Sascha Willems ist weniger ein Tutorial, als ein kompletter Überblick über glSlang. Hier erfährt der Leser nicht nur etwas über die Benutzung von Shadern im Programm, sondern auch alles über die Sprachelemente, inklusive diverser Beispiele.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial glsl2|Tutorial glSlang 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;GLSL-Ergänzungen und Beispiele&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial von La_Boda ist eine direkte Fortsetzung des GLSL-Tutorials. Es behandelt verstärkt die Praxis und liefert anhand von einigen Beispielen eine bessere Sicht auf die bereits gelernte Theorie.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KI ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding|Tutorial Pathfinding]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding.png|right]] &amp;quot;Pathfinding 1&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial zeigt euch Flo wie man recht simpel eine Wegfindungsroutine implementiert. Besonders wenn man sowas ohne großen Lernaufwand in sein Spiel einbinden möchte, sollte man einen Blick riskieren.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding2|Tutorial Pathfinding 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding2.png|right]] &amp;quot;Pathfinding 2&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Gerade bei aktuelleren Programmen reicht es meist nicht aus, wenn man seine Einheiten nur in 8 Himmelsrichtungen bewegen kann. Frase stellt in diesem Tutorial vor, wie man eine Wegfindungsroutine implementieren kann, wie diese in einem heutigen RTS vorkommen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Terrain und Landschaften ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain1]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain1.gif|right]] &amp;quot;Aussenlandschaften mit System - Heightmaps&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Anhand der Graustufenwerte einer Bitmap-Datei kann man relativ einfach eine imposante Landschaft erstellen. Wie das ganze funktioniert erklärt euch Nico Michaelis in diesem Tutorial. Außerdem wird noch die Implementation von Skyboxen erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain2|Tutorial Terrain 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain2.gif|right]] &amp;quot;Heightmap-Texturen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Da das Terrain aus dem vorigen Tutorial noch recht eintönig grau aussieht und das natürlich geändert werden soll, erklärt euch Nico, wie man schmucke Schatten und Texturen für die Heightmap generieren kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain3|Tutorial Terrain 3]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain3.gif|right]] &amp;quot;Terrain im Detail&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Da größere Landschaften aufgrund der hohen Polygonanzahl sehr aufwändig zu rendern sind erklärt euch Nico hier, wie man entfernte Dreiecke &amp;quot;zusammenlegen&amp;quot; kann, um Rechenleistung zu sparen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Skyboxen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Skybox_Vorschau.jpg|right]] &amp;quot;Skyboxen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial erklärt Sascha Willems kurz und bündig den Umgang mit Skyboxen, mit denen man Landschaften schnell sehr stark optisch aufwerten kann. Es wird sowohl auf die Erstellung der Skybox-Texturen mit dem Programm Terragen als auch die Implementation der Skybox in OpenGL eingegangen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spieletutorials und Softwareentwicklung==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman1|Tutorial Bomberman 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Bomberman1.jpg|right]] &amp;quot;Bomberman1 - Codebasis und Editor&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser kleinen Tutorialserie zum Thema Spieleprogrammierung kümmern wir uns neben der Erstellung unseres Basiscodes auch um einen fertigen Editor. Nach der Durcharbeitung dieses Tutorials von Sascha Willems sollte der Leser alle Grundprinzipien zur Programmierung eines Spiels verstanden haben.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman2|Tutorial Bomberman 2]]&lt;br /&gt;
{{Level_3}}&lt;br /&gt;
|[[Bild:Tutorial_Bomberman2.jpg|right]] &amp;quot;Bomberman2 - Der 3D-Bombermanklon (Grundversion)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten Teil gehts ans Eingemachte, nämlich einen fertigen Bombermanklon. In Sascha Willems Tutorial werdet ihr zusätzlich zu den bereits erworbenen Prinzipien diverse Techniken die in so ziemlich jedem Spiel Verwendung finden erlernen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung1|Tutorial Softwareentwicklung 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE1.jpg|right]] &amp;quot;Softwareentwicklung1 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser Tutorialserie zum Thema Softwareentwicklung erklärt euch Flash, wie man an ein Projekt herangeht und herausfindet was eigentlich zu tun ist. Es geht dabei um Analyse der Anforderungen und die Modellierung sogenannter Use Cases. Die hier vorgestellten Arbeiten sind Grundlage um später Klassen zu finden auf denen dann der Code aufgebaut wird.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung2|Tutorial Softwareentwicklung 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE2.jpg|right]] &amp;quot;Softwareentwicklung2 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten und umfangreichsten Teil der Serie steht das Thema &amp;quot;Klassen&amp;quot; im Zentrum. Flash erklärt euch wie man aus den Use Cases Klassen ableitet und welche unterschiedlichen Einsatzgebiete Klassen innerhalbd er Software haben können.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mathematisches ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lineare Algebra]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_lineare_Algebra_Preview.jpg|right]] &amp;quot;Vektorrechnung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In vielen Tutorials tauchen eine Menge Begriffe aus der linearen Algebra und analytischen Geometrie auf. Wer bei Begriffen wie Vektoren, Skalar-Produkt, Vektorkreuzprodukt, etc. ein wenig Auffrischung und Implementationshinweise braucht, ist mit diesem Tutorial von EternalLearner an der richtigen Stelle.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Nachsitzen]]{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Nachsitzen_preview.png|right]] &amp;quot;3d-Mathematik&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Wer die mathematischen Grundlagen wie Sinus, Cosinus und Matrizen aus der Schule schon wieder vergessen oder noch vor sich liegen hat, der kann mit Hilfe dieses Tutorials von Nico Michaelis dieses Wissen erlernen bzw. auffrischen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt gedreht und dennoch nach vorne bewegt]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_gedreht_und_dennoch_nach_vorne_bewegt_preview.gif|right]] &amp;quot;Objekt gedreht und dennoch nach vorne bewegt&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt in diesem Tutorial wie man ein Objekt drehen und dabei trotzdem vorwärts bewegen kann. Quer fahrende Autos sind zwar praktisch zum Einparken Aber doch eher selten ;-)&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt immer um eigene Achse drehen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_immer_um_die_eigene_Achse_drehen_preview.gif|right]] &amp;quot;Objekt immer um eigene Achse drehen&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ihr euer Objekt nun noch um die eigene Achse drehen wollt, seid ihr mit diesem Tutorial von SchodMC an der richtigen Adresse&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Grafik und Modellierung ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 1]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch1_preview.jpg|right]] &amp;quot;Modellierung eines Low-Poly-Menschen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Die Modellierung von organischen &amp;quot;Objekten&amp;quot; gehört mit zu den kompliziertesten Aufgaben, die es beim Modelling gibt. Wie man einen Menschen mit aus möglichst wenigen Polygonen mit dem Programm 3D Studio Max erstellen kann wird in diesem Tutorial von Sascha Willems erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch2_preview.jpg|right]] &amp;quot;Kleider machen Leute (UVW-Mapping)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Nun spendiert Sascha Willems seinem Menschen aus dem 1. Tutorial eine schmucke Uniform, so dass er sich endlich in der Öffentlichkeit blicken lassen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Skripte ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scripting mit JvInterpreterProgram]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_JvInterpreter_preview.png|right]] &amp;quot;Skripting mithilfe der Jedi-Code-Library&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt hier wie man mit relativ wenig Aufwand Skripte in eigene Programme integrieren kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 1]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen1_preview.gif|right]] &amp;quot;Scriptsprachen Teil 1 - Einführung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Nico Michaelis genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der erste Teil widmet sich der Lexikalischen Analyse und dem Parsen des Quellcodes&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 2]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen2_preview.gif|right]] &amp;quot;Scriptsprachen Teil 2 - Virtuelle Computer und Code Erzeugung&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Nico Michaelis genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil beschreibt den Bau einer VM und der Codeerzeugung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Delphi allgemein ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Debugging]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Debugging.gif|right]] &amp;quot;Debugger benutzen und andere praktische Tipps&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet von Nico mit der Nutzung des Delphi-Debuggers eingeführt. Auch werden Wege zur Vermeidung von Fehlern aufgezeigt. Genauso findet Ihr aber auch in diesem Tutorial Hinweise, zu häufig begangenen Fehlern und deren Ursachen.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Komponentenentwicklung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Komponentenentwicklung.png|right]] &amp;quot;Komponentenentwicklung&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet ihr ein wenig tiefer in die Entwicklung von Komponenten unter Delphi eingeführt. Es wird Grundwissen auf diesem Gebiet vorausgesetzt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Multithreading]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Multithreading.gif|right]] &amp;quot;Das Prinzip der Dualität&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Threads sind ein erweitertes Prinzip des bekannten Multitasking und werden innerhalb eines Programmes oft dazu genutzt, verschiedene Aufträge gleichzeitig abzuarbeiten. LossyEx erklärt euch hier deren Nutzung.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Software-Synthesizer]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Noexist.jpg|right]] &amp;quot;Software-Synthesizer&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Computerspiele bestehen nicht nur aus Grafik. Dieses Tutorial widmet sich einem ganz anderen Bereich der Spieleprogrammierung: Der Erzeugung von synthetischen Sounds und Musik.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Rendertechniken ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Octree]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Octree preview.jpg|right]] &amp;quot;Octrees&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Octrees sind eine einfach zu implementierende, aber sehr effiziente Möglichkeit um besonders Outdoor-Szenen abhängig vom Betrachterblickfeld stark zu beschleunigen. In diesem Tutorial zeigt Shadow euch eine komplette Implementation eines Octrees inklusive ausgiebigem Quellcode.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Frustum Culling]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Frustum Culling.jpg|right]] &amp;quot;Frustum Culling&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Frustum Culling ist eine einfache Möglichkeit die Rendergeschwindigkeit zu erhöhen, da man damit schon vor dem Senden der Daten an die Grafikkarten feststellen kann, welche Objekte sich im Blickfeld des Spielers befinden und welche nicht.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial GLScene]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial GLScene preview.jpg|right]] &amp;quot;Einführung in GLScene&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
GLScene ist eine zu erstaunlicher Größe angewachsene Komponentensammlung, die quasi einen OpenGL-Wrapper darstellt und euch dank Delphis VCL dadurch recht einfach OpenGL-Programme erstellen lässt. LaBoda gibt euch zu dieser Komponentensammlung in diesem Tutorial deshalb eine kleine Einführung.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial&amp;diff=18524</id>
		<title>Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial&amp;diff=18524"/>
				<updated>2006-08-19T12:14:15Z</updated>
		
		<summary type="html">&lt;p&gt;Infinite: /* Hinweise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite findet ihr alle Tutorials die DelphiGL.com zu bieten hat. Falls ihr zu einem Thema kein Tutorial findet könnt ihr noch einen Blick auf die [[Techniken und Algorithmen]] werfen. Diese enthalten weitere Artikel zu bestimmten Techniken.&lt;br /&gt;
&lt;br /&gt;
=Hinweise=&lt;br /&gt;
Bitte tragt selbst '''keine''' eigenen Tutorials ohne Absprache mit [[Benutzer:Flash (Kevin Fleischer)|Flash]] bzw. [[Benutzer:Phobeus|Phobeus]] hier ein. Tutorials werden prinzipiell vom DGL-Team gegengelesen, ''bevor'' sie veröffentlicht werden.&lt;br /&gt;
&lt;br /&gt;
Wer mit dem Gedanken spielt, ein Tutorial für DGL zu schreiben, sollte sich bereits bei der Themenwahl mit dem DGL-Team absprechen. DGL ist sehr an neuen Tutorials interessiert. Nur sollte man beachten, dass nichts doppelt geschrieben wird, bzw. dass nicht 2 Mann zur selben Zeit das selbe Thema beackern.&lt;br /&gt;
&lt;br /&gt;
==Hinweis für alle Programmieranfänger==&lt;br /&gt;
Falls ihr OpenGL nutzen wollt aber noch keinerlei Programmiererfahrung habt, so solltet ihr zuerst eine Programmiersprache lernen.&lt;br /&gt;
&lt;br /&gt;
DGL kann folgende Tutorials empfehlen:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!Link&lt;br /&gt;
!Sprache&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://dsdt.info/tutorials/ Delphitutorials bei DSDT.info]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|'''D'''elphi '''S'''ource der '''D'''elphi '''T'''reff entstand durch den Zusammenschluss von Delphi-Source und dem Delphi-Treff. Diese Community verfügt über eine ausgezeichnete Sammlung von Tutorials zum Thema &amp;quot;Delphiprogrammierung&amp;quot;. Es werden nicht nur die Grundlagen erklärt sondern nahezu alle Bereiche der Programmierung mit Delphi. Außerdem verfügt diese Community über ein Forum welches mit seiner ''Bastelecke'' auch für Anfänger geeignet ist.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
{{Hinweis|Alle Tutorials sind der [[:Kategorie:Tutorial]] zugeordnet.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Schwierigkeitsgrad&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_1}} &lt;br /&gt;
|Jeder Schritt wird ausführlich erklärt. Absolut Einsteigertauglich.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_2}} &lt;br /&gt;
|Verständnis der Grundprinzipien wird vorraus gesetzt. Die Materie bleibt aber einfach.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_3}}&lt;br /&gt;
|Ihr wisst um was es geht. Es wird erwartet, dass ihr selbst das Thema weiterdenkt.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_4}}  &lt;br /&gt;
|Das Tutorial bietet euch einen Einstieg. Es wird erwartet, dass ihr euch selbst noch eingehender mit den beschriebenen Techniken befasst. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_5}}  &lt;br /&gt;
|Um das Tutorial zu verstehen werden Kenntnisse auf dem entsprechenden Gebiet vorrausgesetzt, welche über Grundwissen hinausgehen. Es wird erwartet, dass ihr euch eingehender mit dem Thema auseinandersetzt und auch andere Quellen leßt/gelesen habt. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einsteiger-Tutorials ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
{{Hinweis|Die Einsteiger-Tutorials wurden auf SDL umgestellt. Dadurch wurde das Laden von Texturen erleichtert, vor allem aber ermöglicht SDL plattformunabhängig zu programmieren. Ihr benötigt deshalb die ''SDL.pas''. Diese Datei und alle anderen benötigten Dateien findet ihr im '''[[DGLSDK]]'''}}&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial quickstart|Tutorial Quickstart]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;Quickstart: OpenGL &amp;amp; Delphi&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Für alle, die einen schnellen Einstieg in die OpenGL Programmierung mit Delphi suchen, hat Flash hier einen Einstieg geschaffen. Neben dem erstellen eines eigenen OpenGL-Templates hat er für alle, die Großes mit OpenGL vorhaben, am Ende noch einige Hinweise bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
''Es wird empfohlen dieses Tutorial als erstes zu lesen da hier eine erste Codebasis geschaffen wird. Die Hintergründe werden dann ausführlich in den Lektionen behandelt.''&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion1|Tutorial Lektion 1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;Nicht zu weit aus dem Fenster lehnen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial von Magellan ist für alle Neueinsteiger gedacht. Hier werden Grundlagen von &amp;quot;Was ist OpenGL&amp;quot; bis zu &amp;quot;Wie initialisiere ich OpenGL?&amp;quot; besprochen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion2|Tutorial Lektion 2]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion2.jpg|right]] &amp;quot;Entdeckung einer neuen Welt&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Unter dieser Überschrift empängt euch Phobeus zu eurem ersten OpenGL Tutorial welches sich mit der Anwendung der OpenGL-API befasst.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion3|Tutorial Lektion 3]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion3.gif|right]] &amp;quot;Eine Welt des Grauens?&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Hinter diesem Titel verbirgt sich ein Einsteigertutorial zum Thema Matrizen in OpenGL. Wiederum führt euch Phobeus durch den Stoff.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion4|Tutorial Lektion 4]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion4.png|right]] &amp;quot;Texturen, Tapeten und Ihre Tücken&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Wie bekomme ich ein Bild auf meine Primitiven? Wer sich diese Frage bei den vorigen Tutorials gestellt hat, der bekommt hier nun von Phobeus die Antworten.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion5|Tutorial Lektion 5]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion5.jpg|right]] &amp;quot;Artenvielfalten und Ihre Folgen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial geht Phobeus auf weitere Zeichentechniken und Methoden zur Verbesserung der Performance unter OpenGL ein.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion7|Tutorial Lektion 7]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion7.png|right]] &amp;quot;Verblendet!&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Wenn man halbdurchsichtige Fensterscheiben, Lightmaps oder etwas ähnliches in sein Projekt einbauen will, dann kommt man um Blending nicht herum. Wie man das ganze Nutzen kann ist in diesem Tutorial von Phobeus erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial lektion8|Tutorial Lektion 8]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion8.gif|right]] &amp;quot;Das Wesen von hell und dunkel - Licht&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Ohne Beleuchtung sieht selbst jede 3D-Umgebung platt aus. In diesem Tutorial wird primär der richtige Gebrauch des OpenGL-Lichtes beschrieben. Darüberhinaus wird noch die Berechnung von Normalen erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_2D.jpg|right]] &amp;quot;2D mit OpenGL&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
OpenGL ist zwar primär eine 3D-API, eignet sich aber, nicht zuletzt dank seiner leistungsstarken Hardwarebeschleunigung und der damit verbundenen Features, auch sehr gut für reine 2D-Anwendungen. Dieses Tutorial von Sascha Willems geht sehr ausführlich auf die Nutzung von OpenGL für 2D-Anwendungen ein.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Matrix2]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Matrix2.png|right]] &amp;quot;Matrix2 - Matrizen und Matrixmanipulationen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Das Thema Matrizen stellt OpenGL-Einsteiger regelmäßig vor &amp;quot;unlösbare&amp;quot; Aufgaben:&amp;lt;br&amp;gt;&lt;br /&gt;
''Wieso dreht sich der Würfel so komisch, und nicht um sich selbst?''&amp;lt;br&amp;gt; &lt;br /&gt;
''Wieso verschiebt OpenGL die Kugel denn dahin, und nicht dorthin?''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Tutorial von Flash befasst sich mit den 3 Matrixtypen, die es in OpenGL gibt und erklärt was die Befehle '''glScale, glRotate und glTranslate''' wirklich machen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial SDL Einstieg]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;SDL-Einsteiger-Tutorial&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Crossplattform-Programmierung ist das Zauberwort, welches in den letzten Jahren - dank verstärkter Präsenz von Linux - immer wieder in den Programmierforen des Internets auftaucht. Für Grafikprogrammier ist [[SDL]] hier das Mittel der Wahl. Bekannte Titel wie &amp;quot;Quake III&amp;quot; und &amp;quot;Civilisation - Call to Power&amp;quot; bauen bereits auf diese Bibiothek für ihre Linux-Ports. Phobeus zeigt euch in diesem ersten SDL-Tutorial was SDL ist und wie man es benutzt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grundlagen-Tutorials ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Abseits eckiger Welten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Abseits_eckiger_Welten.gif|right]] &amp;quot;Abseits eckiger Welten&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
3D-Welten bestehen seit eh und je aus Dreiecken, was sie oft recht eckig erscheinen lässt. In diesem Tutorial lernt ihr allerdings wie man mit Hilfe von Evaluatoren in OpenGL auch Rundungen erzeugen kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Renderpass]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Renderpass.jpg|right]] &amp;quot;Renderpass - Die Welt daneben&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
OpenGL bietet nicht nur die Möglichkeit seine Szene direkt auf den Bildschirm zu rendern, sondern auch diese in eine Textur zu rendern um diese dann auf ein Objekt zu kleben. Dadurch ergeben sich diverse neue Möglichkeiten, wie z.B. Spiegel, Portale oder nachträgliche Manipulation der Textur. Wie ihr eure Szene in eine Textur bekommt, erfahrt ihr hier.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Selection]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Selection.gif|right]] &amp;quot;Objectselektion A&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Die Selektion von Objekten braucht man spätestens dann, wenn man ein komfortable Interaktion mit der Spielwelt erstellen will. Mit diesem Tutorial von DCW_MrT ist die Thematik kein Problem mehr.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Objektselektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial_Selection_tut03.jpg|right]] &amp;quot;Objektselektion B&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Wie simpel der Objektselektionsmodus von OpenGL zu benutzen ist, wird in diesem Tutorial von Sascha Willems vermittelt. Dazu gibt es den Source-Code und eine fertig kompilierte Anwendung.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial TexFilter]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_TexFilter.jpg|right]] &amp;quot;Texturfilterung - Texturen-Feintuning&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Texturen sind seit langem ein wichtiger Bestandteil im Bereich der Echtzeitgrafik. OpenGL bietet auf diesem Gebiet auch diverse Möglichkeiten Texturen auch filtern zu lassen. Welche das sind und wie sie sich auswirken, könnt ihr in diesem Tutorial von Delphic nachlesen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kamera1]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Kamera1.gif|right]] &amp;quot;Dreht sich das Universum um uns? und andere philosophische Fragen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial von Delphic geht es um die Kamera. Wie eine Kameraklasse gebaut sein könnte und was sie macht wird hier erklärt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Effekte ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Nebel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Nebel.jpg|right]] &amp;quot;DGL Fogging Tutorial&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Erstaunlich einfach lässt sich mit OpenGL Nebel darstellen. Wie einfach, zeigt euch Lithander in diesem Tutorial. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Partikel1]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Partikel1.gif|right]] &amp;quot;Partikel-Tutorial I&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Partikel-Engine sollte in (fast) jeder Engine enthalten sein. Anhand dieses Tutorials von Lithander könnt ihr den Grundstein dazu legen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial BumpMap]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_BumpMap.png|right]] &amp;quot;Bumpmapping - Plastisches 2D&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Bumpmapping ist eine immer stärker genutzte Technik, um polygonarme Oberflächen ohne Tesselation mit vorgegaukelten Details - abhängig vom Lichteinfall - zu versehen. In diesem Tutorial zeigt euch HomerS, wie man Bumpmapping über die NVIDIA-spezifischen Combiner realisiert.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bumpmaps mit Blender]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_BumbBlend_Preview.png|right]]&lt;br /&gt;
Mit dem kostenlosen 3D-Program Blender können einfache Bumpmaps erstellt werden. Wie das geht, erfahrt ihr in diesem Tutorial von Flo. &lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das Programm &amp;quot;Blender&amp;quot; bekommt ihr kostenlos auf [http://blender3d.org blender3d.org]}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial MultiTexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Multitex05.jpg|right]] &amp;quot;Multitexturing&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wie man mehrere Texturen auf ein Polygon bringen kann, erklärt auch Sascha Willems in diesem Tutorial zum Thema Multitexturing. Multitexturing ist seit OpenGL1.3 Teil des GL-Kerns und kann für z.B. für Lightmapping bzw. Detailmapping verwendet werden.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial StencilSpiegel]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_StencilSpiegel.jpg|right]] &amp;quot;Spiegelungen mit dem Stencil-Buffer&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Eine Echtzeit-Spiegelung ist einer der schönsten Effekte einer 3D-Welt und trägt viel zum Realismus bei. Eine Möglichkeit Spiegelungen über den Stencilpuffer zu realisieren, wird in diesem Tutorial von Sascha Willems erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial StereoSehen]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_StereoSehen.gif|right]]Auch wenn moderne Grafikkarten durch eine immer besser werdende Darstellung dem Benutzer versuchen das Betreten einer virtuellen 3D-Welt vorzugaukeln, so schafft es doch auch das beste Doom3-Monster nur bis zur Glasröhre zu erschrecken, rutscht dann aber quietschend davon ab. Was also tun, wenn man einen Schritt weiter gehen und dem Anwender wirkliches 3D bieten möchte? Wer eine 3D-Brille hat, wird mit diesem Tutorial von Nico Mechaelis eine Möglichkeit finden, die dritte Dimension am Computer zur erschließen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Alphamasking]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Alphamasking_tut04.jpg|right]]In diesem kleinen aber feinen Tutorial erklärt Sascha Willems, wie man Alphamasking dazu verwenden kann, eine Szene optisch aufzuwerten und gleichzeitig Performance zu sparen.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Extensions==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Cubemap]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Cubemap_mini.jpg|right]] &amp;quot;GL_ARB_Texture_Cubemap&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial erklärt Sascha Willems die Grundfunktionen der '''GL_ARB_Texture_Cubemap'''-Extension und zeigt auch weiterführende Techniken auf.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Vertexbufferobject]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial Vertexbufferobject preview.jpg|right]] &amp;quot;GL_ARB_Vertex_Buffer_Object&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Wie man mit dieser Extension Vertexdaten schnell im Grafikkarten- und Hauptspeicher ablegt und darauf zugreift, erklärt Sascha Willems in diesem Tutorial.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Vertexprogramme]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_VP_preview.jpg|right]] &amp;quot;GL_ARB_Vertex_Program&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem umfangreichen Tutorial werden alle wichtigen Bereiche der Programmierung mit der GL_ARB_Vertex_Program-Extension abgedeckt. Man kann es als umfassende deutsche Referenz zu diesem Thema sehen, da auch alle wichtigen Funktionen aufgelistet werden und es auch sonst an nichts fehlt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial NVOcclusionQuery]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_NVO_preview.jpg|right]] &amp;quot;NV_Occlusion_Query&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Lard Middendorf geht in diesem Tutorial auf die Verwendung der NV_Occlusion_Query-Extension ein.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Pixelbuffer]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Pixelbuffer_preview.jpg|right]] &amp;quot;WGL_ARB_Pixel_Buffer&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Sascha Willems erklärt hier leicht verständlich den Umgang mit der Pixelbuffer-Extension. Als Additum wird auch noch auf die Nutzung dieser Extension für Shadowmapping eingegangen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Shader ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial glsl|Tutorial glSlang]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_glsl1.png|right]] &amp;quot;Einführung in GLSL&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Nach langem Ringen und Handeln hat es das ARB letztendlich doch geschafft, eine einheitliche Shaderhochsprache für OpenGL zu veröffentlichen, nämlich ''glSlang''. Mit glSlang können nun auch unter OpenGL Vertex- und Fragment-Shader in einer lesbaren, C-ähnlichen Hochsprache geschrieben werden, was deren Entwicklung stark vereinfacht. Diese Einführung von Sascha Willems ist weniger ein Tutorial, als ein kompletter Überblick über glSlang. Hier erfährt der Leser nicht nur etwas über die Benutzung von Shadern im Programm, sondern auch alles über die Sprachelemente, inklusive diverser Beispiele.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial glsl2|Tutorial glSlang 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;GLSL-Ergänzungen und Beispiele&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial von La_Boda ist eine direkte Fortsetzung des GLSL-Tutorials. Es behandelt verstärkt die Praxis und liefert anhand von einigen Beispielen eine bessere Sicht auf die bereits gelernte Theorie.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KI ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding|Tutorial Pathfinding]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding.png|right]] &amp;quot;Pathfinding 1&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial zeigt euch Flo wie man recht simpel eine Wegfindungsroutine implementiert. Besonders wenn man sowas ohne großen Lernaufwand in sein Spiel einbinden möchte, sollte man einen Blick riskieren.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding2|Tutorial Pathfinding 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding2.png|right]] &amp;quot;Pathfinding 2&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Gerade bei aktuelleren Programmen reicht es meist nicht aus, wenn man seine Einheiten nur in 8 Himmelsrichtungen bewegen kann. Frase stellt in diesem Tutorial vor, wie man eine Wegfindungsroutine implementieren kann, wie diese in einem heutigen RTS vorkommen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Terrain und Landschaften ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain1]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain1.gif|right]] &amp;quot;Aussenlandschaften mit System - Heightmaps&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Anhand der Graustufenwerte einer Bitmap-Datei kann man relativ einfach eine imposante Landschaft erstellen. Wie das ganze funktioniert erklärt euch Nico Michaelis in diesem Tutorial. Außerdem wird noch die Implementation von Skyboxen erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain2|Tutorial Terrain 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain2.gif|right]] &amp;quot;Heightmap-Texturen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Da das Terrain aus dem vorigen Tutorial noch recht eintönig grau aussieht und das natürlich geändert werden soll, erklärt euch Nico, wie man schmucke Schatten und Texturen für die Heightmap generieren kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain3|Tutorial Terrain 3]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain3.gif|right]] &amp;quot;Terrain im Detail&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Da größere Landschaften aufgrund der hohen Polygonanzahl sehr aufwändig zu rendern sind erklärt euch Nico hier, wie man entfernte Dreiecke &amp;quot;zusammenlegen&amp;quot; kann, um Rechenleistung zu sparen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Skyboxen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Skybox_Vorschau.jpg|right]] &amp;quot;Skyboxen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial erklärt Sascha Willems kurz und bündig den Umgang mit Skyboxen, mit denen man Landschaften schnell sehr stark optisch aufwerten kann. Es wird sowohl auf die Erstellung der Skybox-Texturen mit dem Programm Terragen als auch die Implementation der Skybox in OpenGL eingegangen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spieletutorials und Softwareentwicklung==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman1|Tutorial Bomberman 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Bomberman1.jpg|right]] &amp;quot;Bomberman1 - Codebasis und Editor&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser kleinen Tutorialserie zum Thema Spieleprogrammierung kümmern wir uns neben der Erstellung unseres Basiscodes auch um einen fertigen Editor. Nach der Durcharbeitung dieses Tutorials von Sascha Willems sollte der Leser alle Grundprinzipien zur Programmierung eines Spiels verstanden haben.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman2|Tutorial Bomberman 2]]&lt;br /&gt;
{{Level_3}}&lt;br /&gt;
|[[Bild:Tutorial_Bomberman2.jpg|right]] &amp;quot;Bomberman2 - Der 3D-Bombermanklon (Grundversion)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten Teil gehts ans Eingemachte, nämlich einen fertigen Bombermanklon. In Sascha Willems Tutorial werdet ihr zusätzlich zu den bereits erworbenen Prinzipien diverse Techniken die in so ziemlich jedem Spiel Verwendung finden erlernen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung1|Tutorial Softwareentwicklung 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE1.jpg|right]] &amp;quot;Softwareentwicklung1 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser Tutorialserie zum Thema Softwareentwicklung erklärt euch Flash, wie man an ein Projekt herangeht und herausfindet was eigentlich zu tun ist. Es geht dabei um Analyse der Anforderungen und die Modellierung sogenannter Use Cases. Die hier vorgestellten Arbeiten sind Grundlage um später Klassen zu finden auf denen dann der Code aufgebaut wird.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung2|Tutorial Softwareentwicklung 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE2.jpg|right]] &amp;quot;Softwareentwicklung2 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten und umfangreichsten Teil der Serie steht das Thema &amp;quot;Klassen&amp;quot; im Zentrum. Flash erklärt euch wie man aus den Use Cases Klassen ableitet und welche unterschiedlichen Einsatzgebiete Klassen innerhalbd er Software haben können.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mathematisches ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lineare Algebra]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_lineare_Algebra_Preview.jpg|right]] &amp;quot;Vektorrechnung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In vielen Tutorials tauchen eine Menge Begriffe aus der linearen Algebra und analytischen Geometrie auf. Wer bei Begriffen wie Vektoren, Skalar-Produkt, Vektorkreuzprodukt, etc. ein wenig Auffrischung und Implementationshinweise braucht, ist mit diesem Tutorial von EternalLearner an der richtigen Stelle.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Nachsitzen]]{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Nachsitzen_preview.png|right]] &amp;quot;3d-Mathematik&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Wer die mathematischen Grundlagen wie Sinus, Cosinus und Matrizen aus der Schule schon wieder vergessen oder noch vor sich liegen hat, der kann mit Hilfe dieses Tutorials von Nico Michaelis dieses Wissen erlernen bzw. auffrischen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt gedreht und dennoch nach vorne bewegt]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_gedreht_und_dennoch_nach_vorne_bewegt_preview.gif|right]] &amp;quot;Objekt gedreht und dennoch nach vorne bewegt&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt in diesem Tutorial wie man ein Objekt drehen und dabei trotzdem vorwärts bewegen kann. Quer fahrende Autos sind zwar praktisch zum Einparken Aber doch eher selten ;-)&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt immer um eigene Achse drehen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_immer_um_die_eigene_Achse_drehen_preview.gif|right]] &amp;quot;Objekt immer um eigene Achse drehen&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ihr euer Objekt nun noch um die eigene Achse drehen wollt, seid ihr mit diesem Tutorial von SchodMC an der richtigen Adresse&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Grafik und Modellierung ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 1]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch1_preview.jpg|right]] &amp;quot;Modellierung eines Low-Poly-Menschen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Die Modellierung von organischen &amp;quot;Objekten&amp;quot; gehört mit zu den kompliziertesten Aufgaben, die es beim Modelling gibt. Wie man einen Menschen mit aus möglichst wenigen Polygonen mit dem Programm 3D Studio Max erstellen kann wird in diesem Tutorial von Sascha Willems erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch2_preview.jpg|right]] &amp;quot;Kleider machen Leute (UVW-Mapping)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Nun spendiert Sascha Willems seinem Menschen aus dem 1. Tutorial eine schmucke Uniform, so dass er sich endlich in der Öffentlichkeit blicken lassen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Skripte ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scripting mit JvInterpreterProgram]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_JvInterpreter_preview.png|right]] &amp;quot;Skripting mithilfe der Jedi-Code-Library&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt hier wie man mit relativ wenig Aufwand Skripte in eigene Programme integrieren kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 1]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen1_preview.gif|right]] &amp;quot;Scriptsprachen Teil 1 - Einführung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Nico Michaelis genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der erste Teil widmet sich der Lexikalischen Analyse und dem Parsen des Quellcodes&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 2]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen2_preview.gif|right]] &amp;quot;Scriptsprachen Teil 2 - Virtuelle Computer und Code Erzeugung&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Nico Michaelis genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil beschreibt den Bau einer VM und der Codeerzeugung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Delphi allgemein ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Debugging]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Debugging.gif|right]] &amp;quot;Debugger benutzen und andere praktische Tipps&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet von Nico mit der Nutzung des Delphi-Debuggers eingeführt. Auch werden Wege zur Vermeidung von Fehlern aufgezeigt. Genauso findet Ihr aber auch in diesem Tutorial Hinweise, zu häufig begangenen Fehlern und deren Ursachen.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Komponentenentwicklung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Komponentenentwicklung.png|right]] &amp;quot;Komponentenentwicklung&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet ihr ein wenig tiefer in die Entwicklung von Komponenten unter Delphi eingeführt. Es wird Grundwissen auf diesem Gebiet vorausgesetzt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Multithreading]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Multithreading.gif|right]] &amp;quot;Das Prinzip der Dualität&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Threads sind ein erweitertes Prinzip des bekannten Multitasking und werden innerhalb eines Programmes oft dazu genutzt, verschiedene Aufträge gleichzeitig abzuarbeiten. LossyEx erklärt euch hier deren Nutzung.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Software-Synthesizer]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Noexist.jpg|right]] &amp;quot;Software-Synthesizer&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Computerspiele bestehen nicht nur aus Grafik. Dieses Tutorial widmet sich einem ganz anderen Bereich der Spieleprogrammierung: Der Erzeugung von synthetischen Sounds und Musik.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Rendertechniken ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Octree]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Octree preview.jpg|right]] &amp;quot;Octrees&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Octrees sind eine einfach zu implementierende, aber sehr effiziente Möglichkeit um besonders Outdoor-Szenen abhängig vom Betrachterblickfeld stark zu beschleunigen. In diesem Tutorial zeigt Shadow euch eine komplette Implementation eines Octrees inklusive ausgiebigem Quellcode.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Frustum Culling]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Frustum Culling.jpg|right]] &amp;quot;Frustum Culling&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Frustum Culling ist eine einfache Möglichkeit die Rendergeschwindigkeit zu erhöhen, da man damit schon vor dem Senden der Daten an die Grafikkarten feststellen kann, welche Objekte sich im Blickfeld des Spielers befinden und welche nicht.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial GLScene]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial GLScene preview.jpg|right]] &amp;quot;Einführung in GLScene&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
GLScene ist eine zu erstaunlicher Größe angewachsene Komponentensammlung, die quasi einen OpenGL-Wrapper darstellt und euch dank Delphis VCL dadurch recht einfach OpenGL-Programme erstellen lässt. LaBoda gibt euch zu dieser Komponentensammlung in diesem Tutorial deshalb eine kleine Einführung.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Infinite</name></author>	</entry>

	</feed>