<?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=Global667</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=Global667"/>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php/Spezial:Beitr%C3%A4ge/Global667"/>
		<updated>2026-05-25T00:46:11Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Benutzer_Diskussion:Phobeus&amp;diff=25044</id>
		<title>Benutzer Diskussion:Phobeus</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Benutzer_Diskussion:Phobeus&amp;diff=25044"/>
				<updated>2011-02-15T16:12:48Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: Die Seite wurde neu angelegt: „Hallo, ich hätte Tuts für Qt (als Alternative zu SDL) oder lieber OpenCL anzubieten. Gruß --~~~~“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo, ich hätte Tuts für Qt (als Alternative zu SDL) oder lieber OpenCL anzubieten. Gruß --[[Benutzer:Global667|Global667]] 17:12, 15. Feb. 2011 (CET)&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Benutzer_Diskussion:Flash&amp;diff=25034</id>
		<title>Benutzer Diskussion:Flash</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Benutzer_Diskussion:Flash&amp;diff=25034"/>
				<updated>2011-02-08T19:57:18Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo Flash,&lt;br /&gt;
&lt;br /&gt;
wie wäre es, wenn ihr zum Thema „Tutorials“ auch eine Wunschliste, sowie eine TODO-Liste anlegt. So haben die Benutzer die Möglichkeit bestimmte Themen zu forcieren und als Autor hat man eine Orientierung bei der Themenwahl.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Global667|Global667]] 16:35, 22. Jan. 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
Ich würde vorschlagen, dass man dies auf der Diskussionsseite der [[Tutorial]]-Seite macht.&lt;br /&gt;
Alternativ auf der [[Wishlist]].&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 15:40, 24. Jan. 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
Hallo,&lt;br /&gt;
ich hätte Tuts für Qt (als Alternative zu SDL) oder lieber OpenCL anzubieten.&lt;br /&gt;
Gruß --[[Benutzer:Global667|Global667]] 20:57, 8. Feb. 2011 (CET)&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial&amp;diff=24647</id>
		<title>Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial&amp;diff=24647"/>
				<updated>2010-01-26T20:12:26Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Einsteiger-Tutorials */ rs&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://www.delphi-treff.de/tutorials/ Delphitutorials bei www.delphi-treff.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Delphi Source der Delphi Treff entstand durch den Zusammenschluss von Delphi-Source und dem Delphi-Treff und wurde mittlerweile wieder in Delphi-Treff umbenannt. 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;
|[http://crashkurs.christian-stelzmann.de/ Crashkurs von Christian Stelzmann]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Der Crashkurs von Christian erklärt neben den Grundlagen zur und über die Sprache auch die IDE anhand von zahlreichen einfachen Beispielen, die den Einstieg in Delphi stark vereinfachen und so eine einfache Einführung in die Arbeit mit Delphi bieten.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Wer sehen möchte was DGLer aus dem hier Gelernten und ihrer Kreativität so machen, findet Beispiele davon in der [[DGL_Projekte]]-Ecke.''&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;
{{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;
{|{{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 Quickstart]] (VCL)&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;
''In diesem Tutorial wird eine Codevorlage für OpenGL-Projekte geschaffen. Diese basiert allerdings auf Borlands Visual Component Library (VCL) und nicht auf SDL. '''Unabhängig davon beherbergt dieses Tutorial im 2. Teil einige allgemeingültige Hinweise für OpenGL-Anfänger.''' Wer nicht mit SDL arbeitet weil z.B. Plattformunabhängigkeit nicht gewünscht oder durch die Sprache bereits gegeben ist, kann diese Codebasis leicht auf seine Sprache übertragen.''&lt;br /&gt;
|-&lt;br /&gt;
![[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 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 empfängt euch Phobeus zu eurem ersten OpenGL Tutorial welches sich mit der Anwendung der OpenGL-API befasst.&lt;br /&gt;
|-&lt;br /&gt;
![[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 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 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 Lektion 6 ''&lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Dark Engine&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial wurde geplant aber niemals umgesetzt. Heute hätte es auch keine Relevanz mehr, da die Dark Engine nicht gepflegt wurde. Falls ihr ein gutes Einsteigertutorial als Ersatz vorschlagen wollt, könnt ihr dies im Feedback-Forum von DelphiGL.com tun.&lt;br /&gt;
|-&lt;br /&gt;
![[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 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;
|}&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 ColorPicking Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial_ColorPicking_Screenie.png|right]] &amp;quot;Color Picking Implementation mit Shadern&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die einfache Umsetzung von Color Picking ohne [[Shader]] enthält einige Nachteile die bei einer entsprechenden Umsetzung mit Shadern vermieden werden können. Dieses Tutorial zeigt eine shaderbasierte Methode ColorPicking so einzusetzen, dass es performant auch in größeren Szenen genutzt werden kann. Durch die Nutzung von Shadern und dem Fokus auf Optimierung des Selektionsvorganges sowie der Beachtung von Sonderfällen richtet sich dieses Tutorial an erfahrenere OpenGL Programmierer.&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 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 Delphic 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;
![[Tutorial Wassereffekt]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Wassertutorial-scrshot-preview.jpg|right]]In diesem Tutorial erklärt Lord Horazont wie man eine Wasserebene mit Brechungen mit und ohne Shader erzeugen kann.&lt;br /&gt;
|-&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;
Diese Extension führte '''VBO'''s ein. Wie man mit damit 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;
![[Tutorial_Framebufferobject]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Framebufferobject_Preview.jpg|right]] &amp;quot;GL_EXT_FRAMEBUFFER_OBJECT&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Deathball erklärt in diesem Tutorial wie man Framebufferobjekte erstellt und diese zum Offscreenrendern benutzt.&lt;br /&gt;
|-&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 Delphic 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 Delphic, 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 Delphic 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 innerhalb der Software haben können.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung3|Tutorial Softwareentwicklung 3]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE3_Interface.jpg|right|128px]] &amp;quot;Softwareentwicklung3 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im letzten Teil der Serie steht das Thema &amp;quot;Verhalten&amp;quot; im Zentrum. Flash erklärt euch wie die Klassen miteinander in Beziehung gesetzt werden. Außerdem wird nocheinmal auf den RUP als '''iterative''' Vorgehensweise eingegangen.&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 Delphic 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;
![[Tutorial Separating Axis Theorem]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:SAT_Kollision.jpg|right|128px]] &amp;quot;Separating Axis Theorem&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Seth erklärt in diesem Tutorial wie man Polygonkollisionen mit Hilfe des ''Seperating Axis Theorem'' erkennen kann. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision1_Coll2.png|128px|right]] &amp;quot;Kollision 1&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Reinhard Niehoff fragte uns ob er ein Tutorial über Kollision schreiben könnte. Das konnten wir nicht ablehnen, und so entstand dieses Tutorial in dem grundlegende Kollisionsberechnungen erklärt werden. Weitere sollen folgen. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision2]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision2_Thumb.png|128px|right]] &amp;quot;Kollision 2&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Beim zweiten Tutorial gehts mehr in die Tiefe und einige Spezialfälle bei Kugel-Polygon-Kollisionen werden erläutert. Mit dabei: Die [[Werkzeugkiste]] mit nützlichen Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision3]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision3_Thumb.png|128px|right]] &amp;quot;Kollision 3&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Beim letzten Tutorial dieser Serie gehts darum, wie man die bisherigen Ansätze in einem Programm unterbringt.&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 Delphic 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 Delphic 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 Delphic 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;
&lt;br /&gt;
== SDL ==&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 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;
![[Tutorial SDL_RWops]]&lt;br /&gt;
{{Level_2}}&lt;br /&gt;
| [[Bild:Noexist.jpg|right]] &amp;quot;SDL_RWops-Tutorial&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
SDL benutzt für den Dateizugriff SDL_RWops. [[Benutzer:Lord Horazont|Lord Horazont]] zeigt euch in diesen Tutorial wie man diese benutzt und auch komfortabler gestaltet.&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 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;
! [[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;
&lt;br /&gt;
== Raytracing ==&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 Raytracing - Grundlagen I]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_RaytracingI_thumb.jpg|right]] &amp;quot;Raytracing - Grundlagen I&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die Grundzüge des Raytracings Teil 1 - Von den Strahlen bis zur ersten Darstellung von Kugeln und Ebenen&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Raytracing - Grundlagen II]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_RaytracingI_thumb.jpg|right]] &amp;quot;Raytracing - Grundlagen II&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die Grundzüge des Raytracings Teil 2 - Einfache Basisobjekte, Transformationen und Phong-Lightning&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;br /&gt;
! [[Tutorial WebGL]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Datei:webgl-sporeviewer.jpg|128px|right]] &amp;quot;WebGL&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
WebGL ist der neue Standard für OpenGL im Browser. Der Standard ermöglicht es hardwarebeschleunigte 3D-Grafik mit Shadern im Browser darzustellen, ohne dabei auf spezielle Plugins angewiesen zu sein. [[Benutzer:Coolcat|Coolcat]] stellt euch in diesem Tutorial die Besonderheiten dieses JavaScript-Bindings für OpenGL ES 2.0 gegenüber anderen OpenGL-Anwendungen vor.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Tutorial&amp;diff=24646</id>
		<title>Diskussion:Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Tutorial&amp;diff=24646"/>
				<updated>2010-01-26T20:08:33Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich habe den Eindruck, dass hier seit OGL 2.0 nicht mehr viel passiert ist. Wann kommt der Prinz, der euch wachküsst ? Naja, egal. Ich würde mir eine Einführung oder Überblick über den aktuellen Stand von OGL &amp;gt; 3.0 wünschen. Es soll sich sehr viel geändert haben. Ein Tutorial über die neuen Möglichkeiten von OGL 3.2 und GLslang stehen für mich auch ganz oben auf der Wunschliste!! --[[Benutzer:Global667|Global667]] 21:08, 26. Jan. 2010 (CET) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn schon in der Beschreibung der Autor nochmal genannt wird, könnte man doch eigentlich auch gleich dessen Nick anklickbar machen. Ansonsten hätte man für diese Info doch auch auf der linken Seite noch genug Platz, so dass man Row-Span-Tabellen nutzen könnte, um Link, Autor und evtl. einen &amp;quot;Schwierigkeitsgrad&amp;quot; anzugeben. Vorlage könnt ich erstellen ...&lt;br /&gt;
MfG, --[[Benutzer:BenBE|BenBE]] 01:41, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
:Schwierigkeitsgrad gabs schonmal. Mal sehn. Könnte man mal machen.&lt;br /&gt;
:Das mit den Autoren is so ne Sache. Nicht jeder hat seine Userseite hier schön ausgefüllt. Ein Roter Link macht sich nicht so gut.&lt;br /&gt;
:--[[Benutzer:Flash|Flash]] 18:06, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
:: Denke mal das die paar Autoren die wir haben, ihre Benutzerseite schon ausfuellen keonnen.&lt;br /&gt;
:: Werde Nico mal anschreiben, der hat seine auch noch nicht ausgefuellt.&lt;br /&gt;
:: --[[Benutzer:Flo|Flo]] 21:02, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
:: Mit dem Schwierigkeitsgrad würd ich evtl. noch auf 5 Stufen gehen:&lt;br /&gt;
::# Absolut einsteigertauglich&lt;br /&gt;
::# Grundverständnis vorausgesetzt, Materie einfach&lt;br /&gt;
::# Einführung einer einfachen Technik zur Aufwertung eurer Anwendungen oder Vermittlung von Hintergrundwissen&lt;br /&gt;
::# Einführung einer umfangreichen Technik, die gewisse Vorkenntnisse im Gebiet voraussetzt.&lt;br /&gt;
::# Spezielle Abhandlung einer Technik mit speziellen Einsatzmöglichkeiten, die fundierte Kenntnisse der Materie voraussetzt.&lt;br /&gt;
:: Ansonsten sieht das schon recht gut aus. Die Sterne könnten evtl. etwas kleiner. Ansonsten evtl. auch noch Vorlagen dafür einrichten.&lt;br /&gt;
:: --[[Benutzer:BenBE|BenBE]] 23:27, 21. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
Sollte man nicht das Software-Entwicklungs-Tutorial unter Sonstige verschieben? Ich find das bei den Spiele-Tuts etwas unpassend.&lt;br /&gt;
--[[Benutzer:BenBE|BenBE]] 11:58, 1. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
Die Kategortie wurde ja entsprechend umbenannt. Das was beide Arten verbindet, ist das man lernt wie man Software strukturiert. Die SE Tuts sind theoretisch die SpieleTuts sind praktischer natur. Also ich finde, dass die zusammenpassen.&lt;br /&gt;
&lt;br /&gt;
Flash--[[Benutzer:Flash|Flash]] 22:26, 1. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Benutzer:Global667&amp;diff=24645</id>
		<title>Benutzer:Global667</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Benutzer:Global667&amp;diff=24645"/>
				<updated>2010-01-26T20:02:03Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: Die Seite wurde neu angelegt: „Bin Mac OS X Entwickler. Habe auch Erfahrung mit Windows und Linux (Server). C/C++, Qt und Schwerpunkt Brettspiele/Spieltheorie. Im Zuge meines aktuellen Projekts…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bin Mac OS X Entwickler. Habe auch Erfahrung mit Windows und Linux (Server). C/C++, Qt und Schwerpunkt Brettspiele/Spieltheorie. Im Zuge meines aktuellen Projekts brauche ich neues Wissen über Grafikentwicklung.&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Model_Loader&amp;diff=24644</id>
		<title>Model Loader</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Model_Loader&amp;diff=24644"/>
				<updated>2010-01-26T19:57:41Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Für was brauch ich das? */ rs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist das?==&lt;br /&gt;
Ein Modell-Loader ist eine Unit, oder DLL die ein 3D-Model in einem bestimmten Typ* vorliegt für ein Programm oder für was auch immer lädt, damit es angezeigt werden kann.&lt;br /&gt;
&lt;br /&gt;
==Für was brauch ich das?==&lt;br /&gt;
Wenn man 3D Modelle von speziellen Objekten (z.B. Einheiten, Landschaftsgegenstände und Gebäude in Strategiespiele, oder Gegner für Shooter) benötigt, ist es wesentlich komfortabler ein Modell in einem speziellen 3D Modellierungsprogramm zu modellieren, als es „von Hand“ in OpenGL zu bauen. Man muss allerdings anschließend die Daten (Informationen zur Geometrie, Texturierung eventl. Animierung) selbst aus den abgespeicherten Modellformaten extrahieren.&lt;br /&gt;
&lt;br /&gt;
Und genau da kommt der „Model Loader“ ins Spiel. Dieses Stück Code ermöglicht es dem Nutzer die Daten komfortabel aus den Dateien zu Laden. Das erleichtert die Arbeit im Vergleich zu selber gebauten Objekten natürlich enorm. Und die Modelle sehen, wenn man genügend Talent hat, auch meist wesentlich besser aus.&lt;br /&gt;
&lt;br /&gt;
==Speichern alle Formate Animationen?==&lt;br /&gt;
Nein! Es sind sogar nur recht wenige die Animationen bieten. Außerdem gibt es Modeller die Animationen nicht in einer Datei sondern in vielen Einzeldateien speichern. Allerdings heißt das nicht, dass nur die Modelle aus teuren Modellern Animationen (vernünftig) speichern können. Es gibt auch freie und günstige Software (Milkshape 3D), die so etwas kann.&lt;br /&gt;
&lt;br /&gt;
==Welche Modellformate gibt es?==&lt;br /&gt;
Hier eine kleine Auflistung der gebräuchlichsten Formate:&lt;br /&gt;
* .blend ([http://blender3d.org Blender])&lt;br /&gt;
* .collada ([http://www.khronos.org/collada/ Collada])&lt;br /&gt;
* .3ds (3D Studio)&lt;br /&gt;
* .lwo (Lightwave)&lt;br /&gt;
* .ms3d (Milkshape 3D)&lt;br /&gt;
* .bsp (ID Software BSP)&lt;br /&gt;
* .md3 (ID Software MD3)&lt;br /&gt;
* .x (Microsoft DirectX)&lt;br /&gt;
&lt;br /&gt;
==Wozu gibt es Exporter Plugins und Scripte?==&lt;br /&gt;
Für 3D Entwicker ist es wichtig, die erstellten Meshdaten auch in ein vorhandenes oder eigenes Format zu speichern.&lt;br /&gt;
Hierzu gibt es von den meisten 3D Editioren Plugins oder Scripte die dieses erledigen.&lt;br /&gt;
&lt;br /&gt;
Einige Programme wie 3DS Max und Blender bieten beides, wobei in Fall von 3DS Max lieber Plugins verwendet werden sollten (Geschwindigkeitsvorteil). Blender bietet für Scripte einen Python Interpreter, der lediglich ein bischen modifiziert wurde.&lt;br /&gt;
&lt;br /&gt;
Mit der Möglichkeit, eigene Format zu speichern, kann man sich auch aus dem Lizensproblem für bestimmte Formate rauswinden und man hat die Möglichkeit das Format an benötigte Bedingungen anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Format und Model Loader Liste ==&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Format&lt;br /&gt;
!width=&amp;quot;40%&amp;quot;| Format Features&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Loader&lt;br /&gt;
|-&lt;br /&gt;
| Cal3D&lt;br /&gt;
|&lt;br /&gt;
* kombinieren von Animationen (30%&amp;amp;nbsp;gehen, 50%&amp;amp;nbsp;rennen, 20%&amp;amp;nbsp;stolzieren und Winken)&lt;br /&gt;
* stufenloses [[Level of Detail]]&lt;br /&gt;
|&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! nutzbar mit&lt;br /&gt;
! Umgesetzte Features&lt;br /&gt;
|-&lt;br /&gt;
| [http://sourceforge.net/projects/cal3d/ Cal3D]&lt;br /&gt;
| C++&lt;br /&gt;
| alle Cal3D&amp;amp;nbsp;(0.10) Features&lt;br /&gt;
|-&lt;br /&gt;
| DCal3D&lt;br /&gt;
| Delphi / Object Pascal&lt;br /&gt;
| nur Cal3D&amp;amp;nbsp;0.6 Features&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 3DS&lt;br /&gt;
|&lt;br /&gt;
* Meshbasierendes 3D-Format&lt;br /&gt;
* Vertexbasierende Animationen via Keyframes&lt;br /&gt;
* Normalen werden indirekt über Smoothinggroups gesichert&lt;br /&gt;
'''Format stammt noch aus DOS-zeiten, daher diverse Einschränkungen :'''&lt;br /&gt;
* Maximal 65k Vertices pro [[Mesh]]&lt;br /&gt;
* Texturnamen sind auf [http://de.wikipedia.org/wiki/8.3 8.3 Dateinamen] beschränkt&lt;br /&gt;
* Bones werden nicht exportiert&lt;br /&gt;
* Normalen werden nicht exportiert (nur Smoothinggroups)&lt;br /&gt;
'''Kein freies Format'''&lt;br /&gt;
|&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! nutzbar mit&lt;br /&gt;
! Umgesetzte Features&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.delphigl.com/forum/viewtopic.php?t=2421 gl3ds]&lt;br /&gt;
| Delphi / Object Pascal&lt;br /&gt;
| Unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.lib3ds.org/ lib3ds]&lt;br /&gt;
| C/C++&lt;br /&gt;
| Unbekannt&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Technik_oder_Algorithmus]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Model_Loader&amp;diff=24643</id>
		<title>Model Loader</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Model_Loader&amp;diff=24643"/>
				<updated>2010-01-26T19:55:06Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Speichern alle Formate Animationen? */ rs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist das?==&lt;br /&gt;
Ein Modell-Loader ist eine Unit, oder DLL die ein 3D-Model in einem bestimmten Typ* vorliegt für ein Programm oder für was auch immer lädt, damit es angezeigt werden kann.&lt;br /&gt;
&lt;br /&gt;
==Für was brauch ich das?==&lt;br /&gt;
Wenn man 3D Modelle von speziellen Objekten (z.B. Einheiten, Landschaftsgegenstände und Gebäude in Strategiespiele, oder Gegner für Shooter) benötigt, ist es wesentlich komfortabler ein Modell in einem speziellen 3D Modellierungsprogramm zu modellieren, als es &amp;quot;von Hand&amp;quot; in OpenGL zu bauen. Man muss allerdings anschließend die Daten (Informationen zur Geometrie, Texturierung eventl. Animierung) selbst aus den Abgespeicherten Modellformaten extrahieren.&lt;br /&gt;
&lt;br /&gt;
Und genau da kommt der &amp;quot;Model Loader&amp;quot; ins Spiel. Dieses Stück Code ermöglicht es dem Nutzer die Daten komfortabel aus den Dateien zu Laden. Das erleichtert die Arbeit im Vergleich zu selber gebauten Objekten natürlich enorm. Und die Modelle sehen, wenn man genügend Talent hat, auch meist wesentlich besser aus.&lt;br /&gt;
&lt;br /&gt;
==Speichern alle Formate Animationen?==&lt;br /&gt;
Nein! Es sind sogar nur recht wenige die Animationen bieten. Außerdem gibt es Modeller die Animationen nicht in einer Datei sondern in vielen Einzeldateien speichern. Allerdings heißt das nicht, dass nur die Modelle aus teuren Modellern Animationen (vernünftig) speichern können. Es gibt auch freie und günstige Software (Milkshape 3D), die so etwas kann.&lt;br /&gt;
&lt;br /&gt;
==Welche Modellformate gibt es?==&lt;br /&gt;
Hier eine kleine Auflistung der gebräuchlichsten Formate:&lt;br /&gt;
* .blend ([http://blender3d.org Blender])&lt;br /&gt;
* .collada ([http://www.khronos.org/collada/ Collada])&lt;br /&gt;
* .3ds (3D Studio)&lt;br /&gt;
* .lwo (Lightwave)&lt;br /&gt;
* .ms3d (Milkshape 3D)&lt;br /&gt;
* .bsp (ID Software BSP)&lt;br /&gt;
* .md3 (ID Software MD3)&lt;br /&gt;
* .x (Microsoft DirectX)&lt;br /&gt;
&lt;br /&gt;
==Wozu gibt es Exporter Plugins und Scripte?==&lt;br /&gt;
Für 3D Entwicker ist es wichtig, die erstellten Meshdaten auch in ein vorhandenes oder eigenes Format zu speichern.&lt;br /&gt;
Hierzu gibt es von den meisten 3D Editioren Plugins oder Scripte die dieses erledigen.&lt;br /&gt;
&lt;br /&gt;
Einige Programme wie 3DS Max und Blender bieten beides, wobei in Fall von 3DS Max lieber Plugins verwendet werden sollten (Geschwindigkeitsvorteil). Blender bietet für Scripte einen Python Interpreter, der lediglich ein bischen modifiziert wurde.&lt;br /&gt;
&lt;br /&gt;
Mit der Möglichkeit, eigene Format zu speichern, kann man sich auch aus dem Lizensproblem für bestimmte Formate rauswinden und man hat die Möglichkeit das Format an benötigte Bedingungen anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Format und Model Loader Liste ==&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Format&lt;br /&gt;
!width=&amp;quot;40%&amp;quot;| Format Features&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Loader&lt;br /&gt;
|-&lt;br /&gt;
| Cal3D&lt;br /&gt;
|&lt;br /&gt;
* kombinieren von Animationen (30%&amp;amp;nbsp;gehen, 50%&amp;amp;nbsp;rennen, 20%&amp;amp;nbsp;stolzieren und Winken)&lt;br /&gt;
* stufenloses [[Level of Detail]]&lt;br /&gt;
|&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! nutzbar mit&lt;br /&gt;
! Umgesetzte Features&lt;br /&gt;
|-&lt;br /&gt;
| [http://sourceforge.net/projects/cal3d/ Cal3D]&lt;br /&gt;
| C++&lt;br /&gt;
| alle Cal3D&amp;amp;nbsp;(0.10) Features&lt;br /&gt;
|-&lt;br /&gt;
| DCal3D&lt;br /&gt;
| Delphi / Object Pascal&lt;br /&gt;
| nur Cal3D&amp;amp;nbsp;0.6 Features&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 3DS&lt;br /&gt;
|&lt;br /&gt;
* Meshbasierendes 3D-Format&lt;br /&gt;
* Vertexbasierende Animationen via Keyframes&lt;br /&gt;
* Normalen werden indirekt über Smoothinggroups gesichert&lt;br /&gt;
'''Format stammt noch aus DOS-zeiten, daher diverse Einschränkungen :'''&lt;br /&gt;
* Maximal 65k Vertices pro [[Mesh]]&lt;br /&gt;
* Texturnamen sind auf [http://de.wikipedia.org/wiki/8.3 8.3 Dateinamen] beschränkt&lt;br /&gt;
* Bones werden nicht exportiert&lt;br /&gt;
* Normalen werden nicht exportiert (nur Smoothinggroups)&lt;br /&gt;
'''Kein freies Format'''&lt;br /&gt;
|&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! nutzbar mit&lt;br /&gt;
! Umgesetzte Features&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.delphigl.com/forum/viewtopic.php?t=2421 gl3ds]&lt;br /&gt;
| Delphi / Object Pascal&lt;br /&gt;
| Unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.lib3ds.org/ lib3ds]&lt;br /&gt;
| C/C++&lt;br /&gt;
| Unbekannt&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Technik_oder_Algorithmus]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Model_Loader&amp;diff=24642</id>
		<title>Model Loader</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Model_Loader&amp;diff=24642"/>
				<updated>2010-01-26T19:53:30Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Wozu gibt es Exporter Plugins und Scripte? */ rs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist das?==&lt;br /&gt;
Ein Modell-Loader ist eine Unit, oder DLL die ein 3D-Model in einem bestimmten Typ* vorliegt für ein Programm oder für was auch immer lädt, damit es angezeigt werden kann.&lt;br /&gt;
&lt;br /&gt;
==Für was brauch ich das?==&lt;br /&gt;
Wenn man 3D Modelle von speziellen Objekten (z.B. Einheiten, Landschaftsgegenstände und Gebäude in Strategiespiele, oder Gegner für Shooter) benötigt, ist es wesentlich komfortabler ein Modell in einem speziellen 3D Modellierungsprogramm zu modellieren, als es &amp;quot;von Hand&amp;quot; in OpenGL zu bauen. Man muss allerdings anschließend die Daten (Informationen zur Geometrie, Texturierung eventl. Animierung) selbst aus den Abgespeicherten Modellformaten extrahieren.&lt;br /&gt;
&lt;br /&gt;
Und genau da kommt der &amp;quot;Model Loader&amp;quot; ins Spiel. Dieses Stück Code ermöglicht es dem Nutzer die Daten komfortabel aus den Dateien zu Laden. Das erleichtert die Arbeit im Vergleich zu selber gebauten Objekten natürlich enorm. Und die Modelle sehen, wenn man genügend Talent hat, auch meist wesentlich besser aus.&lt;br /&gt;
&lt;br /&gt;
==Speichern alle Formate Animationen?==&lt;br /&gt;
Nein! Es sind sogar nur recht wenige die Animationen bieten. Außerdem gibt es Modeller die Animationen nicht in einer Datei sondern in vielen Einzeldateien speichern. Allerdings heißt das nicht, dass nur die Modelle aus Teuren Modellern Animationen (vernünftig) speichern können. Es gibt auch freie und günstige Software(Milkshape 3D), die so etwas kann.&lt;br /&gt;
&lt;br /&gt;
==Welche Modellformate gibt es?==&lt;br /&gt;
Hier eine kleine Auflistung der gebräuchlichsten Formate:&lt;br /&gt;
* .blend ([http://blender3d.org Blender])&lt;br /&gt;
* .collada ([http://www.khronos.org/collada/ Collada])&lt;br /&gt;
* .3ds (3D Studio)&lt;br /&gt;
* .lwo (Lightwave)&lt;br /&gt;
* .ms3d (Milkshape 3D)&lt;br /&gt;
* .bsp (ID Software BSP)&lt;br /&gt;
* .md3 (ID Software MD3)&lt;br /&gt;
* .x (Microsoft DirectX)&lt;br /&gt;
&lt;br /&gt;
==Wozu gibt es Exporter Plugins und Scripte?==&lt;br /&gt;
Für 3D Entwicker ist es wichtig, die erstellten Meshdaten auch in ein vorhandenes oder eigenes Format zu speichern.&lt;br /&gt;
Hierzu gibt es von den meisten 3D Editioren Plugins oder Scripte die dieses erledigen.&lt;br /&gt;
&lt;br /&gt;
Einige Programme wie 3DS Max und Blender bieten beides, wobei in Fall von 3DS Max lieber Plugins verwendet werden sollten (Geschwindigkeitsvorteil). Blender bietet für Scripte einen Python Interpreter, der lediglich ein bischen modifiziert wurde.&lt;br /&gt;
&lt;br /&gt;
Mit der Möglichkeit, eigene Format zu speichern, kann man sich auch aus dem Lizensproblem für bestimmte Formate rauswinden und man hat die Möglichkeit das Format an benötigte Bedingungen anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Format und Model Loader Liste ==&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Format&lt;br /&gt;
!width=&amp;quot;40%&amp;quot;| Format Features&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Loader&lt;br /&gt;
|-&lt;br /&gt;
| Cal3D&lt;br /&gt;
|&lt;br /&gt;
* kombinieren von Animationen (30%&amp;amp;nbsp;gehen, 50%&amp;amp;nbsp;rennen, 20%&amp;amp;nbsp;stolzieren und Winken)&lt;br /&gt;
* stufenloses [[Level of Detail]]&lt;br /&gt;
|&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! nutzbar mit&lt;br /&gt;
! Umgesetzte Features&lt;br /&gt;
|-&lt;br /&gt;
| [http://sourceforge.net/projects/cal3d/ Cal3D]&lt;br /&gt;
| C++&lt;br /&gt;
| alle Cal3D&amp;amp;nbsp;(0.10) Features&lt;br /&gt;
|-&lt;br /&gt;
| DCal3D&lt;br /&gt;
| Delphi / Object Pascal&lt;br /&gt;
| nur Cal3D&amp;amp;nbsp;0.6 Features&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 3DS&lt;br /&gt;
|&lt;br /&gt;
* Meshbasierendes 3D-Format&lt;br /&gt;
* Vertexbasierende Animationen via Keyframes&lt;br /&gt;
* Normalen werden indirekt über Smoothinggroups gesichert&lt;br /&gt;
'''Format stammt noch aus DOS-zeiten, daher diverse Einschränkungen :'''&lt;br /&gt;
* Maximal 65k Vertices pro [[Mesh]]&lt;br /&gt;
* Texturnamen sind auf [http://de.wikipedia.org/wiki/8.3 8.3 Dateinamen] beschränkt&lt;br /&gt;
* Bones werden nicht exportiert&lt;br /&gt;
* Normalen werden nicht exportiert (nur Smoothinggroups)&lt;br /&gt;
'''Kein freies Format'''&lt;br /&gt;
|&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! nutzbar mit&lt;br /&gt;
! Umgesetzte Features&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.delphigl.com/forum/viewtopic.php?t=2421 gl3ds]&lt;br /&gt;
| Delphi / Object Pascal&lt;br /&gt;
| Unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.lib3ds.org/ lib3ds]&lt;br /&gt;
| C/C++&lt;br /&gt;
| Unbekannt&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Technik_oder_Algorithmus]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Model_Loader&amp;diff=24641</id>
		<title>Model Loader</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Model_Loader&amp;diff=24641"/>
				<updated>2010-01-26T19:52:10Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Welche Modellformate gibt es? */ Collada hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist das?==&lt;br /&gt;
Ein Modell-Loader ist eine Unit, oder DLL die ein 3D-Model in einem bestimmten Typ* vorliegt für ein Programm oder für was auch immer lädt, damit es angezeigt werden kann.&lt;br /&gt;
&lt;br /&gt;
==Für was brauch ich das?==&lt;br /&gt;
Wenn man 3D Modelle von speziellen Objekten (z.B. Einheiten, Landschaftsgegenstände und Gebäude in Strategiespiele, oder Gegner für Shooter) benötigt, ist es wesentlich komfortabler ein Modell in einem speziellen 3D Modellierungsprogramm zu modellieren, als es &amp;quot;von Hand&amp;quot; in OpenGL zu bauen. Man muss allerdings anschließend die Daten (Informationen zur Geometrie, Texturierung eventl. Animierung) selbst aus den Abgespeicherten Modellformaten extrahieren.&lt;br /&gt;
&lt;br /&gt;
Und genau da kommt der &amp;quot;Model Loader&amp;quot; ins Spiel. Dieses Stück Code ermöglicht es dem Nutzer die Daten komfortabel aus den Dateien zu Laden. Das erleichtert die Arbeit im Vergleich zu selber gebauten Objekten natürlich enorm. Und die Modelle sehen, wenn man genügend Talent hat, auch meist wesentlich besser aus.&lt;br /&gt;
&lt;br /&gt;
==Speichern alle Formate Animationen?==&lt;br /&gt;
Nein! Es sind sogar nur recht wenige die Animationen bieten. Außerdem gibt es Modeller die Animationen nicht in einer Datei sondern in vielen Einzeldateien speichern. Allerdings heißt das nicht, dass nur die Modelle aus Teuren Modellern Animationen (vernünftig) speichern können. Es gibt auch freie und günstige Software(Milkshape 3D), die so etwas kann.&lt;br /&gt;
&lt;br /&gt;
==Welche Modellformate gibt es?==&lt;br /&gt;
Hier eine kleine Auflistung der gebräuchlichsten Formate:&lt;br /&gt;
* .blend ([http://blender3d.org Blender])&lt;br /&gt;
* .collada ([http://www.khronos.org/collada/ Collada])&lt;br /&gt;
* .3ds (3D Studio)&lt;br /&gt;
* .lwo (Lightwave)&lt;br /&gt;
* .ms3d (Milkshape 3D)&lt;br /&gt;
* .bsp (ID Software BSP)&lt;br /&gt;
* .md3 (ID Software MD3)&lt;br /&gt;
* .x (Microsoft DirectX)&lt;br /&gt;
&lt;br /&gt;
==Wozu gibt es Exporter Plugins und Scripte?==&lt;br /&gt;
Für 3D Entwicker ist es wichtig, die erstellten Meshdaten auch in ein vorhandenes oder eigenes Format zu speicher.&lt;br /&gt;
Hierzu gibt es von den meisten 3D Editioren Plugins oder Scripte die dieses erledigen.&lt;br /&gt;
&lt;br /&gt;
Einige Programme wie 3DS Max und Blender bieten beides, wobei in Fall von 3DS Max lieber Plugins verwendet werden sollten(Geschwindigkeitsvorteil). Blender bietet für Scripte einen Python Interpreter, der lediglich ein bischen modifiziert wurde.&lt;br /&gt;
&lt;br /&gt;
Mit der Möglichkeit, eigene Format zu speichern, kann man sich auch aus dem Lizensproblem für bestimmte Formate rauswinden und man hat die Möglichkeit das Format an benötigte Bedingungen anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Format und Model Loader Liste ==&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Format&lt;br /&gt;
!width=&amp;quot;40%&amp;quot;| Format Features&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Loader&lt;br /&gt;
|-&lt;br /&gt;
| Cal3D&lt;br /&gt;
|&lt;br /&gt;
* kombinieren von Animationen (30%&amp;amp;nbsp;gehen, 50%&amp;amp;nbsp;rennen, 20%&amp;amp;nbsp;stolzieren und Winken)&lt;br /&gt;
* stufenloses [[Level of Detail]]&lt;br /&gt;
|&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! nutzbar mit&lt;br /&gt;
! Umgesetzte Features&lt;br /&gt;
|-&lt;br /&gt;
| [http://sourceforge.net/projects/cal3d/ Cal3D]&lt;br /&gt;
| C++&lt;br /&gt;
| alle Cal3D&amp;amp;nbsp;(0.10) Features&lt;br /&gt;
|-&lt;br /&gt;
| DCal3D&lt;br /&gt;
| Delphi / Object Pascal&lt;br /&gt;
| nur Cal3D&amp;amp;nbsp;0.6 Features&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 3DS&lt;br /&gt;
|&lt;br /&gt;
* Meshbasierendes 3D-Format&lt;br /&gt;
* Vertexbasierende Animationen via Keyframes&lt;br /&gt;
* Normalen werden indirekt über Smoothinggroups gesichert&lt;br /&gt;
'''Format stammt noch aus DOS-zeiten, daher diverse Einschränkungen :'''&lt;br /&gt;
* Maximal 65k Vertices pro [[Mesh]]&lt;br /&gt;
* Texturnamen sind auf [http://de.wikipedia.org/wiki/8.3 8.3 Dateinamen] beschränkt&lt;br /&gt;
* Bones werden nicht exportiert&lt;br /&gt;
* Normalen werden nicht exportiert (nur Smoothinggroups)&lt;br /&gt;
'''Kein freies Format'''&lt;br /&gt;
|&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! nutzbar mit&lt;br /&gt;
! Umgesetzte Features&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.delphigl.com/forum/viewtopic.php?t=2421 gl3ds]&lt;br /&gt;
| Delphi / Object Pascal&lt;br /&gt;
| Unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.lib3ds.org/ lib3ds]&lt;br /&gt;
| C/C++&lt;br /&gt;
| Unbekannt&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Technik_oder_Algorithmus]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glMultiTexCoord&amp;diff=24634</id>
		<title>glMultiTexCoord</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glMultiTexCoord&amp;diff=24634"/>
				<updated>2010-01-22T16:07:16Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Zugehörige Wertrückgaben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bildwunsch|Ein Multitexturing-Beispielbild. Das Detailmapping Bild von Sascha wird schon zu oft verwendet. ;) }}&lt;br /&gt;
= glMultiTexCoord =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glMultiTexCoord''' - setzt die aktuellen Texturcoordinaten bei [[Multitexturing]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glMultiTexCoord1i'''(''target'' : GLenum; ''s'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord2i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord3i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint; ''r'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord4i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint; ''r'' : GLint; ''q'' : GLint);&lt;br /&gt;
&lt;br /&gt;
 procedure '''glMultiTexCoord1iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord2iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord3iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord4iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außer den hier gezeigten Versionen für {{INLINE_CODE|[[GLint]]}}(i,iv) gibt es den Befehl noch für:&lt;br /&gt;
* {{INLINE_CODE|[[GLdouble]]}}(d,dv)&lt;br /&gt;
* {{INLINE_CODE|[[GLfloat]]}}(f,fv)&lt;br /&gt;
* {{INLINE_CODE|[[GLshort]]}}(s,sv)&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''target'' &lt;br /&gt;
| Bestimmt die Textureinheit, deren Koordinaten geändert werden soll. Die Anzahl der verfügbaren Textureinheiten ist Implementationsabhängig, muss aber mindestens zwei sein. ''target'' muss als Wert eine der '''GL_TEXTURE'''i Konstanten zugewiesen werden, wobei 0&amp;amp;nbsp;&amp;lt;&amp;amp;nbsp;i&amp;amp;nbsp;&amp;lt;&amp;amp;nbsp;'''GL_MAX_TEXTURE_UNITS&amp;amp;nbsp;-&amp;amp;nbsp;1''' sein muss. ('''GL_MAX_TEXTURE_UNITS''' ist eine implementationsabhängige Konstante)&lt;br /&gt;
|-&lt;br /&gt;
! ''s,t,r,q'' &lt;br /&gt;
| Bestimmt die s,t,r und q Texturkoordinate der gewählten Textureinheit. Der Initilisierungwert ist (0, 0, 0, 1). (''Nur bei Variante ohne '''v''' im Namen.)&lt;br /&gt;
|-&lt;br /&gt;
! ''v'' &lt;br /&gt;
| Ist ein Pointer auf ein Feld, welches die Texturkoordinaten in der Reihenfolge s,t,r,q enthält. Die Länge des Feldes ist dabei von der Befehlsversion abhängig.(1-4 Werte) (''Nur bei Variante mit '''v''' im Namen.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glMultiTexCoord''' definiert die Texturkoordinaten (s, t, r, q) für 1 bis 4 Dimensionen. Je nach genutzer Funktion werden die Koordinaten auf folgende Werte gesetzt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Funktion&lt;br /&gt;
!Wert&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord1&lt;br /&gt;
|(s, 0, 0, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, 0, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, r, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, r, q)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die aktuellen Texturkoordinaten sind Teil der Daten die sich auf jeden [[Vertex]] auswirken.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glMultiTexCoord''' ist nur verfügbar, wenn die OpenGL-Version 1.3 oder höher ist, oder wenn die Erweiterung '''ARB_multitexture''' unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
Die aktuellen Texturkoordinaten können jederzeit geändert werden. D.h. insbesondere, dass diese Funktion innerhalb eines {{INLINE_CODE|[[glBegin]]}}/{{INLINE_CODE|[[glEnd]]}} Blocks aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Es gilt immer: '''GL_TEXTURE'''i = '''GL_TEXTURE0''' + i&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
{{INLINE_CODE|[[glGet]]}} mit Token {{INLINE_CODE|[[glGet#GL_CURRENT_TEXTURE_COORDS|GL_CURRENT_TEXTURE_COORDS]]}}&lt;br /&gt;
&lt;br /&gt;
{{INLINE_CODE|[[glGet]]}} mit Token {{INLINE_CODE|[[glGet#GL_MAX_TEXTURE_COORDS|GL_MAX_TEXTURE_COORDS]]}}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glActiveTexture]], [[glClientActiveTexture]], [[glColor]], [[glGetIntegerv]], [[glNormal]], [[glTexCoordPointer]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|MultiTexCoord]]&lt;br /&gt;
[[Kategorie:GL1.3]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glMultiTexCoord&amp;diff=24633</id>
		<title>glMultiTexCoord</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glMultiTexCoord&amp;diff=24633"/>
				<updated>2010-01-22T16:05:41Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Hinweise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bildwunsch|Ein Multitexturing-Beispielbild. Das Detailmapping Bild von Sascha wird schon zu oft verwendet. ;) }}&lt;br /&gt;
= glMultiTexCoord =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glMultiTexCoord''' - setzt die aktuellen Texturcoordinaten bei [[Multitexturing]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glMultiTexCoord1i'''(''target'' : GLenum; ''s'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord2i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord3i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint; ''r'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord4i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint; ''r'' : GLint; ''q'' : GLint);&lt;br /&gt;
&lt;br /&gt;
 procedure '''glMultiTexCoord1iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord2iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord3iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord4iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außer den hier gezeigten Versionen für {{INLINE_CODE|[[GLint]]}}(i,iv) gibt es den Befehl noch für:&lt;br /&gt;
* {{INLINE_CODE|[[GLdouble]]}}(d,dv)&lt;br /&gt;
* {{INLINE_CODE|[[GLfloat]]}}(f,fv)&lt;br /&gt;
* {{INLINE_CODE|[[GLshort]]}}(s,sv)&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''target'' &lt;br /&gt;
| Bestimmt die Textureinheit, deren Koordinaten geändert werden soll. Die Anzahl der verfügbaren Textureinheiten ist Implementationsabhängig, muss aber mindestens zwei sein. ''target'' muss als Wert eine der '''GL_TEXTURE'''i Konstanten zugewiesen werden, wobei 0&amp;amp;nbsp;&amp;lt;&amp;amp;nbsp;i&amp;amp;nbsp;&amp;lt;&amp;amp;nbsp;'''GL_MAX_TEXTURE_UNITS&amp;amp;nbsp;-&amp;amp;nbsp;1''' sein muss. ('''GL_MAX_TEXTURE_UNITS''' ist eine implementationsabhängige Konstante)&lt;br /&gt;
|-&lt;br /&gt;
! ''s,t,r,q'' &lt;br /&gt;
| Bestimmt die s,t,r und q Texturkoordinate der gewählten Textureinheit. Der Initilisierungwert ist (0, 0, 0, 1). (''Nur bei Variante ohne '''v''' im Namen.)&lt;br /&gt;
|-&lt;br /&gt;
! ''v'' &lt;br /&gt;
| Ist ein Pointer auf ein Feld, welches die Texturkoordinaten in der Reihenfolge s,t,r,q enthält. Die Länge des Feldes ist dabei von der Befehlsversion abhängig.(1-4 Werte) (''Nur bei Variante mit '''v''' im Namen.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glMultiTexCoord''' definiert die Texturkoordinaten (s, t, r, q) für 1 bis 4 Dimensionen. Je nach genutzer Funktion werden die Koordinaten auf folgende Werte gesetzt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Funktion&lt;br /&gt;
!Wert&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord1&lt;br /&gt;
|(s, 0, 0, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, 0, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, r, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, r, q)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die aktuellen Texturkoordinaten sind Teil der Daten die sich auf jeden [[Vertex]] auswirken.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glMultiTexCoord''' ist nur verfügbar, wenn die OpenGL-Version 1.3 oder höher ist, oder wenn die Erweiterung '''ARB_multitexture''' unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
Die aktuellen Texturkoordinaten können jederzeit geändert werden. D.h. insbesondere, dass diese Funktion innerhalb eines {{INLINE_CODE|[[glBegin]]}}/{{INLINE_CODE|[[glEnd]]}} Blocks aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Es gilt immer: '''GL_TEXTURE'''i = '''GL_TEXTURE0''' + i&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGet]] mit Token [[glGet#GL_CURRENT_TEXTURE_COORDS|GL_CURRENT_TEXTURE_COORDS]]&lt;br /&gt;
&lt;br /&gt;
[[glGet]] mit Token [[glGet#GL_MAX_TEXTURE_COORDS|GL_MAX_TEXTURE_COORDS]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glActiveTexture]], [[glClientActiveTexture]], [[glColor]], [[glGetIntegerv]], [[glNormal]], [[glTexCoordPointer]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|MultiTexCoord]]&lt;br /&gt;
[[Kategorie:GL1.3]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glMultiTexCoord&amp;diff=24632</id>
		<title>glMultiTexCoord</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glMultiTexCoord&amp;diff=24632"/>
				<updated>2010-01-22T16:02:58Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Delphi-Spezifikation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bildwunsch|Ein Multitexturing-Beispielbild. Das Detailmapping Bild von Sascha wird schon zu oft verwendet. ;) }}&lt;br /&gt;
= glMultiTexCoord =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glMultiTexCoord''' - setzt die aktuellen Texturcoordinaten bei [[Multitexturing]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glMultiTexCoord1i'''(''target'' : GLenum; ''s'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord2i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord3i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint; ''r'' : GLint);&lt;br /&gt;
 procedure '''glMultiTexCoord4i'''(''target'' : GLenum; ''s'' : GLint; ''t'' : GLint; ''r'' : GLint; ''q'' : GLint);&lt;br /&gt;
&lt;br /&gt;
 procedure '''glMultiTexCoord1iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord2iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord3iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
 procedure '''glMultiTexCoord4iv'''(''target'' : GLenum; const ''v'' : PGLint);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außer den hier gezeigten Versionen für {{INLINE_CODE|[[GLint]]}}(i,iv) gibt es den Befehl noch für:&lt;br /&gt;
* {{INLINE_CODE|[[GLdouble]]}}(d,dv)&lt;br /&gt;
* {{INLINE_CODE|[[GLfloat]]}}(f,fv)&lt;br /&gt;
* {{INLINE_CODE|[[GLshort]]}}(s,sv)&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''target'' &lt;br /&gt;
| Bestimmt die Textureinheit, deren Koordinaten geändert werden soll. Die Anzahl der verfügbaren Textureinheiten ist Implementationsabhängig, muss aber mindestens zwei sein. ''target'' muss als Wert eine der '''GL_TEXTURE'''i Konstanten zugewiesen werden, wobei 0&amp;amp;nbsp;&amp;lt;&amp;amp;nbsp;i&amp;amp;nbsp;&amp;lt;&amp;amp;nbsp;'''GL_MAX_TEXTURE_UNITS&amp;amp;nbsp;-&amp;amp;nbsp;1''' sein muss. ('''GL_MAX_TEXTURE_UNITS''' ist eine implementationsabhängige Konstante)&lt;br /&gt;
|-&lt;br /&gt;
! ''s,t,r,q'' &lt;br /&gt;
| Bestimmt die s,t,r und q Texturkoordinate der gewählten Textureinheit. Der Initilisierungwert ist (0, 0, 0, 1). (''Nur bei Variante ohne '''v''' im Namen.)&lt;br /&gt;
|-&lt;br /&gt;
! ''v'' &lt;br /&gt;
| Ist ein Pointer auf ein Feld, welches die Texturkoordinaten in der Reihenfolge s,t,r,q enthält. Die Länge des Feldes ist dabei von der Befehlsversion abhängig.(1-4 Werte) (''Nur bei Variante mit '''v''' im Namen.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glMultiTexCoord''' definiert die Texturkoordinaten (s, t, r, q) für 1 bis 4 Dimensionen. Je nach genutzer Funktion werden die Koordinaten auf folgende Werte gesetzt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Funktion&lt;br /&gt;
!Wert&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord1&lt;br /&gt;
|(s, 0, 0, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, 0, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, r, 1)&lt;br /&gt;
|-&lt;br /&gt;
|glMultiTexCoord4&lt;br /&gt;
|(s, t, r, q)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die aktuellen Texturkoordinaten sind Teil der Daten die sich auf jeden [[Vertex]] auswirken.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glMultiTexCoord''' ist nur verfügbar, wenn die OpenGL-Version 1.3 oder höher ist, oder wenn die Erweiterung '''ARB_multitexture''' unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
Die aktuellen Texturkoordinaten können jederzeit geändert werden. D.h. insbesondere, dass diese Funktion innerhalb eines [[glBegin]]/glEnd Blocks aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Es gilt immer: '''GL_TEXTURE'''i = '''GL_TEXTURE0''' + i&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGet]] mit Token [[glGet#GL_CURRENT_TEXTURE_COORDS|GL_CURRENT_TEXTURE_COORDS]]&lt;br /&gt;
&lt;br /&gt;
[[glGet]] mit Token [[glGet#GL_MAX_TEXTURE_COORDS|GL_MAX_TEXTURE_COORDS]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glActiveTexture]], [[glClientActiveTexture]], [[glColor]], [[glGetIntegerv]], [[glNormal]], [[glTexCoordPointer]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|MultiTexCoord]]&lt;br /&gt;
[[Kategorie:GL1.3]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Beleuchtung&amp;diff=24631</id>
		<title>Beleuchtung</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Beleuchtung&amp;diff=24631"/>
				<updated>2010-01-22T15:40:43Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* ambientes Licht */ rs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie dem ein oder anderen bereits bekannt sein dürfte unterstützt [[OpenGL]] ja Lichtquellen. Ohne Beleuchtung wirkt alles platt und öde. Kugeln sehen aus wie Kreise und irgendwie kommt keine 3D Stimmung auf. Erst durch Licht wird aus dem &amp;quot;Na ja...&amp;quot; ein &amp;quot;Ahhh!&amp;quot;.&lt;br /&gt;
Dieser Artikel soll dem ein oder anderen nocheinmal nahebringen, wie die Lichteffekte (räumlicher Eindruck, Glanzpunkte) auf Oberflächen durch OpenGL berechnet werden.&lt;br /&gt;
&lt;br /&gt;
==Vorwissen==&lt;br /&gt;
Wie jeder wissen sollte, haben alle Objekte in OpenGL eine Farbe. Die Lichtberechnung fügt kein Licht im eigentlichen Sinne hinzu (wie auch? Sollte OpenGL Photonenteilchen implementieren? Einen &amp;quot;Lichtkegel&amp;quot; oder &amp;quot;Lichtstrahl&amp;quot; als solchen gibt es also nicht.), sondern ändert die Farbwerte entsprechend bestimmten Bedingungen (die Formeln die später noch folgen werden) ab.&lt;br /&gt;
&lt;br /&gt;
OpenGL benutzt für die Lichtberechnung das sogenannte Phong-Modell. Dieses kennt 3 verschiedene Lichtkomponenten:&lt;br /&gt;
* ambientes Licht: Ein gleichmäßiges Licht, welches alle Punkte der Welt gleichmäßig ausleuchtet.&lt;br /&gt;
* diffuses Licht: Ein Omnidirektionales Licht welches Punkte abhängig von ihrer Position ausleuchtet.&lt;br /&gt;
* spekulares Licht: Der Lichtanteil der Glanzpunkte auf glatten Oberflächen erzeugt.&lt;br /&gt;
&lt;br /&gt;
Beim letzten Punkt sieht man bereits, dass es mit dem Licht allein nicht getan ist. Auch die Eigenschaften von Oberflächen, also das '''Material''' aus dem diese bestehen wirkt sich auf die Lichtberechnung aus. OpenGL bietet in Sachen Materialen folgende Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
===Materialien===&lt;br /&gt;
{{Warnung|Die Auswahl ist nicht komplett. Sie beschränkt sich auf die wichtigsten Parameter. Genauere Hinweise findet ihr unter [[glMaterial]].}}&lt;br /&gt;
&lt;br /&gt;
'''GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR'''&lt;br /&gt;
: mit diesem Materialparametern könnt ihr einstellen, wie das Material die einzelnen Lichtkomponenten reflektieren soll. Die übergeben Werte an diese Parameter gleichen Farbwerten und entsprechen der Farbe der reflektierten Lichtkomponente.&lt;br /&gt;
&lt;br /&gt;
'''GL_EMISSION'''&lt;br /&gt;
: Material kann auch selbstleuchtend sein. Mit diesem Parameter könnt ihr einstellen, wie stark und in welcher Farbe das Material leuchten soll.&lt;br /&gt;
&lt;br /&gt;
'''GL_SHININESS'''&lt;br /&gt;
: mit diesem Parameter könnt ihr den Glanzlichtexponenten einstellen. Was das ist seht ihr in der Berechnungsformel für das Glanzlicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das DGL-Wiki verfügt über eine umfangreiche '''[[Materialsammlung]]''' aus der man passende Parameterwerte entnehmen kann.}}&lt;br /&gt;
&lt;br /&gt;
===Licht===&lt;br /&gt;
Die Eigenschaften des Lichts sind ebenfalls recht vielfältig. Neben den verschiedenen Lichtanteilen kann auch die Lichtrichtung, die Position der Lichtquelle und noch einiges mehr eingestellt werden. Welche Parameter es gibt könnt ihr im Artikel [[glLight]] nachlesen.&lt;br /&gt;
&lt;br /&gt;
Für die nachfolgenden Berechnung sind hauptsächlich nur die Eigenschaften&lt;br /&gt;
&lt;br /&gt;
'''GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR'''&lt;br /&gt;
: mit diesem Materialparametern könnt ihr einstellen, wie stark und in welcher Farbe die einzelnen Lichtkomponenten leuchten sollen.&lt;br /&gt;
&lt;br /&gt;
und&lt;br /&gt;
&lt;br /&gt;
'''GL_POSITION'''&lt;br /&gt;
: diese Eigenschaft bestimmt wo die Lichtquelle (in Raumkkordinaten) plaziert ist.&lt;br /&gt;
&lt;br /&gt;
Weiterhin kann über '''GL_SPOT_CUTOFF''' die Streuung der Lichtquelle eingestellt werden. Die nachfolgenden Formeln gehen davon aus, dass ein Punkt tatsächlich beleuchtet wird (quasi wird eine gleichmäßige Abstrahlung in alle Richtungen angenommen).&lt;br /&gt;
&lt;br /&gt;
==Berechnung==&lt;br /&gt;
===ambientes Licht===&lt;br /&gt;
Ambientes Licht sorgt für eine Art Grundbeleuchtung. Das ambiente Licht wirkt sich gleichmäßig auf alle Farbwerte eines jeden Vertexes aus. Bei der „Standardbeleuchtung“ von OpenGL (wenn Licht noch ausgeschaltet ist) wirken zum Beispiel Kugeln eher wie Kreise. Ambientes Licht ändert daran nichts. Denn '''alle''' Vertexe der Kugel werden gleich beleuchtet. Ambientes Licht dient nur dazu eine bestimmte Grundhelligkeit zu erzeugen. Vergleichbar mit dem Licht im Morgengrauen.&lt;br /&gt;
&lt;br /&gt;
Die '''Formel für ambientes Licht''' lautet:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bel_Amb_Formel.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
Der Materialkoeffizient ist die &amp;quot;Farbe&amp;quot;, die man in den Materialeigenschaften für das ambiente Licht eingestellt hat.&lt;br /&gt;
&lt;br /&gt;
===diffuses Licht===&lt;br /&gt;
Auch diffuses Licht wird auf alle Vertexe angewandt. Der Unterschied zu ambienten licht ist aber, dass bei der Berechnung nun auch die Position des zu beleuchtenden Punktes eine Rolle spielt. Dadurch entsteht dann auch der räumliche Eindruck (Plastizität).Cos alpha kann über das Skalarprodukt aus Normalenvektor und Lichtquellenvektor bestimmt werden.&lt;br /&gt;
&lt;br /&gt;
Die '''Formel für diffuses Licht''' ist dafür etwas komplizierter:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bel_Diff_Formel.png]]&lt;br /&gt;
&lt;br /&gt;
Als Verständinshilfe hier eine kleine Skizze:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bel_Diff_Skizze.png]]&lt;br /&gt;
&lt;br /&gt;
===spekulares Licht (Glanzlicht)===&lt;br /&gt;
Als krönender Abschluss noch die Glanzlichtberechnung. Jeder kennt die Glanzpunkte auf glatten Oberflächen (z.B. Billiardkugel). Die Formel ähnelt der für diffuses Licht. Allerdings streuen glatte Oberflächen weniger das Licht als stumpfe. Dadurch entsteht der bekannte Glanzpunkt.Cos beta kann über das Skalarprodukt zwischen Reflexionsvektor und Beobachtervektor bestimmt werden oder über das Skalarprodukt zwischen der Winkelhalbierenden H(zwischen Lichtquellenvektor und Beobachtervektor) und dem Normalenvektor.&lt;br /&gt;
&lt;br /&gt;
{{Warnung|In diesem Artikel wird das Phong-Modell beschrieben. OpenGL verwendet jedoch das leicht veränderte und schnellere Blinn-Phong-Modell. Weitere Details finden sich auf der [[Diskussion:Beleuchtung|Diskussionsseite]].}}&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Formal für spekulares Licht&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bel_Spec_Formel.png]]&lt;br /&gt;
&lt;br /&gt;
Hier ist besonders der Exponent über dem Kosinus zu erwähnen. Dieser kann über die eingangs erwähnte Lichteigenschaft '''GL_SHININESS''' expliziet eingestellt werden. Die Wirkung des Exponenten wird an der nachfolgenden Skizze erklärt. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Bel_Spec_Skizze.png]]&lt;br /&gt;
Beta ist also der Winkel zwischen dem direkten reflektierten Strahl und der Blickrichtung.&lt;br /&gt;
&lt;br /&gt;
Je größer '''m''' wird desto kleiner und deutlicher wird der Glanzpunkt und desto glatter wirkt die Oberfläche.&lt;br /&gt;
Die geometrische Wirkung von '''m''' kann man sich ungefähr so vorstellen: &lt;br /&gt;
: Je größer '''m''' wird desto mehr Licht aus dem Bereich ''Beta'' wird direkt zum Auge gespiegelt und nicht gestreut.&lt;br /&gt;
&lt;br /&gt;
===gesamtes Licht für einen Vertex===&lt;br /&gt;
Da alle Lichtkomponenten auf einen Vertex einwirken, ergibt sich die entgültige Färbung eines Vertex durch:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bel_Ges_Formel.png]]&lt;br /&gt;
&lt;br /&gt;
Hier tauchen dann auch die selbstleuchtenden Materialien wieder auf.&lt;br /&gt;
&lt;br /&gt;
==OpenGL Befehle==&lt;br /&gt;
Folgende Befehle werden im Zusammenhang mit Licht benutzt:&lt;br /&gt;
&lt;br /&gt;
[[glLight]]&amp;lt;br&amp;gt; &lt;br /&gt;
[[glEnable]] mit '''GL_LIGHT'''i und '''GL_LIGHTING'''&amp;lt;br&amp;gt; &lt;br /&gt;
[[glMaterial]]&lt;br /&gt;
&lt;br /&gt;
==Siehe Auch==&lt;br /&gt;
[[Normalen]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Benutzer_Diskussion:Flash&amp;diff=24630</id>
		<title>Benutzer Diskussion:Flash</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Benutzer_Diskussion:Flash&amp;diff=24630"/>
				<updated>2010-01-22T15:35:50Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: Die Seite wurde neu angelegt: „Hallo Flash,  wie wäre es, wenn ihr zum Thema „Tutorials“ auch eine Wunschliste, sowie eine TODO-Liste anlegt. So haben die Benutzer die Möglichkeit bestimm…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo Flash,&lt;br /&gt;
&lt;br /&gt;
wie wäre es, wenn ihr zum Thema „Tutorials“ auch eine Wunschliste, sowie eine TODO-Liste anlegt. So haben die Benutzer die Möglichkeit bestimmte Themen zu forcieren und als Autor hat man eine Orientierung bei der Themenwahl.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Global667|Global667]] 16:35, 22. Jan. 2010 (CET)&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lichts%C3%A4ule&amp;diff=24611</id>
		<title>Lichtsäule</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lichts%C3%A4ule&amp;diff=24611"/>
				<updated>2010-01-16T16:43:07Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
|&amp;lt;div style=&amp;quot;color:#00A000;font-size:125%&amp;quot;&amp;gt;&amp;lt;center&amp;gt;'''Hinweis:''' Dieser Artikel ist noch unvollständig.&amp;lt;br&amp;gt; [[:Kategorie:Unvollständig|siehe Text]]&amp;lt;/center&amp;gt;&amp;lt;p style=&amp;quot;color:#000000;font-size:75%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|width=&amp;quot;30px&amp;quot;|[[Bild:Incomplete.jpg|right|100px]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Kategorie:Unvollständig]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Bildwunsch|Ein Bild einer Lichtsäule aus einem Spiel wäre hier schön.}}&lt;br /&gt;
= Lichtsäulen =&lt;br /&gt;
Unter dem Begriff „Lichtsäulen“ kann man viele Effekte fassen. Das Einzige was alle Effekte gemein haben ist, dass sie meist mit [[Transparenz|transparenten]], hellen [[Textur]]en arbeiten, um ein Leuchten zu simulieren.&lt;br /&gt;
&lt;br /&gt;
Diese Lichtsäulen werden in Fantasy-Spielen oft benutzt, um Anwendung von Zaubersprüchen auf Figuren oder Gegenständen zu verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
=== Partikelsysteme===&lt;br /&gt;
Lichtsäulen können auch einfach nur aufsteigende leuchtende Punkte sein. Um diese zur erzeugen werden [[Partikelsystem]]e verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Zylinder ===&lt;br /&gt;
Ein Zylinder kann auch eine Lichtsäule darstellen. In dem man hierbei die Textur-[[Matrix]] durch  [[glTranslate|Verschiebung]]en so manipuliert, dass das Endresultat sich nach unten bewegende '''Lichtringe''' simuliert.&lt;br /&gt;
&lt;br /&gt;
=== Zwei sich überkreuzende Rechtecke===&lt;br /&gt;
Zwei sich überkreuzende [[Primitive|Quads]] können auch die Illusion einer Säule hervorrufen. Diese Technik wurde häufig für die Darstellung [[Polygon|polygon]]armer Bäume verwendet. &amp;lt;br&amp;gt;&lt;br /&gt;
Dies ist die schnellste aber auch unschönste Methode, wenn man auf [[Vertexprogramm]]e verzichtet.&lt;br /&gt;
&lt;br /&gt;
=== Billboard ===&lt;br /&gt;
Eine andere Möglichkeit wäre, nur ein [[Primitive|Rechteck]] mit [[Textur]] zu zeichnen, und dann durch entsprechende Ausrichtung zum Betrachter eine Säule oder einen Stahl vorzutäuschen. Diese Ausrichtungstechnik nennt man zylindrisches [[Billboard]]ing. Diese Illusion fliegt allerdings auf, wenn man von oben auf die Säule schaut, denn je weiter von oben man auf das zylindrische [[Billboard]] schaut, desto mehr erscheint es als Linie und nicht mehr als [[Primitive|Rechteck]].&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
Um die Effekte etwas prickelnder gestalten zu können, kann man mit [[Multitexturing]] auch mehrere Texturen auf die Oberfläche „[[Blenden|blenden]]“.&lt;br /&gt;
&lt;br /&gt;
== Weiteres Vorgehen ==&lt;br /&gt;
* Verweis auf sie Grundlagen. Oberflächen rendert...&lt;br /&gt;
* Texturierungsbefehle: {{INLINE_CODE|[[glTexCoord]]}}, {{INLINE_CODE|[[glTexParameter]]}}.&lt;br /&gt;
* ...&lt;br /&gt;
== Brauchbare Artikel ==&lt;br /&gt;
[[Blenden]], [[Multitexturing]], [[Texture Loader]], [[Billboard]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Anleitung]] [[Kategorie:Technik_oder_Algorithmus]] [[Kategorie:Effekt]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lichts%C3%A4ule&amp;diff=24610</id>
		<title>Lichtsäule</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lichts%C3%A4ule&amp;diff=24610"/>
				<updated>2010-01-16T16:34:25Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bildwunsch|Ein Bild einer Lichtsäule aus einem Spiel wäre hier schön.}}&lt;br /&gt;
= Lichtsäulen =&lt;br /&gt;
Unter dem Begriff „Lichtsäulen“ kann man viele Effekte fassen. Das Einzige was alle Effekte gemein haben ist, dass sie meist mit [[Transparenz|transparenten]], hellen [[Textur]]en arbeiten, um ein Leuchten zu simulieren.&lt;br /&gt;
&lt;br /&gt;
Diese Lichtsäulen werden in Fantasy-Spielen oft benutzt, um Anwendung von Zaubersprüchen auf Figuren oder Gegenständen zu verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
=== Partikelsysteme===&lt;br /&gt;
Lichtsäulen können auch einfach nur aufsteigende leuchtende Punkte sein. Um diese zur erzeugen werden [[Partikelsystem]]e verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Zylinder ===&lt;br /&gt;
Ein Zylinder kann auch eine Lichtsäule darstellen. In dem man hierbei die Textur-[[Matrix]] durch  [[glTranslate|Verschiebung]]en so manipuliert, dass das Endresultat sich nach unten bewegende '''Lichtringe''' simuliert.&lt;br /&gt;
&lt;br /&gt;
=== Zwei sich überkreuzende Rechtecke===&lt;br /&gt;
Zwei sich überkreuzende [[Primitive|Quads]] können auch die Illusion einer Säule hervorrufen. Diese Technik wurde häufig für die Darstellung [[Polygon|polygon]]armer Bäume verwendet. &amp;lt;br&amp;gt;&lt;br /&gt;
Dies ist die schnellste aber auch unschönste Methode, wenn man auf [[Vertexprogramm]]e verzichtet.&lt;br /&gt;
&lt;br /&gt;
=== Billboard ===&lt;br /&gt;
Eine andere Möglichkeit wäre, nur ein [[Primitive|Rechteck]] mit [[Textur]] zu zeichnen, und dann durch entsprechende Ausrichtung zum Betrachter eine Säule oder einen Stahl vorzutäuschen. Diese Ausrichtungstechnik nennt man zylindrisches [[Billboard]]ing. Diese Illusion fliegt allerdings auf, wenn man von oben auf die Säule schaut, denn je weiter von oben man auf das zylindrische [[Billboard]] schaut, desto mehr erscheint es als Linie und nicht mehr als [[Primitive|Rechteck]].&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
Um die Effekte etwas prickelnder gestalten zu können, kann man mit [[Multitexturing]] auch mehrere Texturen auf die Oberfläche „[[Blenden|blenden]]“.&lt;br /&gt;
&lt;br /&gt;
== Weiteres Vorgehen ==&lt;br /&gt;
* Verweis auf sie Grundlagen. Oberflächen rendert...&lt;br /&gt;
* Texturierungsbefehle: {{INLINE_CODE|[[glTexCoord]]}}, {{INLINE_CODE|[[glTexParameter]]}}.&lt;br /&gt;
* ...&lt;br /&gt;
== Brauchbare Artikel ==&lt;br /&gt;
[[Blenden]], [[Multitexturing]], [[Texture Loader]], [[Billboard]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Anleitung]] [[Kategorie:Technik_oder_Algorithmus]] [[Kategorie:Effekt]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Shadersammlung&amp;diff=24609</id>
		<title>Shadersammlung</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Shadersammlung&amp;diff=24609"/>
				<updated>2010-01-16T16:19:42Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Was sind Shader? */ Vorschlag, Grammatik&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was sind Shader?==&lt;br /&gt;
Die traditionelle [[Funktionspipeline]] der OpenGL ist sehr beschränkt, neuere [[Algorithmen]] erfordern eine viel höhere Flexibilität. [[Shader]] sind kleine Programme die es erlauben Teile der Funktionspipeline völlig frei zu programmieren. Dies bietet völlig neue Möglichkeiten. Auf der einen Seite sind Shader für Einsteiger eine gewisse Hürde, auf der anderen Seite können sie viele Dinge aber auch enorm vereinfachen. Aus diesem Grund wurde in OpenGL 3.1 sowie OpenGL ES 2.0 die feste Funktionspipeline entfernt, so dass Shader dort verpflichtend sind.&lt;br /&gt;
&lt;br /&gt;
Der Artikel [[Shader]] gibt einen ausführlichen Überblick zum Thema sowie eine [[Shader#Wie_geht_es_nun_weiter.3F|Linksammlung]] für den Einstieg.&lt;br /&gt;
&lt;br /&gt;
==Shader hinzufügen==&lt;br /&gt;
Die Shadersammlung braucht deine Hilfe um zu wachsen. Wenn du einen Shader bereitstellen könntest wäre dies ein toller Dienst für die Community.&lt;br /&gt;
&lt;br /&gt;
Wer einen Shader zur Shadersammlung hinzufügen möchte, findet am Ende dieses Seite eine [[#Vorlage|Vorlage]].&lt;br /&gt;
&lt;br /&gt;
==Schwierigkeitsgrad==&lt;br /&gt;
Es ist nicht leicht einen Schwierigkeitsgrad für Shader anzugeben, trotzdem haben wir dies einmal versucht. Der Schwierigkeitsgrad kann zumindest für Einsteiger einen groben Hinweis geben was man sich vielleicht mal anschauen könnte.&lt;br /&gt;
{|{{Prettytable_B1}} style=&amp;quot;margin-left:50px;&amp;quot;&lt;br /&gt;
| {{TableHead}} | {{ShaderLevel|1}}&lt;br /&gt;
| Der Shader ist für Einsteiger geeignet. Um den Shader herum wird keine zusätzliche Infrastruktur benötigt.&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}} | {{ShaderLevel|2}}&lt;br /&gt;
| Der Shader ist für Einsteiger geeignet, benötigt aber etwas zusätzliche Infrastruktur. Etwa benötigt ein Post-Processing-Shader ein [[FBO|FrameBufferObject]], für [[Bumpmapping]] wird eine [[Normalmap]] benötigt.&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}} | {{ShaderLevel|3}}&lt;br /&gt;
| Mittlerer Schwierigkeitsgrad. Der Shader ist etwas komplizierter und/oder benötigt viel zusätzliche Infrastruktur.&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}} | {{ShaderLevel|4}}&lt;br /&gt;
| Hoher Schwierigkeitsgrad. Der Shader ist kompliziert und/oder verwendet intensiv Extensions.&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}} | {{ShaderLevel|5}}&lt;br /&gt;
| Extremer Schwierigkeitsgrad...alles was es sonst noch gibt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==GLSL-Shader==&lt;br /&gt;
Die hier gelisteten Shader sind in Kategorien aufgeteilt. Weitere Kategorien dürfen bei Bedarf einfach ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
===Beleuchtung und Texturen===&lt;br /&gt;
Diese Kategorie umfasst alles vom einfachen Fixed-Function-Pipeline-Ersatz über PerPixel-Licht und Bumpmapping bis zu ShadowMaps. Der Shader-Einsteiger wird in dieser Kategorie sicherlich fündig.&lt;br /&gt;
{|{{Prettytable_B1}} width=100%&lt;br /&gt;
| {{TableHead}}  | [[shader_verysimple|Verysimple]] von [[Benutzer:damadmax|damadmax]] {{ShaderLevel|1}}&lt;br /&gt;
| {{Table150R2}} style=&amp;quot;text-align:center;&amp;quot; | (kein Bild vorhanden)&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Ein einfacher Shader, welcher eine Textur an Vertices bindet. Dieser Shader baut damit das Standardverhalten der festen Pipeline nach. {{ShaderLink|shader_verysimple}}&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_PerPixelLighting|Per Pixel-Beleuchtung]] von [[Benutzer:Ireyon|Ireyon]] {{ShaderLevel|1}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:shader_ppl.png|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Shader, der Per Pixel beleuchtet. {{ShaderLink|shader_PerPixelLighting}}&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_PerPixel_Lighting2|Per Pixel-Beleuchtung2]] von [[Benutzer:Olee|Olee]] {{ShaderLevel|1}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:PPLShader.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Beleuchtet Flächen nach Pixeln anstatt wie OpenGl-Licht je Vertex. Erlaubt unendlich weit entferntes Licht und beachtet [[glFog]]. {{ShaderLink|shader_PerPixel_Lighting2}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Post-Processing===&lt;br /&gt;
Post-Processing-Shader zeichnen sich dadurch aus, dass sie auf die gesamte Szene angewendet werden &amp;lt;u&amp;gt;nachdem&amp;lt;/u&amp;gt; diese bereits gerendert wurde. Üblicherweise wird die Szene zuerst mit einem [[FBO|FramebufferObject]] (FBO) in eine Textur gerendert. Anschließend wird diese Textur auf ein bildschirmfüllendes Quad gespannt und mit dem Post-Processing-Shader gerendert.&lt;br /&gt;
{|{{Prettytable_B1}} width=100%&lt;br /&gt;
| {{TableHead}}  | [[shader_sepia|Sepia-Shader]] von [[Benutzer:Markus|Markus]] {{ShaderLevel|2}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:shader_sepia_nachher.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Post-Processing-Shader, welcher einen Sepia-Farbfilter auf die Szene anwendet. {{ShaderLink|shader_sepia}}&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_radial_blur|Radial Blur]] von [[Benutzer:Markus|Markus]] {{ShaderLevel|2}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:shader_radial_blur_nachher.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Post-Processing-Shader, welcher die Szene ausgehend von einem beliebigen Punkt verwischt. {{ShaderLink|shader_radial_blur}}&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_blur2|Blur-Shader]] von [[Benutzer:Skeptiker|Skeptiker]] und [[Benutzer:Coolcat|Coolcat]] {{ShaderLevel|3}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Shader_blur_seerose_blured_small.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Post-Processing-Shader, welcher die Szene insgesamt verwischt. Dieser Shader kann beispielsweise genutzt werden um einen Glow-Effekt zu erreichen. {{ShaderLink|shader_blur2}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Geometrie===&lt;br /&gt;
Hier finden sich Shader die die Geometrie entweder komplett neu erzeugen oder stark verändern. Es muss nicht unbedingt Geometryshader oder Instancing sein, auch mit dem Vertexshader kann man schon viel anstellen. Ein klassisches Beispiel ist die Mesh-Animation.&lt;br /&gt;
{|{{Prettytable_B1}} width=100%&lt;br /&gt;
| {{TableHead}}  | [[shader_Terrain_GPU4|Heightmap-Terrain]] von [[Benutzer:Coolcat|Coolcat]] {{ShaderLevel|3}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Terrain.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Shader für ein Heightmap-Terrain der ShaderModel 4.0 Features nutzt. Das Terrain wird zur Laufzeit fast vollständig aus der Heightmap generiert, was ordentlich Speicherplatz spart. Im Fragmentshader werden drei Texturlayer mit Hilfe einer Alphamap interpoliert {{ShaderLink|shader_Terrain_GPU4}}&lt;br /&gt;
&lt;br /&gt;
'''Extensions:'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_EXT_gpu_shader4]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_Instancing|Instancing-Shader]] von [[Benutzer:Coolcat|Coolcat]] {{ShaderLevel|4}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:shader_Instancing.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Dieser Shader zeigt die Benutzung von [[GL_ARB_draw_instanced]]. Ein häufiger Anwendungsfall ist das rendern vieler gleichartiger Objekte. Die Extension beschleunigt derartige Anwendungen, in dem die Anzahl der API-Aufrufe und die Menge redundanter Daten reduziert wird. {{ShaderLink|shader_Instancing}}&lt;br /&gt;
&lt;br /&gt;
'''Extensions:'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_ARB_draw_instanced]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_EXT_gpu_shader4]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_EXT_texture_buffer_object]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_ARB_texture_float]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_tesselation|Tesselation-Shader]] von [[Benutzer:dj3hut1|dj3hut1]] {{ShaderLevel|4}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Tesselation_s.png|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Dieser Shader nutzt einen Geometry Shader um ein Dreieck zu tesselieren. {{ShaderLink|shader_tesselation}}&lt;br /&gt;
&lt;br /&gt;
'''Extensions:'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_ARB_geometry_shader4]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_normal_debug|Normal Debugging-Shader]] von [[Benutzer:dj3hut1|dj3hut1]] {{ShaderLevel|4}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Normal_debug_s.png|113px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Nützlicher Shader um ohne viel Aufwand die Normalen eines Modells anzuzeigen. {{ShaderLink|shader_normal_debug}}&lt;br /&gt;
&lt;br /&gt;
'''Extensions:'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_ARB_geometry_shader4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Partikel===&lt;br /&gt;
Natürlich kann man auch bei einem [[Partikelsystem]] Shader einsetzen. Mit etwas Geschick kann man die gesamte Berechnung sogar vollständig auf die Grafikkarte verlagern um die CPU zu entlasten.&lt;br /&gt;
{|{{Prettytable_B1}} width=100%&lt;br /&gt;
| {{TableHead}}  | [[GLSL_Partikel_2|GPU Partikelsystem]] von [[Benutzer:Coolcat|Coolcat]] {{ShaderLevel|5}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Partikel-Gravitation.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Ein GPU-Partikelsystem welches insbesondere auf SM4 Features wie Geometryshader und Transform-Feedback setzt. So ist auch eine Partikel-Partikel-Interaktion mit über 200.000 Partikeln ist kein Problem. {{ShaderLink|GLSL_Partikel_2}}&lt;br /&gt;
&lt;br /&gt;
'''Extensions:'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_EXT_geometry_shader4]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_NV_transform_feedback]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_EXT_gpu_shader4]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_EXT_texture_buffer_object]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_ARB_texture_float]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_EXT_texture_integer]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[GLSL_Partikel|GPU Partikelsystem für alte Hardware]] von [[Benutzer:Oc2k1|Oc2k1]] {{ShaderLevel|5}}&lt;br /&gt;
| {{Table150R2}} style=&amp;quot;text-align:center;&amp;quot; | (kein Bild vorhanden)&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Ebenfalls ein GPU-Partikelsystem, welches aber auf FramebufferObjects und Fragmentshader setzt. Damit sollte es auch auf älterer Hardware funktionieren. {{ShaderLink|GLSL_Partikel}}&lt;br /&gt;
&lt;br /&gt;
'''Extensions:'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_ARB_texture_float]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sonstiges===&lt;br /&gt;
Hier kommt alles rein was sonst nirgendwo rein passt und eine neue Kategorie nicht lohnenswert ist.&lt;br /&gt;
{|{{Prettytable_B1}} width=100%&lt;br /&gt;
| {{TableHead}}  | [[shader_game_of_life|Game of Life]] von [[Benutzer:dj3hut1|dj3hut1]] {{ShaderLevel|3}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Game_of_life_s.png|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Simuliert das altbekannte 'Game of Life' im Shader. {{ShaderLink|shader_game_of_life}}&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_Zufallsgenerator|Pseudozufallsgenerator]] von [[Benutzer:Coolcat|Coolcat]] {{ShaderLevel|4}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:shader_Zufallsgenerator.png|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Generierung von Pseudozufallszahlen im Shader mit [[GL_EXT_gpu_shader4]]. Außerdem eine Beispielanwendung: Ein reproduzierbares pesudozufälliges Verwirbelfeld für ein GPU-Partikelsystem. {{ShaderLink|shader_Zufallsgenerator}}&lt;br /&gt;
&lt;br /&gt;
'''Extensions:'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[GL_EXT_gpu_shader4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Non-GLSL-Shader==&lt;br /&gt;
In diesem Abschnitt findet ihr Shader die mit einer anderen Technik als GLSL geschrieben wurden.&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=100%&lt;br /&gt;
| {{TableHead}}  | [[shader_diffuse_bumpmapping(Cg)|Diffuse Bumpmapping (NVIDIA-Cg)]] von [[Benutzer:igel457|igel457]] {{ShaderLevel|2}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:shader_diffuse_bumpmapping_cg.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Wendet diffuses Bumpmapping auf eine beliebige Oberfläche an. {{ShaderLink|shader_diffuse_bumpmapping(Cg)}}&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_surface_scattering(ARB)|Surface Scattering (ARB)]] von [[Benutzer:dj3hut1|dj3hut1]] {{ShaderLevel|3}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Scattering_s.jpg|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Der Shader bestimmt die Distanz, die Licht durch ein Material zurücklegt. Auf diese Weise wird die Lichtdurchlässigkeit bestimmt. {{ShaderLink|shader_surface_scattering(ARB)}}&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_texturing(ARB)|Texturing (ARB)]] von [[Benutzer:dj3hut1|dj3hut1]] {{ShaderLevel|1}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Texarb_textured_s.png|166px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Demonstriert eine einfache Texturierung. {{ShaderLink|shader_texturing(ARB)}}&lt;br /&gt;
|-&lt;br /&gt;
| {{TableHead}}  | [[shader_phong_per_pixel(ARB)|Phong per Pixel (ARB)]] von [[Benutzer:dj3hut1|dj3hut1]] {{ShaderLevel|1}}&lt;br /&gt;
| {{Table150R2}} | [[Bild:Phong_arb_s.png|150px|150px]]&lt;br /&gt;
|-&lt;br /&gt;
| {{TableCell}}  | Per-Pixel-Beleuchtung. {{ShaderLink|shader_phong_per_pixel(ARB)}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Vorlage==&lt;br /&gt;
Die Shadersammlung braucht deine Hilfe um zu wachsen. Wenn du einen Shader bereitstellen könntest wäre dies ein toller Dienst für die Community.&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte müssen gemacht werden um einen Shader einzutragen:&lt;br /&gt;
# Erstelle mit Hilfe der [[Shaderartikelvorlage]] einen neuen Artikel. Dazu den wiki-Code der Vorlage einfach kopieren und in den neuen Artikel einfügen. Der Artikelname sollte mit dem Präfix &amp;lt;tt&amp;gt;shader_&amp;lt;/tt&amp;gt; beginnen, z.B. &amp;lt;tt&amp;gt;shader_Wasser2d&amp;lt;/tt&amp;gt; für einen 2D Wassershader.&lt;br /&gt;
# Da Shader zu 90% optische Effekte bewirken, sollte (mindestens) ein aussagekräftiges Beispielbild im Shaderartikel hinterlegt werden. Eines der Bilder sollte dann auch hier in der Liste verlinkt werden.&lt;br /&gt;
# Füge deinen Shader in die Shadersammlung ein. Verwende dazu dieses Template:&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt; |-&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt; | &amp;lt;nowiki&amp;gt;{{TableHead}}  | [[shader_Wasser2d|2D Wassershader]] von [[Benutzer:DeinName|DeinName]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt; | &amp;lt;nowiki&amp;gt;{{Table150R2}} | [[Bild:Wassershader2D.jpg|150px|150px]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt; |-&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt; | &amp;lt;nowiki&amp;gt;{{TableCell}}&amp;lt;/nowiki&amp;gt;  | Einige Sätze zur Beschreibung des Shaders. &amp;lt;nowiki&amp;gt;{{ShaderLink|shader_Wasser2d}}&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt; &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;'''Extensions:'''&amp;lt;br&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;Liste von notwendigen Extensions.&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt; |-&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Keine Angst, es muss nicht alles auf Anhieb perfekt sein.&lt;br /&gt;
&lt;br /&gt;
Falls du Fragen oder Probleme mit der Vorlage hast, im [[DGL-Chat]] oder [http://www.delphigl.com/forum/ Forum] hilft man immer gerne.&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Materialsammlung&amp;diff=24608</id>
		<title>Materialsammlung</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Materialsammlung&amp;diff=24608"/>
				<updated>2010-01-16T16:17:35Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Materialsammlung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
!!!!!!!! NUTZT DIESE TABELLE ALS VORLAGE FÜR WEITERE MATERIALTABELLEN !!!!!!!&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;
!rowspan=&amp;quot;2&amp;quot;|Material&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|Ambient&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Diffus&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Spekular&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Shininess &amp;lt;br&amp;gt;(Härte)&lt;br /&gt;
|-&lt;br /&gt;
|||Ra||Ga||Ba||Aa||&lt;br /&gt;
|Rd||Gd||Bd||Ad||&lt;br /&gt;
|Rs||Gs||Bs||As||&lt;br /&gt;
|-&lt;br /&gt;
|Jade			||||0.14||0.22||0.16||0.9||	||0.54||0.89||0.63||0.9||	||0.32||0.32||0.32||0.9||	||12.8&lt;br /&gt;
|-&lt;br /&gt;
|Obsidian		||||0.05||0.05||0.07||0.8||	||0.18||0.17||0.23||0.8||	||0.33||0.33||0.35||0.8||	||38.4&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Materialsammlung=&lt;br /&gt;
Die nachfolgende Sammlung stellt eine kategorisierte Zusammenstellung von Materialparametern dar, wie sie von {{INLINE_CODE|[[glMaterial]]}} genutzt werden.&lt;br /&gt;
Die Werte sind als Fließkommazahlen angegeben, und zwar so, wie sie von {{INLINE_CODE|[[glMaterialf]]/[[glMaterialfv]]}} benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit die Materialien korrekt dargestellt werden müssen folgende Einstellungen gemacht werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
glDisable(GL_COLOR_MATERIAL);&lt;br /&gt;
glEnable(GL_BLEND);&lt;br /&gt;
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Blending]] wird benötigt, da einige Materialien (z.B. Edelsteine) durchsichtig sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Edelsteine/Glas==&lt;br /&gt;
[[Bild:Mat_Tuerkis.jpg|right|framed|Kugel aus Türkis]]&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Material&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|Ambient&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Diffus&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Spekular&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Shininess &amp;lt;br&amp;gt;(Härte)&lt;br /&gt;
|-&lt;br /&gt;
|||Ra||Ga||Ba||Aa||&lt;br /&gt;
|Rd||Gd||Bd||Ad||&lt;br /&gt;
|Rs||Gs||Bs||As||&lt;br /&gt;
|-&lt;br /&gt;
|Jade			||||0.14||0.22||0.16||0.9||	||0.54||0.89||0.63||0.9||	||0.32||0.32||0.32||0.9||	||12.8&lt;br /&gt;
|-&lt;br /&gt;
|Obsidian		||||0.05||0.05||0.07||0.8||	||0.18||0.17||0.23||0.8||	||0.33||0.33||0.35||0.8||	||38.4&lt;br /&gt;
|-&lt;br /&gt;
|Perle			||||0.25||0.21||0.21||0.9||	||0.99||0.83||0.83||0.9||	||0.30||0.30||0.30||0.9||	||11.3&lt;br /&gt;
|-&lt;br /&gt;
|Rubin			||||0.17||0.01||0.01||0.5||	||0.61||0.04||0.04||0.5||	||0.73||0.63||0.63||0.5||	||76.8&lt;br /&gt;
|-&lt;br /&gt;
|Smaragdgrün		||||0.02||0.17||0.02||0.5||	||0.08||0.61||0.08||0.5||	||0.63||0.73||0.63||0.5||	||76.8&lt;br /&gt;
|-&lt;br /&gt;
|Türkis			||||0.10||0.19||0.17||0.8||	||0.40||0.74||0.69||0.8||	||0.30||0.31||0.31||0.8||	||12.8&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kunstoff==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Material&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|Ambient&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Diffus&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Spekular&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Shininess &amp;lt;br&amp;gt;(Härte)&lt;br /&gt;
|-&lt;br /&gt;
|||Ra||Ga||Ba||Aa||&lt;br /&gt;
|Rd||Gd||Bd||Ad||&lt;br /&gt;
|Rs||Gs||Bs||As||&lt;br /&gt;
|-&lt;br /&gt;
|Gummi(schwarz)		||||0.02||0.02||0.02||1.0||	||0.01||0.01||0.01||1.0||	||0.40||0.40||0.40||1.0||	||10.0&lt;br /&gt;
|-&lt;br /&gt;
|Plastik(schwarz)	||||0.00||0.00||0.00||1.0||	||0.01||0.01||0.01||1.0||	||0.50||0.50||0.50||1.0||	||32.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Metall==&lt;br /&gt;
[[Bild:Mat_Bronze.jpg|right|framed|Kugel aus Bronze]]&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Material&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|Ambient&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Diffus&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Spekular&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Shininess &amp;lt;br&amp;gt;(Härte)&lt;br /&gt;
|-&lt;br /&gt;
|||Ra||Ga||Ba||Aa||&lt;br /&gt;
|Rd||Gd||Bd||Ad||&lt;br /&gt;
|Rs||Gs||Bs||As||&lt;br /&gt;
|-&lt;br /&gt;
|Bronze			||||0.21||0.13||0.05||1.0||	||0.71||0.43||0.18||1.0||	||0.39||0.27||0.17||1.0||	||25.6&lt;br /&gt;
|-&lt;br /&gt;
|Bronze (poliert)	||||0.25||0.15||0.06||1.0||	||0.40||0.24||0.10||1.0||	||0.77||0.46||0.20||1.0||	||76.8&lt;br /&gt;
|-&lt;br /&gt;
|Chrom			||||0.25||0.25||0.25||1.0||	||0.40||0.40||0.40||1.0||	||0.77||0.77||0.77||1.0||	||76.8&lt;br /&gt;
|-&lt;br /&gt;
|Gold			||||0.25||0.20||0.07||1.0||	||0.75||0.61||0.23||1.0||	||0.63||0.65||0.37||1.0||	||51.2&lt;br /&gt;
|-&lt;br /&gt;
|Gold (poliert)		||||0.25||0.22||0.06||1.0||	||0.35||0.31||0.09||1.0||	||0.80||0.72||0.21||1.0||	||83.2&lt;br /&gt;
|-&lt;br /&gt;
|Kupfer			||||0.19||0.07||0.02||1.0||	||0.70||0.27||0.08||1.0||	||0.26||0.14||0.09||1.0||	||12.8&lt;br /&gt;
|-&lt;br /&gt;
|Kupfer (poliert)	||||0.23||0.09||0.03||1.0||	||0.55||0.21||0.07||1.0||	||0.58||0.22||0.07||1.0||	||51.2&lt;br /&gt;
|-&lt;br /&gt;
|Messing		||||0.33||0.22||0.03||1.0||	||0.78||0.57||0.11||1.0||	||0.99||0.94||0.81||1.0||	||27.9&lt;br /&gt;
|-&lt;br /&gt;
|Silber			||||0.19||0.19||0.19||1.0||	||0.51||0.51||0.51||1.0||	||0.51||0.51||0.51||1.0||	||51.2&lt;br /&gt;
|-&lt;br /&gt;
|Silber (poliert)	||||0.23||0.23||0.23||1.0||	||0.28||0.28||0.28||1.0||	||0.77||0.77||0.77||1.0||	||89.6&lt;br /&gt;
|-&lt;br /&gt;
|Zinn			||||0.11||0.06||0.11||1.0||	||0.43||0.47||0.54||1.0||	||0.33||0.33||0.52||1.0||	||9.8&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Tutorial_MultiTexturing&amp;diff=24607</id>
		<title>Diskussion:Tutorial MultiTexturing</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Tutorial_MultiTexturing&amp;diff=24607"/>
				<updated>2010-01-16T14:52:34Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Was ist mit dieser Aussage gemeint:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;... dadurch verdoppelte sich nicht nur die Anzahl der Polygone, sondern auch die Verknüpfungsmöglichkeiten des Blendings waren weit weniger nützlich als die beim Multitexturing...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In wie fern waren beim Blending weniger nützlich?&lt;br /&gt;
Und gibt es ein beispiel oder verweis auf ein Tutorial der zeigt wie man das mit mehr als nur einen Duchgang macht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::Wenn man für jede Texturebene den Berechnungsvorgang von neuem starten muss, verdoppelt sich die Menge der zu berechnenden Polygone bei zwei Texturenebenen natürlich. Bei dreien verdreifacht sich der Rechenaufwand... --[[Benutzer:Global667|Global667]] 15:52, 16. Jan. 2010 (CET)&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24606</id>
		<title>Tutorial MultiTexturing</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24606"/>
				<updated>2010-01-16T14:47:06Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Schritt 1 - Hardware auf Multitexturing-Fähigkeit prüfen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Tutorial Multitexturing=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Mit der Markteinführung von NVidias „Riva TNT“ (TwiNTexel Engine) hat auch das Multitexturing im PC-Grafikkartenbereich Einzug gefunden, und wird seit einigen Jahren von allen neu entwickelten Grafikchips unterstützt. Beim Multitexturing können den einzelnen Textureinheiten der Grafikkarte unterschiedliche [[Textur]]en zugeordnet werden, die dann später in einem Durchgang auf ein [[Polygon]] tapeziert bzw. verknüpft werden. Vor der Einführung dieser Technik musste man das Polygon im ersten Durchgang mit Textur A rendern und in einem zweiten Durchgang [[Blending]] aktivieren und es mit Textur B zeichnen. Dadurch verdoppelte sich nicht nur die Anzahl der Polygone, sondern auch die Verknüpfungsmöglichkeiten des Blendings waren weit weniger nützlich als die beim Multitexturing.&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Textureinheiten (TMU = Textur Mapping Unit) gibt an, wie viele Texturen in einem Durchgang auf eine Textur gezeichnet werden können. Bei einer „GeForce4“ sind dies z.&amp;amp;nbsp;B. 4 und bei den „Kyro“-Karten von PowerVR sogar bis zu 8 (obwohl man eher selten 8 Texturstufen benötigt). Besitzt eine Grafikkarte nun weniger TMUs als man gleichzeitig Texturen auf ein Polygon zeichnen möchte, dann wird die Arbeit in mehreren Durchgängen erledigt. Ein Grafikchip der nur 2 TMUs besitzt, braucht also 3 Durchgänge um ein Polygon mit 6 Texturen zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
Multitexturing ist heute besonders in Spielen ein unverzichtbares Mittel geworden. Dabei werden zwei Anwendungsmöglichkeiten häufig genutzt.Zum einen das [[Lightmap]], bei dem Schattenwurf und Lichteinfall auf ein Polygon vorberechnet und in einer separaten Textur abgelegt werden, sowie das [[Detailmapping|Detailtexturing]], bei dem die Basistextur mit einem Muster überzogen wird, das kleine Details simulieren soll.&lt;br /&gt;
&lt;br /&gt;
Im Falle des Beispielprogramms werden diese beiden Texturen mit Hilfe des Multitexturings mit der Basistextur verknüpft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
!Schritt1&lt;br /&gt;
|[[Bild:Multitex01.jpg|framed|Basistextur]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex02.jpg|framed|Lightmap]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
!Schritt2&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex03.jpg|framed|Detailtextur]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex05.jpg|framed|Endergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 1 - Hardware auf Multitexturing-Fähigkeit prüfen==&lt;br /&gt;
Bevor man das Multitexturing nutzen kann, sollte man natürlich erst einmal prüfen ob dies auch von der Hardware unterstützt wird. Es wird zwar kaum noch Grafikkarten geben, bei denen dies nicht der Fall ist, aber um sicherzugehen, ist dieser Schritt doch nötig.&lt;br /&gt;
&lt;br /&gt;
Dabei hat man zwei einfache Möglichkeiten. Entweder man prüft, ob die Erweiterung {{INLINE_CODE|[[GL_ARB_MULTITEXTURE]]}} von der Grafikkarte untersützt wird, oder man liest die Anzahl der TMUs mit dem Befehl {{INLINE_CODE|[[glGetIntegerv]]}} und dem Parameter {{INLINE_CODE|[[GL_MAX_TEXTURE_UNITS_ARB]]}} aus [06]. Ist dieser Wert kleiner als zwei, so wird das Multitexturing nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure TForm1.GLInit;&lt;br /&gt;
[02]  var&lt;br /&gt;
[03]     TMUs  : Integer;&lt;br /&gt;
[04]  begin&lt;br /&gt;
[05]       ActivateRenderingContext(FDC, FRC);&lt;br /&gt;
[06]       glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, @TMUs);&lt;br /&gt;
[07]       if TMUs &amp;lt; 2 then&lt;br /&gt;
[08]       begin&lt;br /&gt;
[09]            ShowMessage('Sorry!Your card doesn''t support Multitexturing');&lt;br /&gt;
[10]            Close;&lt;br /&gt;
[11]       end;&lt;br /&gt;
...&lt;br /&gt;
[12]  end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 2 - Texturstufen festlegen==&lt;br /&gt;
Hat man sich nun von den Multitexture-Fähigkeiten der Grafikkarte überzeugt, kann man endlich damit beginnen, die einzelnen Texturen ihren Texturstufen zuzuordnen. Auf die Texturstufen wird in OpenGL mit Hilfe der Konstanten {{INLINE_CODE|GL_TEXTURE0...GL_TEXTURE31}} zugegriffen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure DrawRoom;&lt;br /&gt;
[02]  begin&lt;br /&gt;
...&lt;br /&gt;
[03]       glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[04]       if TSActive[0] then&lt;br /&gt;
[05]       begin&lt;br /&gt;
[06]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[07]            Texture[2].Bind;&lt;br /&gt;
[08]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[09]       end&lt;br /&gt;
[10]       else&lt;br /&gt;
[11]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[12]       glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[13]       if TSActive[1] then&lt;br /&gt;
[14]       begin&lt;br /&gt;
[15]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[16]            Texture[4].Bind;&lt;br /&gt;
[17]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[18]       end&lt;br /&gt;
[19]       else&lt;br /&gt;
[20]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[21]       glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[22]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[23]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion {{INLINE_CODE|[[glActiveTexture]](target : Cardinal)}} wird die im Parameter {{INLINE_CODE|target}} angegebene Texturstufe aktiviert, Zeile [03], [12] und [21]. Von nun an beziehen sich alle Befehle, die etwas an einer Textur verändern (Binden von Texturen, Blending, Alphamasking, Veränderung der Texturmatrix, etc.) auf diese aktivierte Texturstufe, und zwar solange, bis auf ihr das Texturing deaktiviert wird oder die Texturstufe gewechselt wird.&lt;br /&gt;
&lt;br /&gt;
Um nun die Texturstufe zu aktiveren, muss wie gewohnt mit dem Befehl {{INLINE_CODE|[[glEnable]]}} und dem Parameter {{INLINE_CODE|[[GL_TEXTURE_2D]]}} das 2D-Texturing aktiviert werden. Dies muss für jede Texturstufe geschehen, die genutzt wird, Zeile [06], [15] und [22]. Möchte man eine Texturstufe ausschalten, so wählt man diese aus und nutzt {{INLINE_CODE|[[glDisable]]}} mit dem Parameter {{INLINE_CODE|GL_TEXTURE_2D}}, Zeile [11] und [20].&lt;br /&gt;
&lt;br /&gt;
Bevor nun die Polygone gezeichnet werden, muss für jede Texturstufe die Art der Verknüpfung mit den anderen Texturstufen festgelegt werden. Dies geschieht mit dem Befehl {{INLINE_CODE|[[glTexEnv]]i}}, der als Parameter das Ziel des Parameters (in unseren Falle {{INLINE_CODE|[[GL_TEXTURE_ENV]]}}, was bedeutet, das als Grundwerte die Ausgabewerte der vorherigen Texturstufe genutzt werden), den Parameter selbst (auch {{INLINE_CODE|GL_TEXTURE_ENV}}) und die Art der Verknüpfung erhält.&lt;br /&gt;
&lt;br /&gt;
Für die Basistextur wird dieser Parameter auf {{INLINE_CODE|[[GL_REPLACE]]}} gesetzt [23], alles was vor dieser Textur kam wird also überschrieben. Der Parameter {{INLINE_CODE|[[GL_MODULATE]]}} für die Lightmap [08] und die Detailtextur [17] geben an, das deren Farbwerte mit den vorherigen Werten multipliziert werden. Neben diesen Verknüpfungen gibt es noch etliche andere, die jedoch weniger oft, oder für andere Anwendungen wie z.&amp;amp;nbsp;B. BumpMapping verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Schritt 3 - Übergabe der Texturkoordinaten==&lt;br /&gt;
Nachdem die Texturstufen nun vorbereitet wurden, müssen für diese noch die Texturkoordinaten festgelegt werden. Wurde dies vorher mit der Funktion {{INLINE_CODE|[[glTexCoord2f]](s,t : single)}} erledigt, so wird nun die an das Multitexturing angepasste Variante {{INLINE_CODE|[[glMultiTexCoord2f]](target : cardinal;s,t : single)}} genutzt. Im Parameter {{INLINE_CODE|target}} wird die Texturstufe gewählt und in {{INLINE_CODE|s}} bzw. {{INLINE_CODE|t}} wie gewohnt die Texturkoordinaten übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[02]  Texture[6].Bind;&lt;br /&gt;
&lt;br /&gt;
[03]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[04]  Texture[0].Bind;&lt;br /&gt;
&lt;br /&gt;
[05]  glBegin(GL_QUADS);&lt;br /&gt;
[06]    glMultiTexCoord2f(GL_TEXTURE0, 0, 0);&lt;br /&gt;
[07]    glMultiTexCoord2f(GL_TEXTURE1, 0, 0);&lt;br /&gt;
[08]    glMultiTexCoord2f(GL_TEXTURE2, 0, 0);&lt;br /&gt;
[09]      glVertex3f(px, py, pz);&lt;br /&gt;
[10]    glMultiTexCoord2f(GL_TEXTURE0, 0, 2);&lt;br /&gt;
[11]    glMultiTexCoord2f(GL_TEXTURE1, 0, 1);&lt;br /&gt;
[12]    glMultiTexCoord2f(GL_TEXTURE2, 0, 8);&lt;br /&gt;
[13]      glVertex3f(px, py, pz + pLength);&lt;br /&gt;
[14]    glMultiTexCoord2f(GL_TEXTURE0, 2, 2);&lt;br /&gt;
[15]    glMultiTexCoord2f(GL_TEXTURE1, 1, 1);&lt;br /&gt;
[16]    glMultiTexCoord2f(GL_TEXTURE2, 8, 8);&lt;br /&gt;
[17]      glVertex3f(px + pWidth, py, pz + pLength);&lt;br /&gt;
[18]    glMultiTexCoord2f(GL_TEXTURE0, 2, 0);&lt;br /&gt;
[19]    glMultiTexCoord2f(GL_TEXTURE1, 1, 0);&lt;br /&gt;
[20]    glMultiTexCoord2f(GL_TEXTURE2, 8, 0);&lt;br /&gt;
[21]      glVertex3f(px + pWidth, py, pz);&lt;br /&gt;
[22]  glEnd;&lt;br /&gt;
&lt;br /&gt;
[23]  glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[24]  if TSActive[1] then&lt;br /&gt;
[25]  begin&lt;br /&gt;
[26]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[27]       Texture[4].Bind;&lt;br /&gt;
[28]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[29]  end&lt;br /&gt;
[30]  else&lt;br /&gt;
[31]      glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[32]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[33]  glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[34]  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie in dieser, aus dem Beispielprogramm entnommenen Prozedur sichtbar, werden vor dem Zeichnen des Quads zuerst die Texturen an die einzelnen Texturstufen gebunden. In [01] und [02] wird die Lightmap an die Texturstufe 1 gebunden und in [03] und [04] wird die Basistextur für diesen Quad an Texturstufe 0 gebunden. Da die an Texturstufe 2 gebundene Detailtextur bereits vorher definiert wurde und sich für diesen Quad nicht ändert, muss diese hier nicht gebunden werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden nur noch die Texturkoordinaten an jede genutzte Texturstufe für jeden Eckpunkt des Polygons übergeben um es mit den an die Stufen gebundenen Texturen zu überziehen.&lt;br /&gt;
&lt;br /&gt;
==Das Beispielprogramm==&lt;br /&gt;
Das von mir zu diesem Tutorial geschriebene Beispielprogramm benutzt 3 Texturstufen. Texturstufe 0 für die Basistextur, Texturstufe 1 für die Lightmap und Texturstufe 2 für die Detailtextur. Die Texturstufen 1 und 2 können mit den entsprechenden Ziffern auf der Tastatur aktiviert bzw. deaktiviert werden. Mit der Maus wird der Blickwinkel verändert und mit Cursor Hoch/Runter kann man sich bewegen.&lt;br /&gt;
&lt;br /&gt;
Die Lightmaps wurden von mir in einem herkömmlichen Zeichenprogramm erstellt, es steckt also kein Radiosity-Renderer dahinter.&lt;br /&gt;
&lt;br /&gt;
Das Programm wurde unter Delphi 6.0 geschrieben, sollte jedoch ab Delphi 4.0 kompilierbar sein.&lt;br /&gt;
Das Programm läuft natürlich nur auf Grafikkarten, die Multitexturing in der Hardware unterstützen. Dies ist jedoch seit der Riva TNT bei allen Karten der Fall.&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Screenshot aus dem Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Multitex06.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Autor: [[Benutzer:Sascha_Willems|Sascha Willems]]&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
[http://www.delphigl.de/files/multitex.zip Das Multitexturingdemo (inklusive Quellcode) herunterladen]&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|[[Tutorial Bumpmaps mit Blender]]|[[Tutorial StencilSpiegel]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Multitexturing]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24605</id>
		<title>Tutorial MultiTexturing</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24605"/>
				<updated>2010-01-16T14:44:47Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Einleitung */ Links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Tutorial Multitexturing=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Mit der Markteinführung von NVidias „Riva TNT“ (TwiNTexel Engine) hat auch das Multitexturing im PC-Grafikkartenbereich Einzug gefunden, und wird seit einigen Jahren von allen neu entwickelten Grafikchips unterstützt. Beim Multitexturing können den einzelnen Textureinheiten der Grafikkarte unterschiedliche [[Textur]]en zugeordnet werden, die dann später in einem Durchgang auf ein [[Polygon]] tapeziert bzw. verknüpft werden. Vor der Einführung dieser Technik musste man das Polygon im ersten Durchgang mit Textur A rendern und in einem zweiten Durchgang [[Blending]] aktivieren und es mit Textur B zeichnen. Dadurch verdoppelte sich nicht nur die Anzahl der Polygone, sondern auch die Verknüpfungsmöglichkeiten des Blendings waren weit weniger nützlich als die beim Multitexturing.&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Textureinheiten (TMU = Textur Mapping Unit) gibt an, wie viele Texturen in einem Durchgang auf eine Textur gezeichnet werden können. Bei einer „GeForce4“ sind dies z.&amp;amp;nbsp;B. 4 und bei den „Kyro“-Karten von PowerVR sogar bis zu 8 (obwohl man eher selten 8 Texturstufen benötigt). Besitzt eine Grafikkarte nun weniger TMUs als man gleichzeitig Texturen auf ein Polygon zeichnen möchte, dann wird die Arbeit in mehreren Durchgängen erledigt. Ein Grafikchip der nur 2 TMUs besitzt, braucht also 3 Durchgänge um ein Polygon mit 6 Texturen zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
Multitexturing ist heute besonders in Spielen ein unverzichtbares Mittel geworden. Dabei werden zwei Anwendungsmöglichkeiten häufig genutzt.Zum einen das [[Lightmap]], bei dem Schattenwurf und Lichteinfall auf ein Polygon vorberechnet und in einer separaten Textur abgelegt werden, sowie das [[Detailmapping|Detailtexturing]], bei dem die Basistextur mit einem Muster überzogen wird, das kleine Details simulieren soll.&lt;br /&gt;
&lt;br /&gt;
Im Falle des Beispielprogramms werden diese beiden Texturen mit Hilfe des Multitexturings mit der Basistextur verknüpft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
!Schritt1&lt;br /&gt;
|[[Bild:Multitex01.jpg|framed|Basistextur]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex02.jpg|framed|Lightmap]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
!Schritt2&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex03.jpg|framed|Detailtextur]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex05.jpg|framed|Endergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 1 - Hardware auf Multitexturing-Fähigkeit prüfen==&lt;br /&gt;
Bevor man das Multitexturing nutzen kann, sollte man natürlich erst einmal prüfen ob dies auch von der Hardware unterstützt wird. Es wird zwar kaum noch Grafikkarten geben, bei denen dies nicht der Fall ist, aber um sicherzugehen ist dieser Schritt doch nötig.&lt;br /&gt;
&lt;br /&gt;
Dabei hat man zwei einfache Möglichkeiten. Entweder man prüft, ob die Erweiterung GL_ARB_MULTITEXTURE von der Grafikkarte untersützt wird, oder man liest die Anzahl der TMUs mit dem Befehl [[glGetIntegerv]] und dem Parameter GL_MAX_TEXTURE_UNITS_ARB aus [06].Ist dieser Wert kleiner als zwei, so wird das Multitexturing nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure TForm1.GLInit;&lt;br /&gt;
[02]  var&lt;br /&gt;
[03]     TMUs  : Integer;&lt;br /&gt;
[04]  begin&lt;br /&gt;
[05]       ActivateRenderingContext(FDC, FRC);&lt;br /&gt;
[06]       glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, @TMUs);&lt;br /&gt;
[07]       if TMUs &amp;lt; 2 then&lt;br /&gt;
[08]       begin&lt;br /&gt;
[09]            ShowMessage('Sorry!Your card doesn''t support Multitexturing');&lt;br /&gt;
[10]            Close;&lt;br /&gt;
[11]       end;&lt;br /&gt;
...&lt;br /&gt;
[12]  end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 2 - Texturstufen festlegen==&lt;br /&gt;
Hat man sich nun von den Multitexture-Fähigkeiten der Grafikkarte überzeugt, kann man endlich damit beginnen, die einzelnen Texturen ihren Texturstufen zuzuordnen. Auf die Texturstufen wird in OpenGL mit Hilfe der Konstanten {{INLINE_CODE|GL_TEXTURE0...GL_TEXTURE31}} zugegriffen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure DrawRoom;&lt;br /&gt;
[02]  begin&lt;br /&gt;
...&lt;br /&gt;
[03]       glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[04]       if TSActive[0] then&lt;br /&gt;
[05]       begin&lt;br /&gt;
[06]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[07]            Texture[2].Bind;&lt;br /&gt;
[08]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[09]       end&lt;br /&gt;
[10]       else&lt;br /&gt;
[11]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[12]       glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[13]       if TSActive[1] then&lt;br /&gt;
[14]       begin&lt;br /&gt;
[15]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[16]            Texture[4].Bind;&lt;br /&gt;
[17]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[18]       end&lt;br /&gt;
[19]       else&lt;br /&gt;
[20]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[21]       glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[22]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[23]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion {{INLINE_CODE|[[glActiveTexture]](target : Cardinal)}} wird die im Parameter {{INLINE_CODE|target}} angegebene Texturstufe aktiviert, Zeile [03], [12] und [21]. Von nun an beziehen sich alle Befehle, die etwas an einer Textur verändern (Binden von Texturen, Blending, Alphamasking, Veränderung der Texturmatrix, etc.) auf diese aktivierte Texturstufe, und zwar solange, bis auf ihr das Texturing deaktiviert wird oder die Texturstufe gewechselt wird.&lt;br /&gt;
&lt;br /&gt;
Um nun die Texturstufe zu aktiveren, muss wie gewohnt mit dem Befehl {{INLINE_CODE|[[glEnable]]}} und dem Parameter {{INLINE_CODE|[[GL_TEXTURE_2D]]}} das 2D-Texturing aktiviert werden. Dies muss für jede Texturstufe geschehen, die genutzt wird, Zeile [06], [15] und [22]. Möchte man eine Texturstufe ausschalten, so wählt man diese aus und nutzt {{INLINE_CODE|[[glDisable]]}} mit dem Parameter {{INLINE_CODE|GL_TEXTURE_2D}}, Zeile [11] und [20].&lt;br /&gt;
&lt;br /&gt;
Bevor nun die Polygone gezeichnet werden, muss für jede Texturstufe die Art der Verknüpfung mit den anderen Texturstufen festgelegt werden. Dies geschieht mit dem Befehl {{INLINE_CODE|[[glTexEnv]]i}}, der als Parameter das Ziel des Parameters (in unseren Falle {{INLINE_CODE|[[GL_TEXTURE_ENV]]}}, was bedeutet, das als Grundwerte die Ausgabewerte der vorherigen Texturstufe genutzt werden), den Parameter selbst (auch {{INLINE_CODE|GL_TEXTURE_ENV}}) und die Art der Verknüpfung erhält.&lt;br /&gt;
&lt;br /&gt;
Für die Basistextur wird dieser Parameter auf {{INLINE_CODE|[[GL_REPLACE]]}} gesetzt [23], alles was vor dieser Textur kam wird also überschrieben. Der Parameter {{INLINE_CODE|[[GL_MODULATE]]}} für die Lightmap [08] und die Detailtextur [17] geben an, das deren Farbwerte mit den vorherigen Werten multipliziert werden. Neben diesen Verknüpfungen gibt es noch etliche andere, die jedoch weniger oft, oder für andere Anwendungen wie z.&amp;amp;nbsp;B. BumpMapping verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Schritt 3 - Übergabe der Texturkoordinaten==&lt;br /&gt;
Nachdem die Texturstufen nun vorbereitet wurden, müssen für diese noch die Texturkoordinaten festgelegt werden. Wurde dies vorher mit der Funktion {{INLINE_CODE|[[glTexCoord2f]](s,t : single)}} erledigt, so wird nun die an das Multitexturing angepasste Variante {{INLINE_CODE|[[glMultiTexCoord2f]](target : cardinal;s,t : single)}} genutzt. Im Parameter {{INLINE_CODE|target}} wird die Texturstufe gewählt und in {{INLINE_CODE|s}} bzw. {{INLINE_CODE|t}} wie gewohnt die Texturkoordinaten übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[02]  Texture[6].Bind;&lt;br /&gt;
&lt;br /&gt;
[03]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[04]  Texture[0].Bind;&lt;br /&gt;
&lt;br /&gt;
[05]  glBegin(GL_QUADS);&lt;br /&gt;
[06]    glMultiTexCoord2f(GL_TEXTURE0, 0, 0);&lt;br /&gt;
[07]    glMultiTexCoord2f(GL_TEXTURE1, 0, 0);&lt;br /&gt;
[08]    glMultiTexCoord2f(GL_TEXTURE2, 0, 0);&lt;br /&gt;
[09]      glVertex3f(px, py, pz);&lt;br /&gt;
[10]    glMultiTexCoord2f(GL_TEXTURE0, 0, 2);&lt;br /&gt;
[11]    glMultiTexCoord2f(GL_TEXTURE1, 0, 1);&lt;br /&gt;
[12]    glMultiTexCoord2f(GL_TEXTURE2, 0, 8);&lt;br /&gt;
[13]      glVertex3f(px, py, pz + pLength);&lt;br /&gt;
[14]    glMultiTexCoord2f(GL_TEXTURE0, 2, 2);&lt;br /&gt;
[15]    glMultiTexCoord2f(GL_TEXTURE1, 1, 1);&lt;br /&gt;
[16]    glMultiTexCoord2f(GL_TEXTURE2, 8, 8);&lt;br /&gt;
[17]      glVertex3f(px + pWidth, py, pz + pLength);&lt;br /&gt;
[18]    glMultiTexCoord2f(GL_TEXTURE0, 2, 0);&lt;br /&gt;
[19]    glMultiTexCoord2f(GL_TEXTURE1, 1, 0);&lt;br /&gt;
[20]    glMultiTexCoord2f(GL_TEXTURE2, 8, 0);&lt;br /&gt;
[21]      glVertex3f(px + pWidth, py, pz);&lt;br /&gt;
[22]  glEnd;&lt;br /&gt;
&lt;br /&gt;
[23]  glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[24]  if TSActive[1] then&lt;br /&gt;
[25]  begin&lt;br /&gt;
[26]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[27]       Texture[4].Bind;&lt;br /&gt;
[28]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[29]  end&lt;br /&gt;
[30]  else&lt;br /&gt;
[31]      glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[32]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[33]  glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[34]  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie in dieser, aus dem Beispielprogramm entnommenen Prozedur sichtbar, werden vor dem Zeichnen des Quads zuerst die Texturen an die einzelnen Texturstufen gebunden. In [01] und [02] wird die Lightmap an die Texturstufe 1 gebunden und in [03] und [04] wird die Basistextur für diesen Quad an Texturstufe 0 gebunden. Da die an Texturstufe 2 gebundene Detailtextur bereits vorher definiert wurde und sich für diesen Quad nicht ändert, muss diese hier nicht gebunden werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden nur noch die Texturkoordinaten an jede genutzte Texturstufe für jeden Eckpunkt des Polygons übergeben um es mit den an die Stufen gebundenen Texturen zu überziehen.&lt;br /&gt;
&lt;br /&gt;
==Das Beispielprogramm==&lt;br /&gt;
Das von mir zu diesem Tutorial geschriebene Beispielprogramm benutzt 3 Texturstufen. Texturstufe 0 für die Basistextur, Texturstufe 1 für die Lightmap und Texturstufe 2 für die Detailtextur. Die Texturstufen 1 und 2 können mit den entsprechenden Ziffern auf der Tastatur aktiviert bzw. deaktiviert werden. Mit der Maus wird der Blickwinkel verändert und mit Cursor Hoch/Runter kann man sich bewegen.&lt;br /&gt;
&lt;br /&gt;
Die Lightmaps wurden von mir in einem herkömmlichen Zeichenprogramm erstellt, es steckt also kein Radiosity-Renderer dahinter.&lt;br /&gt;
&lt;br /&gt;
Das Programm wurde unter Delphi 6.0 geschrieben, sollte jedoch ab Delphi 4.0 kompilierbar sein.&lt;br /&gt;
Das Programm läuft natürlich nur auf Grafikkarten, die Multitexturing in der Hardware unterstützen. Dies ist jedoch seit der Riva TNT bei allen Karten der Fall.&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Screenshot aus dem Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Multitex06.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Autor: [[Benutzer:Sascha_Willems|Sascha Willems]]&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
[http://www.delphigl.de/files/multitex.zip Das Multitexturingdemo (inklusive Quellcode) herunterladen]&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|[[Tutorial Bumpmaps mit Blender]]|[[Tutorial StencilSpiegel]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Multitexturing]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24604</id>
		<title>Tutorial MultiTexturing</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24604"/>
				<updated>2010-01-16T14:41:02Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Tutorial Multitexturing=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Mit der Markteinführung von NVidias „Riva TNT“ (TwiNTexel Engine) hat auch das Multitexturing im PC-Grafikkartenbereich Einzug gefunden, und wird seit einigen Jahren von allen neu entwickelten Grafikchips unterstützt. Beim Multitexturing können den einzelnen Textureinheiten der Grafikkarte unterschiedliche Texturen zugeordnet werden, die dann später in einem Durchgang auf ein Polygon tapeziert bzw. verknüpft werden. Vor der Einführung dieser Technik musste man das Polygon im ersten Durchgang mit Textur A rendern und in einem zweiten Durchgang Blending aktivieren und es mit Textur B zeichnen. Dadurch verdoppelte sich nicht nur die Anzahl der Polygone, sondern auch die Verknüpfungsmöglichkeiten des Blendings waren weit weniger nützlich als die beim Multitexturing.&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Textureinheiten (TMU = Textur Mapping Unit) gibt an, wie viele Texturen in einem Durchgang auf eine Textur gezeichnet werden können. Bei einer „GeForce4“ sind dies z.&amp;amp;nbsp;B. 4 und bei den „Kyro“-Karten von PowerVR sogar bis zu 8 (obwohl man eher selten 8 Texturstufen benötigt). Besitzt eine Grafikkarte nun weniger TMUs als man gleichzeitig Texturen auf ein Polygon zeichnen möchte, dann wird die Arbeit in mehreren Durchgängen erledigt. Ein Grafikchip der nur 2 TMUs besitzt, braucht also 3 Durchgänge um ein Polygon mit 6 Texturen zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
Multitexturing ist heute besonders in Spielen ein unverzichtbares Mittel geworden. Dabei werden zwei Anwendungsmöglichkeiten häufig genutzt.Zum einen das [[Lightmap]], bei dem Schattenwurf und Lichteinfall auf ein Polygon vorberechnet und in einer separaten Textur abgelegt werden, sowie das [[Detailmapping|Detailtexturing]], bei dem die Basistextur mit einem Muster überzogen wird, das kleine Details simulieren soll.&lt;br /&gt;
&lt;br /&gt;
Im Falle des Beispielprogramms werden diese beiden Texturen mit Hilfe des Multitexturings mit der Basistextur verknüpft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
!Schritt1&lt;br /&gt;
|[[Bild:Multitex01.jpg|framed|Basistextur]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex02.jpg|framed|Lightmap]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
!Schritt2&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex03.jpg|framed|Detailtextur]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex05.jpg|framed|Endergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 1 - Hardware auf Multitexturing-Fähigkeit prüfen==&lt;br /&gt;
Bevor man das Multitexturing nutzen kann, sollte man natürlich erst einmal prüfen ob dies auch von der Hardware unterstützt wird. Es wird zwar kaum noch Grafikkarten geben, bei denen dies nicht der Fall ist, aber um sicherzugehen ist dieser Schritt doch nötig.&lt;br /&gt;
&lt;br /&gt;
Dabei hat man zwei einfache Möglichkeiten. Entweder man prüft, ob die Erweiterung GL_ARB_MULTITEXTURE von der Grafikkarte untersützt wird, oder man liest die Anzahl der TMUs mit dem Befehl [[glGetIntegerv]] und dem Parameter GL_MAX_TEXTURE_UNITS_ARB aus [06].Ist dieser Wert kleiner als zwei, so wird das Multitexturing nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure TForm1.GLInit;&lt;br /&gt;
[02]  var&lt;br /&gt;
[03]     TMUs  : Integer;&lt;br /&gt;
[04]  begin&lt;br /&gt;
[05]       ActivateRenderingContext(FDC, FRC);&lt;br /&gt;
[06]       glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, @TMUs);&lt;br /&gt;
[07]       if TMUs &amp;lt; 2 then&lt;br /&gt;
[08]       begin&lt;br /&gt;
[09]            ShowMessage('Sorry!Your card doesn''t support Multitexturing');&lt;br /&gt;
[10]            Close;&lt;br /&gt;
[11]       end;&lt;br /&gt;
...&lt;br /&gt;
[12]  end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 2 - Texturstufen festlegen==&lt;br /&gt;
Hat man sich nun von den Multitexture-Fähigkeiten der Grafikkarte überzeugt, kann man endlich damit beginnen, die einzelnen Texturen ihren Texturstufen zuzuordnen. Auf die Texturstufen wird in OpenGL mit Hilfe der Konstanten {{INLINE_CODE|GL_TEXTURE0...GL_TEXTURE31}} zugegriffen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure DrawRoom;&lt;br /&gt;
[02]  begin&lt;br /&gt;
...&lt;br /&gt;
[03]       glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[04]       if TSActive[0] then&lt;br /&gt;
[05]       begin&lt;br /&gt;
[06]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[07]            Texture[2].Bind;&lt;br /&gt;
[08]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[09]       end&lt;br /&gt;
[10]       else&lt;br /&gt;
[11]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[12]       glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[13]       if TSActive[1] then&lt;br /&gt;
[14]       begin&lt;br /&gt;
[15]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[16]            Texture[4].Bind;&lt;br /&gt;
[17]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[18]       end&lt;br /&gt;
[19]       else&lt;br /&gt;
[20]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[21]       glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[22]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[23]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion {{INLINE_CODE|[[glActiveTexture]](target : Cardinal)}} wird die im Parameter {{INLINE_CODE|target}} angegebene Texturstufe aktiviert, Zeile [03], [12] und [21]. Von nun an beziehen sich alle Befehle, die etwas an einer Textur verändern (Binden von Texturen, Blending, Alphamasking, Veränderung der Texturmatrix, etc.) auf diese aktivierte Texturstufe, und zwar solange, bis auf ihr das Texturing deaktiviert wird oder die Texturstufe gewechselt wird.&lt;br /&gt;
&lt;br /&gt;
Um nun die Texturstufe zu aktiveren, muss wie gewohnt mit dem Befehl {{INLINE_CODE|[[glEnable]]}} und dem Parameter {{INLINE_CODE|[[GL_TEXTURE_2D]]}} das 2D-Texturing aktiviert werden. Dies muss für jede Texturstufe geschehen, die genutzt wird, Zeile [06], [15] und [22]. Möchte man eine Texturstufe ausschalten, so wählt man diese aus und nutzt {{INLINE_CODE|[[glDisable]]}} mit dem Parameter {{INLINE_CODE|GL_TEXTURE_2D}}, Zeile [11] und [20].&lt;br /&gt;
&lt;br /&gt;
Bevor nun die Polygone gezeichnet werden, muss für jede Texturstufe die Art der Verknüpfung mit den anderen Texturstufen festgelegt werden. Dies geschieht mit dem Befehl {{INLINE_CODE|[[glTexEnv]]i}}, der als Parameter das Ziel des Parameters (in unseren Falle {{INLINE_CODE|[[GL_TEXTURE_ENV]]}}, was bedeutet, das als Grundwerte die Ausgabewerte der vorherigen Texturstufe genutzt werden), den Parameter selbst (auch {{INLINE_CODE|GL_TEXTURE_ENV}}) und die Art der Verknüpfung erhält.&lt;br /&gt;
&lt;br /&gt;
Für die Basistextur wird dieser Parameter auf {{INLINE_CODE|[[GL_REPLACE]]}} gesetzt [23], alles was vor dieser Textur kam wird also überschrieben. Der Parameter {{INLINE_CODE|[[GL_MODULATE]]}} für die Lightmap [08] und die Detailtextur [17] geben an, das deren Farbwerte mit den vorherigen Werten multipliziert werden. Neben diesen Verknüpfungen gibt es noch etliche andere, die jedoch weniger oft, oder für andere Anwendungen wie z.&amp;amp;nbsp;B. BumpMapping verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Schritt 3 - Übergabe der Texturkoordinaten==&lt;br /&gt;
Nachdem die Texturstufen nun vorbereitet wurden, müssen für diese noch die Texturkoordinaten festgelegt werden. Wurde dies vorher mit der Funktion {{INLINE_CODE|[[glTexCoord2f]](s,t : single)}} erledigt, so wird nun die an das Multitexturing angepasste Variante {{INLINE_CODE|[[glMultiTexCoord2f]](target : cardinal;s,t : single)}} genutzt. Im Parameter {{INLINE_CODE|target}} wird die Texturstufe gewählt und in {{INLINE_CODE|s}} bzw. {{INLINE_CODE|t}} wie gewohnt die Texturkoordinaten übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[02]  Texture[6].Bind;&lt;br /&gt;
&lt;br /&gt;
[03]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[04]  Texture[0].Bind;&lt;br /&gt;
&lt;br /&gt;
[05]  glBegin(GL_QUADS);&lt;br /&gt;
[06]    glMultiTexCoord2f(GL_TEXTURE0, 0, 0);&lt;br /&gt;
[07]    glMultiTexCoord2f(GL_TEXTURE1, 0, 0);&lt;br /&gt;
[08]    glMultiTexCoord2f(GL_TEXTURE2, 0, 0);&lt;br /&gt;
[09]      glVertex3f(px, py, pz);&lt;br /&gt;
[10]    glMultiTexCoord2f(GL_TEXTURE0, 0, 2);&lt;br /&gt;
[11]    glMultiTexCoord2f(GL_TEXTURE1, 0, 1);&lt;br /&gt;
[12]    glMultiTexCoord2f(GL_TEXTURE2, 0, 8);&lt;br /&gt;
[13]      glVertex3f(px, py, pz + pLength);&lt;br /&gt;
[14]    glMultiTexCoord2f(GL_TEXTURE0, 2, 2);&lt;br /&gt;
[15]    glMultiTexCoord2f(GL_TEXTURE1, 1, 1);&lt;br /&gt;
[16]    glMultiTexCoord2f(GL_TEXTURE2, 8, 8);&lt;br /&gt;
[17]      glVertex3f(px + pWidth, py, pz + pLength);&lt;br /&gt;
[18]    glMultiTexCoord2f(GL_TEXTURE0, 2, 0);&lt;br /&gt;
[19]    glMultiTexCoord2f(GL_TEXTURE1, 1, 0);&lt;br /&gt;
[20]    glMultiTexCoord2f(GL_TEXTURE2, 8, 0);&lt;br /&gt;
[21]      glVertex3f(px + pWidth, py, pz);&lt;br /&gt;
[22]  glEnd;&lt;br /&gt;
&lt;br /&gt;
[23]  glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[24]  if TSActive[1] then&lt;br /&gt;
[25]  begin&lt;br /&gt;
[26]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[27]       Texture[4].Bind;&lt;br /&gt;
[28]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[29]  end&lt;br /&gt;
[30]  else&lt;br /&gt;
[31]      glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[32]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[33]  glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[34]  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie in dieser, aus dem Beispielprogramm entnommenen Prozedur sichtbar, werden vor dem Zeichnen des Quads zuerst die Texturen an die einzelnen Texturstufen gebunden. In [01] und [02] wird die Lightmap an die Texturstufe 1 gebunden und in [03] und [04] wird die Basistextur für diesen Quad an Texturstufe 0 gebunden. Da die an Texturstufe 2 gebundene Detailtextur bereits vorher definiert wurde und sich für diesen Quad nicht ändert, muss diese hier nicht gebunden werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden nur noch die Texturkoordinaten an jede genutzte Texturstufe für jeden Eckpunkt des Polygons übergeben um es mit den an die Stufen gebundenen Texturen zu überziehen.&lt;br /&gt;
&lt;br /&gt;
==Das Beispielprogramm==&lt;br /&gt;
Das von mir zu diesem Tutorial geschriebene Beispielprogramm benutzt 3 Texturstufen. Texturstufe 0 für die Basistextur, Texturstufe 1 für die Lightmap und Texturstufe 2 für die Detailtextur. Die Texturstufen 1 und 2 können mit den entsprechenden Ziffern auf der Tastatur aktiviert bzw. deaktiviert werden. Mit der Maus wird der Blickwinkel verändert und mit Cursor Hoch/Runter kann man sich bewegen.&lt;br /&gt;
&lt;br /&gt;
Die Lightmaps wurden von mir in einem herkömmlichen Zeichenprogramm erstellt, es steckt also kein Radiosity-Renderer dahinter.&lt;br /&gt;
&lt;br /&gt;
Das Programm wurde unter Delphi 6.0 geschrieben, sollte jedoch ab Delphi 4.0 kompilierbar sein.&lt;br /&gt;
Das Programm läuft natürlich nur auf Grafikkarten, die Multitexturing in der Hardware unterstützen. Dies ist jedoch seit der Riva TNT bei allen Karten der Fall.&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Screenshot aus dem Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Multitex06.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Autor: [[Benutzer:Sascha_Willems|Sascha Willems]]&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
[http://www.delphigl.de/files/multitex.zip Das Multitexturingdemo (inklusive Quellcode) herunterladen]&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|[[Tutorial Bumpmaps mit Blender]]|[[Tutorial StencilSpiegel]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Multitexturing]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24603</id>
		<title>Tutorial MultiTexturing</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24603"/>
				<updated>2010-01-16T14:37:54Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Schritt 3 - Übergabe der Texturkoordinaten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Tutorial Multitexturing=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Mit der Markteinführung von NVidias Riva TNT (TwiNTexel Engine) hat auch das Multitexturing im PC-Grafikkartenbereich Einzug gefunden, und wird seit einigen Jahren von allen neu entwickelten Grafikchips unterstützt. Beim Multitexturing können den einzelnen Textureinheiten der Grafikkarte unterschiedliche Texturen zugeordnet werden, die dann später in einem Durchgang auf ein Polygon tapeziert bzw. verknüpft werden. Vor der Einführung dieser Technik musste man das Polygon im ersten Durchgang mit Textur A rendern und in einem zweiten Durchgang Blending aktivieren und es mit Textur B zeichnen. Dadurch verdoppelte sich nicht nur die Anzahl der Polygone, sondern auch die Verknüpfungsmöglichkeiten des Blendings waren weit weniger nützlich als die beim Multitexturing.&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Textureinheiten (TMU = Textur Mapping Unit) gibt an, wie viele Texturen in einem Durchgang auf eine Textur gezeichnet werden können. Bei einer GeForce4 sind dies z.&amp;amp;nbsp;B. 4 und bei den Kyro-Karten von PowerVR sogar bis zu 8 (obwohl man eher selten 8 Texturstufen benötigt). Besitzt eine Grafikkarte nun weniger TMUs als man gleichzeitig Texturen auf ein Polygon zeichnen möchte, dann wird die Arbeit in mehreren Durchgängen erledigt. Ein Grafikchip der nur 2 TMUs besitzt, braucht also 3 Durchgänge um ein Polygon mit 6 Texturen zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
Multitexturing ist heute besonders in Spielen ein unverzichtbares Mittel geworden. Dabei werden zwei Anwendungsmöglichkeiten häufig genutzt.Zum einen das [[Lightmap]], bei dem Schattenwurf und Lichteinfall auf ein Polygon vorberechnet und in einer separaten Textur abgelegt werden, sowie das [[Detailmapping|Detailtexturing]], bei dem die Basistextur mit einem Muster überzogen wird, das kleine Details simulieren soll.&lt;br /&gt;
&lt;br /&gt;
Im Falle des Beispielprogramms werden diese beiden Texturen mit Hilfe des Multitexturings mit der Basistextur verknüpft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
!Schritt1&lt;br /&gt;
|[[Bild:Multitex01.jpg|framed|Basistextur]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex02.jpg|framed|Lightmap]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
!Schritt2&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex03.jpg|framed|Detailtextur]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex05.jpg|framed|Endergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 1 - Hardware auf Multitexturing-Fähigkeit prüfen==&lt;br /&gt;
Bevor man das Multitexturing nutzen kann, sollte man natürlich erst einmal prüfen ob dies auch von der Hardware unterstützt wird. Es wird zwar kaum noch Grafikkarten geben, bei denen dies nicht der Fall ist, aber um sicherzugehen ist dieser Schritt doch nötig.&lt;br /&gt;
&lt;br /&gt;
Dabei hat man zwei einfache Möglichkeiten. Entweder man prüft, ob die Erweiterung GL_ARB_MULTITEXTURE von der Grafikkarte untersützt wird, oder man liest die Anzahl der TMUs mit dem Befehl [[glGetIntegerv]] und dem Parameter GL_MAX_TEXTURE_UNITS_ARB aus [06].Ist dieser Wert kleiner als zwei, so wird das Multitexturing nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure TForm1.GLInit;&lt;br /&gt;
[02]  var&lt;br /&gt;
[03]     TMUs  : Integer;&lt;br /&gt;
[04]  begin&lt;br /&gt;
[05]       ActivateRenderingContext(FDC, FRC);&lt;br /&gt;
[06]       glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, @TMUs);&lt;br /&gt;
[07]       if TMUs &amp;lt; 2 then&lt;br /&gt;
[08]       begin&lt;br /&gt;
[09]            ShowMessage('Sorry!Your card doesn''t support Multitexturing');&lt;br /&gt;
[10]            Close;&lt;br /&gt;
[11]       end;&lt;br /&gt;
...&lt;br /&gt;
[12]  end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 2 - Texturstufen festlegen==&lt;br /&gt;
Hat man sich nun von den Multitexture-Fähigkeiten der Grafikkarte überzeugt, kann man endlich damit beginnen, die einzelnen Texturen ihren Texturstufen zuzuordnen. Auf die Texturstufen wird in OpenGL mit Hilfe der Konstanten {{INLINE_CODE|GL_TEXTURE0...GL_TEXTURE31}} zugegriffen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure DrawRoom;&lt;br /&gt;
[02]  begin&lt;br /&gt;
...&lt;br /&gt;
[03]       glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[04]       if TSActive[0] then&lt;br /&gt;
[05]       begin&lt;br /&gt;
[06]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[07]            Texture[2].Bind;&lt;br /&gt;
[08]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[09]       end&lt;br /&gt;
[10]       else&lt;br /&gt;
[11]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[12]       glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[13]       if TSActive[1] then&lt;br /&gt;
[14]       begin&lt;br /&gt;
[15]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[16]            Texture[4].Bind;&lt;br /&gt;
[17]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[18]       end&lt;br /&gt;
[19]       else&lt;br /&gt;
[20]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[21]       glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[22]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[23]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion {{INLINE_CODE|[[glActiveTexture]](target : Cardinal)}} wird die im Parameter {{INLINE_CODE|target}} angegebene Texturstufe aktiviert, Zeile [03], [12] und [21]. Von nun an beziehen sich alle Befehle, die etwas an einer Textur verändern (Binden von Texturen, Blending, Alphamasking, Veränderung der Texturmatrix, etc.) auf diese aktivierte Texturstufe, und zwar solange, bis auf ihr das Texturing deaktiviert wird oder die Texturstufe gewechselt wird.&lt;br /&gt;
&lt;br /&gt;
Um nun die Texturstufe zu aktiveren, muss wie gewohnt mit dem Befehl {{INLINE_CODE|[[glEnable]]}} und dem Parameter {{INLINE_CODE|[[GL_TEXTURE_2D]]}} das 2D-Texturing aktiviert werden. Dies muss für jede Texturstufe geschehen, die genutzt wird, Zeile [06], [15] und [22]. Möchte man eine Texturstufe ausschalten, so wählt man diese aus und nutzt {{INLINE_CODE|[[glDisable]]}} mit dem Parameter {{INLINE_CODE|GL_TEXTURE_2D}}, Zeile [11] und [20].&lt;br /&gt;
&lt;br /&gt;
Bevor nun die Polygone gezeichnet werden, muss für jede Texturstufe die Art der Verknüpfung mit den anderen Texturstufen festgelegt werden. Dies geschieht mit dem Befehl {{INLINE_CODE|[[glTexEnv]]i}}, der als Parameter das Ziel des Parameters (in unseren Falle {{INLINE_CODE|[[GL_TEXTURE_ENV]]}}, was bedeutet, das als Grundwerte die Ausgabewerte der vorherigen Texturstufe genutzt werden), den Parameter selbst (auch {{INLINE_CODE|GL_TEXTURE_ENV}}) und die Art der Verknüpfung erhält.&lt;br /&gt;
&lt;br /&gt;
Für die Basistextur wird dieser Parameter auf {{INLINE_CODE|[[GL_REPLACE]]}} gesetzt [23], alles was vor dieser Textur kam wird also überschrieben. Der Parameter {{INLINE_CODE|[[GL_MODULATE]]}} für die Lightmap [08] und die Detailtextur [17] geben an, das deren Farbwerte mit den vorherigen Werten multipliziert werden. Neben diesen Verknüpfungen gibt es noch etliche andere, die jedoch weniger oft, oder für andere Anwendungen wie z.&amp;amp;nbsp;B. BumpMapping verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Schritt 3 - Übergabe der Texturkoordinaten==&lt;br /&gt;
Nachdem die Texturstufen nun vorbereitet wurden, müssen für diese noch die Texturkoordinaten festgelegt werden. Wurde dies vorher mit der Funktion {{INLINE_CODE|[[glTexCoord2f]](s,t : single)}} erledigt, so wird nun die an das Multitexturing angepasste Variante {{INLINE_CODE|[[glMultiTexCoord2f]](target : cardinal;s,t : single)}} genutzt. Im Parameter {{INLINE_CODE|target}} wird die Texturstufe gewählt und in {{INLINE_CODE|s}} bzw. {{INLINE_CODE|t}} wie gewohnt die Texturkoordinaten übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[02]  Texture[6].Bind;&lt;br /&gt;
&lt;br /&gt;
[03]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[04]  Texture[0].Bind;&lt;br /&gt;
&lt;br /&gt;
[05]  glBegin(GL_QUADS);&lt;br /&gt;
[06]    glMultiTexCoord2f(GL_TEXTURE0, 0, 0);&lt;br /&gt;
[07]    glMultiTexCoord2f(GL_TEXTURE1, 0, 0);&lt;br /&gt;
[08]    glMultiTexCoord2f(GL_TEXTURE2, 0, 0);&lt;br /&gt;
[09]      glVertex3f(px, py, pz);&lt;br /&gt;
[10]    glMultiTexCoord2f(GL_TEXTURE0, 0, 2);&lt;br /&gt;
[11]    glMultiTexCoord2f(GL_TEXTURE1, 0, 1);&lt;br /&gt;
[12]    glMultiTexCoord2f(GL_TEXTURE2, 0, 8);&lt;br /&gt;
[13]      glVertex3f(px, py, pz + pLength);&lt;br /&gt;
[14]    glMultiTexCoord2f(GL_TEXTURE0, 2, 2);&lt;br /&gt;
[15]    glMultiTexCoord2f(GL_TEXTURE1, 1, 1);&lt;br /&gt;
[16]    glMultiTexCoord2f(GL_TEXTURE2, 8, 8);&lt;br /&gt;
[17]      glVertex3f(px + pWidth, py, pz + pLength);&lt;br /&gt;
[18]    glMultiTexCoord2f(GL_TEXTURE0, 2, 0);&lt;br /&gt;
[19]    glMultiTexCoord2f(GL_TEXTURE1, 1, 0);&lt;br /&gt;
[20]    glMultiTexCoord2f(GL_TEXTURE2, 8, 0);&lt;br /&gt;
[21]      glVertex3f(px + pWidth, py, pz);&lt;br /&gt;
[22]  glEnd;&lt;br /&gt;
&lt;br /&gt;
[23]  glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[24]  if TSActive[1] then&lt;br /&gt;
[25]  begin&lt;br /&gt;
[26]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[27]       Texture[4].Bind;&lt;br /&gt;
[28]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[29]  end&lt;br /&gt;
[30]  else&lt;br /&gt;
[31]      glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[32]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[33]  glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[34]  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie in dieser, aus dem Beispielprogramm entnommenen Prozedur sichtbar, werden vor dem Zeichnen des Quads zuerst die Texturen an die einzelnen Texturstufen gebunden. In [01] und [02] wird die Lightmap an die Texturstufe 1 gebunden und in [03] und [04] wird die Basistextur für diesen Quad an Texturstufe 0 gebunden. Da die an Texturstufe 2 gebundene Detailtextur bereits vorher definiert wurde und sich für diesen Quad nicht ändert, muss diese hier nicht gebunden werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden nur noch die Texturkoordinaten an jede genutzte Texturstufe für jeden Eckpunkt des Polygons übergeben um es mit den an die Stufen gebundenen Texturen zu überziehen.&lt;br /&gt;
&lt;br /&gt;
==Das Beispielprogramm==&lt;br /&gt;
Das von mir zu diesem Tutorial geschriebene Beispielprogramm benutzt 3 Texturstufen. Texturstufe 0 für die Basistextur, Texturstufe 1 für die Lightmap und Texturstufe 2 für die Detailtextur. Die Texturstufen 1 und 2 können mit den entsprechenden Ziffern auf der Tastatur aktiviert bzw. deaktiviert werden. Mit der Maus wird der Blickwinkel verändert und mit Cursor Hoch/Runter kann man sich bewegen.&lt;br /&gt;
&lt;br /&gt;
Die Lightmaps wurden von mir in einem herkömmlichen Zeichenprogramm erstellt, es steckt also kein Radiosity-Renderer dahinter.&lt;br /&gt;
&lt;br /&gt;
Das Programm wurde unter Delphi 6.0 geschrieben, sollte jedoch ab Delphi 4.0 kompilierbar sein.&lt;br /&gt;
Das Programm läuft natürlich nur auf Grafikkarten, die Multitexturing in der Hardware unterstützen. Dies ist jedoch seit der Riva TNT bei allen Karten der Fall.&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Screenshot aus dem Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Multitex06.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Autor: [[Benutzer:Sascha_Willems|Sascha Willems]]&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
[http://www.delphigl.de/files/multitex.zip Das Multitexturingdemo (inklusive Quellcode) herunterladen]&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|[[Tutorial Bumpmaps mit Blender]]|[[Tutorial StencilSpiegel]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Multitexturing]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24602</id>
		<title>Tutorial MultiTexturing</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_MultiTexturing&amp;diff=24602"/>
				<updated>2010-01-16T14:34:34Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Schritt 2 - Texturstufen festlegen */ Formatierung vereinheitlicht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Tutorial Multitexturing=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Mit der Markteinführung von NVidias Riva TNT (TwiNTexel Engine) hat auch das Multitexturing im PC-Grafikkartenbereich Einzug gefunden, und wird seit einigen Jahren von allen neu entwickelten Grafikchips unterstützt. Beim Multitexturing können den einzelnen Textureinheiten der Grafikkarte unterschiedliche Texturen zugeordnet werden, die dann später in einem Durchgang auf ein Polygon tapeziert bzw. verknüpft werden. Vor der Einführung dieser Technik musste man das Polygon im ersten Durchgang mit Textur A rendern und in einem zweiten Durchgang Blending aktivieren und es mit Textur B zeichnen. Dadurch verdoppelte sich nicht nur die Anzahl der Polygone, sondern auch die Verknüpfungsmöglichkeiten des Blendings waren weit weniger nützlich als die beim Multitexturing.&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Textureinheiten (TMU = Textur Mapping Unit) gibt an, wie viele Texturen in einem Durchgang auf eine Textur gezeichnet werden können. Bei einer GeForce4 sind dies z.&amp;amp;nbsp;B. 4 und bei den Kyro-Karten von PowerVR sogar bis zu 8 (obwohl man eher selten 8 Texturstufen benötigt). Besitzt eine Grafikkarte nun weniger TMUs als man gleichzeitig Texturen auf ein Polygon zeichnen möchte, dann wird die Arbeit in mehreren Durchgängen erledigt. Ein Grafikchip der nur 2 TMUs besitzt, braucht also 3 Durchgänge um ein Polygon mit 6 Texturen zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
Multitexturing ist heute besonders in Spielen ein unverzichtbares Mittel geworden. Dabei werden zwei Anwendungsmöglichkeiten häufig genutzt.Zum einen das [[Lightmap]], bei dem Schattenwurf und Lichteinfall auf ein Polygon vorberechnet und in einer separaten Textur abgelegt werden, sowie das [[Detailmapping|Detailtexturing]], bei dem die Basistextur mit einem Muster überzogen wird, das kleine Details simulieren soll.&lt;br /&gt;
&lt;br /&gt;
Im Falle des Beispielprogramms werden diese beiden Texturen mit Hilfe des Multitexturings mit der Basistextur verknüpft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
!Schritt1&lt;br /&gt;
|[[Bild:Multitex01.jpg|framed|Basistextur]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex02.jpg|framed|Lightmap]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
!Schritt2&lt;br /&gt;
|[[Bild:Multitex04.jpg|framed|Zwischenergebnis]]&lt;br /&gt;
| +&lt;br /&gt;
|[[Bild:Multitex03.jpg|framed|Detailtextur]]&lt;br /&gt;
| =&lt;br /&gt;
|[[Bild:Multitex05.jpg|framed|Endergebnis]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 1 - Hardware auf Multitexturing-Fähigkeit prüfen==&lt;br /&gt;
Bevor man das Multitexturing nutzen kann, sollte man natürlich erst einmal prüfen ob dies auch von der Hardware unterstützt wird. Es wird zwar kaum noch Grafikkarten geben, bei denen dies nicht der Fall ist, aber um sicherzugehen ist dieser Schritt doch nötig.&lt;br /&gt;
&lt;br /&gt;
Dabei hat man zwei einfache Möglichkeiten. Entweder man prüft, ob die Erweiterung GL_ARB_MULTITEXTURE von der Grafikkarte untersützt wird, oder man liest die Anzahl der TMUs mit dem Befehl [[glGetIntegerv]] und dem Parameter GL_MAX_TEXTURE_UNITS_ARB aus [06].Ist dieser Wert kleiner als zwei, so wird das Multitexturing nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure TForm1.GLInit;&lt;br /&gt;
[02]  var&lt;br /&gt;
[03]     TMUs  : Integer;&lt;br /&gt;
[04]  begin&lt;br /&gt;
[05]       ActivateRenderingContext(FDC, FRC);&lt;br /&gt;
[06]       glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, @TMUs);&lt;br /&gt;
[07]       if TMUs &amp;lt; 2 then&lt;br /&gt;
[08]       begin&lt;br /&gt;
[09]            ShowMessage('Sorry!Your card doesn''t support Multitexturing');&lt;br /&gt;
[10]            Close;&lt;br /&gt;
[11]       end;&lt;br /&gt;
...&lt;br /&gt;
[12]  end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 2 - Texturstufen festlegen==&lt;br /&gt;
Hat man sich nun von den Multitexture-Fähigkeiten der Grafikkarte überzeugt, kann man endlich damit beginnen, die einzelnen Texturen ihren Texturstufen zuzuordnen. Auf die Texturstufen wird in OpenGL mit Hilfe der Konstanten {{INLINE_CODE|GL_TEXTURE0...GL_TEXTURE31}} zugegriffen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  procedure DrawRoom;&lt;br /&gt;
[02]  begin&lt;br /&gt;
...&lt;br /&gt;
[03]       glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[04]       if TSActive[0] then&lt;br /&gt;
[05]       begin&lt;br /&gt;
[06]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[07]            Texture[2].Bind;&lt;br /&gt;
[08]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[09]       end&lt;br /&gt;
[10]       else&lt;br /&gt;
[11]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[12]       glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[13]       if TSActive[1] then&lt;br /&gt;
[14]       begin&lt;br /&gt;
[15]            glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[16]            Texture[4].Bind;&lt;br /&gt;
[17]            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[18]       end&lt;br /&gt;
[19]       else&lt;br /&gt;
[20]           glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[21]       glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[22]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[23]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion {{INLINE_CODE|[[glActiveTexture]](target : Cardinal)}} wird die im Parameter {{INLINE_CODE|target}} angegebene Texturstufe aktiviert, Zeile [03], [12] und [21]. Von nun an beziehen sich alle Befehle, die etwas an einer Textur verändern (Binden von Texturen, Blending, Alphamasking, Veränderung der Texturmatrix, etc.) auf diese aktivierte Texturstufe, und zwar solange, bis auf ihr das Texturing deaktiviert wird oder die Texturstufe gewechselt wird.&lt;br /&gt;
&lt;br /&gt;
Um nun die Texturstufe zu aktiveren, muss wie gewohnt mit dem Befehl {{INLINE_CODE|[[glEnable]]}} und dem Parameter {{INLINE_CODE|[[GL_TEXTURE_2D]]}} das 2D-Texturing aktiviert werden. Dies muss für jede Texturstufe geschehen, die genutzt wird, Zeile [06], [15] und [22]. Möchte man eine Texturstufe ausschalten, so wählt man diese aus und nutzt {{INLINE_CODE|[[glDisable]]}} mit dem Parameter {{INLINE_CODE|GL_TEXTURE_2D}}, Zeile [11] und [20].&lt;br /&gt;
&lt;br /&gt;
Bevor nun die Polygone gezeichnet werden, muss für jede Texturstufe die Art der Verknüpfung mit den anderen Texturstufen festgelegt werden. Dies geschieht mit dem Befehl {{INLINE_CODE|[[glTexEnv]]i}}, der als Parameter das Ziel des Parameters (in unseren Falle {{INLINE_CODE|[[GL_TEXTURE_ENV]]}}, was bedeutet, das als Grundwerte die Ausgabewerte der vorherigen Texturstufe genutzt werden), den Parameter selbst (auch {{INLINE_CODE|GL_TEXTURE_ENV}}) und die Art der Verknüpfung erhält.&lt;br /&gt;
&lt;br /&gt;
Für die Basistextur wird dieser Parameter auf {{INLINE_CODE|[[GL_REPLACE]]}} gesetzt [23], alles was vor dieser Textur kam wird also überschrieben. Der Parameter {{INLINE_CODE|[[GL_MODULATE]]}} für die Lightmap [08] und die Detailtextur [17] geben an, das deren Farbwerte mit den vorherigen Werten multipliziert werden. Neben diesen Verknüpfungen gibt es noch etliche andere, die jedoch weniger oft, oder für andere Anwendungen wie z.&amp;amp;nbsp;B. BumpMapping verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Schritt 3 - Übergabe der Texturkoordinaten==&lt;br /&gt;
Nachdem die Texturstufen nun vorbereitet wurden, müssen für diese noch die Texturkoordinaten festgelegt werden. Wurde dies vorher mit der Funktion glTexCoord2f(s,t : single) erledigt, so wird nun die an das Multitexturing angepasste Variante glMultiTexCoord2f(target : cardinal;s,t : single) genutzt. Im Parameter target wird die Texturstufe gewählt und in s bzw. t wie gewohnt die Texturkoordinaten übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[01]  glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
[02]  Texture[6].Bind;&lt;br /&gt;
&lt;br /&gt;
[03]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[04]  Texture[0].Bind;&lt;br /&gt;
&lt;br /&gt;
[05]  glBegin(GL_QUADS);&lt;br /&gt;
[06]    glMultiTexCoord2f(GL_TEXTURE0, 0, 0);&lt;br /&gt;
[07]    glMultiTexCoord2f(GL_TEXTURE1, 0, 0);&lt;br /&gt;
[08]    glMultiTexCoord2f(GL_TEXTURE2, 0, 0);&lt;br /&gt;
[09]      glVertex3f(px, py, pz);&lt;br /&gt;
[10]    glMultiTexCoord2f(GL_TEXTURE0, 0, 2);&lt;br /&gt;
[11]    glMultiTexCoord2f(GL_TEXTURE1, 0, 1);&lt;br /&gt;
[12]    glMultiTexCoord2f(GL_TEXTURE2, 0, 8);&lt;br /&gt;
[13]      glVertex3f(px, py, pz + pLength);&lt;br /&gt;
[14]    glMultiTexCoord2f(GL_TEXTURE0, 2, 2);&lt;br /&gt;
[15]    glMultiTexCoord2f(GL_TEXTURE1, 1, 1);&lt;br /&gt;
[16]    glMultiTexCoord2f(GL_TEXTURE2, 8, 8);&lt;br /&gt;
[17]      glVertex3f(px + pWidth, py, pz + pLength);&lt;br /&gt;
[18]    glMultiTexCoord2f(GL_TEXTURE0, 2, 0);&lt;br /&gt;
[19]    glMultiTexCoord2f(GL_TEXTURE1, 1, 0);&lt;br /&gt;
[20]    glMultiTexCoord2f(GL_TEXTURE2, 8, 0);&lt;br /&gt;
[21]      glVertex3f(px + pWidth, py, pz);&lt;br /&gt;
[22]  glEnd;&lt;br /&gt;
&lt;br /&gt;
[23]  glActiveTexture(GL_TEXTURE2);&lt;br /&gt;
[24]  if TSActive[1] then&lt;br /&gt;
[25]  begin&lt;br /&gt;
[26]       glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[27]       Texture[4].Bind;&lt;br /&gt;
[28]       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);&lt;br /&gt;
[29]  end&lt;br /&gt;
[30]  else&lt;br /&gt;
[31]      glDisable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
[32]  glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
[33]  glEnable(GL_TEXTURE_2D);&lt;br /&gt;
[34]  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie in dieser, aus dem Beispielprogramm entnommenen Prozedur sichtbar, werden vor dem Zeichnen des Quads zuerst die Texturen an die einzelnen Texturstufen gebunden. In [01]-[02] wird die Lightmap an die Texturstufe 1 gebunden und in [03]-[04] wird die Basistextur für diesen Quad an Texturstufe 0 gebunden. Da die an Texturstufe 2 gebundene Detailtextur bereits vorher definiert wurde und sich für diesen Quad nicht ändert, muss diese hier nicht gebunden werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden nur noch die Texturkoordinaten an jede genutzte Texturstufe für jeden Eckpunkt des Polygons übergeben um es mit den an die Stufen gebundenen Texturen zu überziehen.&lt;br /&gt;
&lt;br /&gt;
==Das Beispielprogramm==&lt;br /&gt;
Das von mir zu diesem Tutorial geschriebene Beispielprogramm benutzt 3 Texturstufen. Texturstufe 0 für die Basistextur, Texturstufe 1 für die Lightmap und Texturstufe 2 für die Detailtextur. Die Texturstufen 1 und 2 können mit den entsprechenden Ziffern auf der Tastatur aktiviert bzw. deaktiviert werden. Mit der Maus wird der Blickwinkel verändert und mit Cursor Hoch/Runter kann man sich bewegen.&lt;br /&gt;
&lt;br /&gt;
Die Lightmaps wurden von mir in einem herkömmlichen Zeichenprogramm erstellt, es steckt also kein Radiosity-Renderer dahinter.&lt;br /&gt;
&lt;br /&gt;
Das Programm wurde unter Delphi 6.0 geschrieben, sollte jedoch ab Delphi 4.0 kompilierbar sein.&lt;br /&gt;
Das Programm läuft natürlich nur auf Grafikkarten, die Multitexturing in der Hardware unterstützen. Dies ist jedoch seit der Riva TNT bei allen Karten der Fall.&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Screenshot aus dem Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Multitex06.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Autor: [[Benutzer:Sascha_Willems|Sascha Willems]]&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
[http://www.delphigl.de/files/multitex.zip Das Multitexturingdemo (inklusive Quellcode) herunterladen]&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|[[Tutorial Bumpmaps mit Blender]]|[[Tutorial StencilSpiegel]]}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Multitexturing]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Matrix&amp;diff=24070</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Matrix&amp;diff=24070"/>
				<updated>2009-08-06T03:59:35Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Eigenschaften */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Matrix / Matrizen==&lt;br /&gt;
&lt;br /&gt;
===Übersicht===&lt;br /&gt;
Eine Matrix ist im wesentlichen nichts anderes als das, was man in der Programmierung als zweidimensionales Array kennt. Dabei beschreibt eine Matrix eine [http://de.wikipedia.org/wiki/Lineare_Abbildung lineare Abbildung], was als Information bei Rechnungen sehr wichtig ist.&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' Für den Einstieg in OpenGl ist ein tiefergehendes Verständnis von Matrizen noch nicht notwendig um bereits interessante Ergebnisse zu erzielen. Es genügt am Anfang zu wissen, daß man damit Verscheibungen, Drehungen und Streckungen beschreiben kann und daß die Reihenfolge der Befehle zum Manipulieren der Matrix wichtig ist. Wer also noch seine ersten Erfahrungen mit OpenGl macht, kann sich zuerst in unseren [[Tutorial|Tutorials]] informieren und erst anschließend hier wieder vorbeischauen.&lt;br /&gt;
&lt;br /&gt;
'''Anmerkung:''' Wir wollen mit den Definitionen hier nur soweit gehen, wie es für ein Verständnis von OpenGl Geometrie wichtig ist. In der Linearen Algebra werden einige der hier gegebenen Begriffe deutlich genauer und häufig auch abstrakter betrachtet. Dies würde jedoch unseren kleinen Rahmen deutlich sprengen.&lt;br /&gt;
&lt;br /&gt;
===Definition===&lt;br /&gt;
Matrizen sind Abbildungen auf Vektorräumen ganzzahliger Dimension. Für alle weiteren Betrachtungen seien deshalb die Zahlen n,m und r aus dem Bereich {1,2,3,4,5,...}, also den natürlichen Zahlen ohne Null, fest vorgegeben.&lt;br /&gt;
&lt;br /&gt;
====R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; Vektorräume====&lt;br /&gt;
Um Matrizen definieren zu können, müssen wir zuerst Vektorräume definieren. Ein Vektorraum (V,*,+) ist eine Menge Vektoren V zusammen mit einer Skalar-Multiplikation * und einer Addition auf Vektoren, auf denen man vernünftig Vektorrechnung betreiben kann.&lt;br /&gt;
&lt;br /&gt;
Hat man also zwei Vektoren v und w, so kann man diesen eindeutig einen Summevektor x zuordnen: &lt;br /&gt;
[[Bild:Vektor__summe.png|center]]&lt;br /&gt;
 &lt;br /&gt;
Ausserdem kann man sie mit einem Skalar c aus den reelen Zahlen zu einem Vektor x' strecken: &lt;br /&gt;
[[Bild:Vektor__skalar.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Beispiel''': Der Standardvektorraum R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;:&lt;br /&gt;
Ein Vektor v aus dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; besteht aus n reelen Zahlen ( seinen Komponenten v&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), deren Reihenfolge wichtig ist und auch ''n-tupel'' genannt wird. Man kann also v auch in Form seiner Komponenten schreiben:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorkomponenten.png|center]]&lt;br /&gt;
&lt;br /&gt;
Häufig wird kein Unterschied dahingehend gemacht, ob der Vektor als Zeile oder als Spalte geschrieben wird. Bei der später definierten Matrixmultiplikation wird dies jedoch durchaus interessant, wir wollen uns also erstmal darauf beschränken, daß auch die Schreibweise&lt;br /&gt;
[[Bild:Vektortranspos.png|center]]&lt;br /&gt;
für unseren Vektor v eine legitime, als Text einfacher verfassbare Schreibweise darstellt. Bei der später definierten Multiplikation mit einer Matrix der Vektor aber immer als Spalte betrachtet wird.&lt;br /&gt;
&lt;br /&gt;
Um unseren Vektorraum zu vervollständigen, brauchen wir nach Definition nun auch noch eine Addition und eine (Skalar-)Multiplikation. Die Addition geschieht komponentenweise. Hat man also einen zweiten Vektor b=(b&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,...,b&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;), so ist die Addition definiert durch:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektoraddition.png|center]]&lt;br /&gt;
&lt;br /&gt;
Die Multiplikation eines Vektors v mit einem reellen Faktor &amp;amp;lambda; entspricht einer Streckung des Vektors um &amp;amp;lambda;, was durch Multiplikation aller Komponenten von v mit &amp;amp;lambda; erreicht wird:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorskalarmultiplikation.png|center]]&lt;br /&gt;
&lt;br /&gt;
Es ergeben sich die von den normalen reelen Zahlen bekannten Rechenregeln:&lt;br /&gt;
[[Bild:Vektorassoz.png|center]]&lt;br /&gt;
D.h. man kann Skalare einfach aus Klammern ausmultiplizieren oder wieder hineinziehen. Man beachte aber, daß die Multiplikation von Vektoren mit Vektoren nicht definiert ist (Siehe auch [[Vektorprodukt]], [[Standard Skalarprodukt]]).&lt;br /&gt;
&lt;br /&gt;
Ist unser n gerade die Zahl 3 bzw. 2, so kann man durch den R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; gerade den 3-Dimensionalen bzw. 2-Dimensionalen Anschauungsraum darstellen. Vektoren kann man dann sogar zeichnen und bekommt eine bildliche Vorstellung. Vektoren werden zu einer Darstellung von Pfeilen, die eine Richtung beschreiben oder ausgehend vom Nullpunkt des Koordinatensystems einen Punkt definieren:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorvorstellung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
====Lineare Abbildungen auf dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; in den R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt;====&lt;br /&gt;
Weiter kann man Abbildungen f, die als Parameter Vektoren des R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; annehmen und diese in den R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt; abbilden, definieren. Insbesondere kann man Abbildungen definieren, die linear sind, d.h. daß f folgende Eigenschaften erfüllt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Lineare Abbildungen.png|center]]&lt;br /&gt;
&lt;br /&gt;
und zwar für alle a,b aus R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; und alle &amp;amp;lambda; aus den reellen Zahlen R. Interessant ist, daß solche Abbildungen die Rechenregeln aus unserer Vektorraumdefinition erhalten. Sehr wichtig ist jedoch: Solche Abbildungen existieren. Die einfachste ist die, die alle Vektoren aus R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&lt;br /&gt;
auf die 0 abbildet ( die 0 ist der Vektor des R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt;, in dem alle Komponenten gleich 0 ist. ). Tatsächlich gibt es deutlich mehr dieser Abbildungen und alle lassen sich als Matrizen darstellen. Und umgekehrt: Mit Matrizen lassen sich alle lineare Abbildungen auf unseren Vektorräumen beschreiben.&lt;br /&gt;
&lt;br /&gt;
====mxn-Matrizen und ihre Anwendung auf Vektoren====&lt;br /&gt;
Wie bereits angesprochen, sind Matrizen also 2 Dimensionale Felder aus rellen Zahlen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:mxnMatrix.png|center]]&lt;br /&gt;
&lt;br /&gt;
Die a&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; werden dann die Koeffizienten der Matrix genannt. Nun wollen wir das Anwenden der Matrix A aus R&amp;lt;sup&amp;gt;mxn&amp;lt;/sup&amp;gt; auf einen Vektor x definieren:&lt;br /&gt;
&lt;br /&gt;
[[Bild:mxnMatrixAnwendungaufx.png|center]]&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
[[Bild:AnwendungsbeispielMatrizen.png|center]]&lt;br /&gt;
&lt;br /&gt;
Am Bild erkennt man auch, warum die Matrix-Vektor Multiplikation ( &amp;quot; Anwendung &amp;quot; ) auch als Zeile mal Spalte bezeichnet wird, denn die Koeffizienten einer Zeile der Matrix werden der Reihe nach mit den Koeffizienten der &amp;quot;Spalte&amp;quot; des Vektors multipliziert. Dieses Verfahren kann man erweitern, indem man Vektoren als Matrizen interpretiert, die nur eine Spalte haben. Schreibt man mehrere Vektoren nebeneinander, kann man auf jede dieser Spalten die Matrix A darauf anwenden:&lt;br /&gt;
&lt;br /&gt;
====mxn-nxr-Matrix-Matrix Multiplikation====&lt;br /&gt;
Man hat also eine mxn-Matrix A und eine nxr-Matrix B, die man Spaltenweise als Vektoren versteht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:zerlegungMatrixInEinzelvektoren.png|center]]&lt;br /&gt;
&lt;br /&gt;
Bei der Multiplikation von A mit B, wird dann einfach A auf die Vektoren b&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; angewendet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikation.png|center]]&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationBeispiel.png|center]]&lt;br /&gt;
&lt;br /&gt;
====Eigenschaften====&lt;br /&gt;
Diese Multiplikation hat eine Reihe von Eigenschaften:&lt;br /&gt;
* Versteht man die Matrizen A,B als lineare Abbildungen auf Vektoren x aus dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; und y aus R&amp;lt;sup&amp;gt;r&amp;lt;/sup&amp;gt;, also f(x) = A*x und g(y) = B*y und ist A eine mxn-Matrix, sowie B eine nxr Matrix, dann ist die Abbildung f(g(y)) eine Lineare Abbildung, die beschrieben ist durch &lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationLinear.png|center]]&lt;br /&gt;
* Daraus ergibt sich, da schon die Definitions-Vektorräume verschieden sind, daß in den meisten Fällen '''nicht gilt''': '''A*B=B*A''' . Wer sich dies genauer überlegt, stellt fest, daß das 2. Produkt nur dann definiert ist, wenn A und B beides nxn-Matrizen sind. Aber selbst in diesem Fall ist es im Allgemeinen ein Unterschied, ob ich A*B oder B*A rechne (Das führt schließlich zu der Tatsache, dass man in OpenGL aufpassen muss, ob man zuerst rotiert und dann verschiebt (transliert) oder umgekehrt: Diese Operationen werden durch Matrizenmultiplikationen implementiert. Zu diesem Thema findet man am Ende des [[Tutorial_Matrix2]] einige Bilder.).&lt;br /&gt;
&lt;br /&gt;
* Anderfalls gelten die Distributiv-, Assoziativ- und Kommutativgesetze:&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationLinear2.png|center]]&lt;br /&gt;
* Man nennt eine Gleichung A*x = b ein ''Lineares Gleichungssystem'', wenn A und b bekannt und x gesucht ist. Es interessiert dann, ob und - wenn ja - wie viele Lösungen es für x gibt.&lt;br /&gt;
&lt;br /&gt;
===Siehe Auch===&lt;br /&gt;
Es gibt noch eine Menge weiterer Eigenschaften, und Funktionen, die in Bezug auf Matrizen höchst interessant sind:&lt;br /&gt;
&lt;br /&gt;
[[Matrix_Transposition]], [[Determinante]], [[Matrix_Inversion]], [[Gauss_Algorithmus]], [[Matrixmultiplikation|Matrizenmultiplikation]], [[Techniken zur Matrixinversion]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- LaTeX-Quellcode &lt;br /&gt;
\documentclass[11pt]{article}&lt;br /&gt;
\newcommand {\bR}{{\mathbb R}}&lt;br /&gt;
\usepackage{amsmath,amsfonts}&lt;br /&gt;
\usepackage{xcolor}&lt;br /&gt;
\newcommand {\rd}{\color{red}}&lt;br /&gt;
\newcommand {\bl}{\color{blue}}&lt;br /&gt;
\begin{document}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
x &amp;amp;= v + w\\&lt;br /&gt;
x &amp;amp;= c \cdot v\\&lt;br /&gt;
v &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1} \\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) &lt;br /&gt;
     =&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                \vdots\\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) \qquad (v \in V)\\&lt;br /&gt;
v^t &amp;amp;= (v_1, \ldots, v_n)\\&lt;br /&gt;
v+b &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1} \\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) +&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                b_1 \\&lt;br /&gt;
                b_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                b_{n-1} \\&lt;br /&gt;
                b_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) =&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                v_1 +b_1\\&lt;br /&gt;
                v_2 +b_1\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1}+b_{n-1} \\&lt;br /&gt;
                v_n+b_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) &lt;br /&gt;
     \qquad (b,v \in V)\\&lt;br /&gt;
     \lambda \cdot v &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                \lambda \cdot v_1 \\&lt;br /&gt;
                \lambda \cdot v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                \lambda \cdot v_{n-1} \\&lt;br /&gt;
                \lambda \cdot v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) \qquad (\lambda \in \bR, v\in V) \\&lt;br /&gt;
     \lambda \cdot (v+b) &amp;amp;= \lambda \cdot v + \lambda \cdot b \qquad (\lambda \in \bR, v,b \in V)&lt;br /&gt;
\end{align*}&lt;br /&gt;
&lt;br /&gt;
\begin{align*}&lt;br /&gt;
     1) \; f(a+b) &amp;amp;= f(a) + f(b) &amp;amp;(a,b \in \bR^n, f(a),f(b) \in \bR^m)\\&lt;br /&gt;
     2) \; f(\lambda \cdot a) &amp;amp;= \lambda \cdot f(a) &amp;amp;(a \in \bR^n, \lambda \in \bR, f(a) \in \bR^m)&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
A &amp;amp;:= \left ( \begin{array}{ccc}&lt;br /&gt;
                 a_{1,1} &amp;amp; \ldots &amp;amp; a_ {1,n} \\&lt;br /&gt;
                 \vdots &amp;amp; &amp;amp; \vdots \\&lt;br /&gt;
                 a_{m,n} &amp;amp; \ldots &amp;amp; a_{m,n}&lt;br /&gt;
             \end{array}&lt;br /&gt;
      \right ) \\&lt;br /&gt;
A\cdot v &amp;amp;:= &lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 \sum_{i=1}^{n}a_{1,i}\cdot v_i\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                 \sum_{i=1}^{n}a_{m,i}\cdot v_i&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) = &lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 a_{1,1}\cdot v_1 + \ldots + a_{1,n}v_n\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                 a_{m,1}\cdot v_1 + \ldots + a_{m,n}v_n&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) \mbox {[m Zeilen!]} \qquad (A \in \bR^{m,n})&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
A &amp;amp;:=       \left ( &lt;br /&gt;
               \begin{array}{ccc}&lt;br /&gt;
                 1 &amp;amp; 2 &amp;amp; 3\\&lt;br /&gt;
                 \rd 4 &amp;amp; \rd 5 &amp;amp; \rd 6&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
             \qquad&lt;br /&gt;
             v =&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 \bl 7\\&lt;br /&gt;
                 \bl 8\\&lt;br /&gt;
                 \bl 9&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right )&lt;br /&gt;
             \Rightarrow&lt;br /&gt;
             A\cdot v = &lt;br /&gt;
       \left ( &lt;br /&gt;
               \begin{array}{ccccc}&lt;br /&gt;
                 1\cdot {\bl 7} &amp;amp; +&amp;amp; 2 \cdot {\bl 8} &amp;amp;+&amp;amp; 3\cdot {\bl 9}\\&lt;br /&gt;
                 {\rd 4}\cdot {\bl 7} &amp;amp; +&amp;amp; {\rd 5} \cdot {\bl 8} &amp;amp;+&amp;amp; {\rd 6}\cdot {\bl 9}&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) =&lt;br /&gt;
       \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 50\\&lt;br /&gt;
                 122&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
\\&lt;br /&gt;
             &amp;amp; (n = 3, m = 2)&lt;br /&gt;
             \\&lt;br /&gt;
B &amp;amp;= \left ( \begin{array}{ccc}&lt;br /&gt;
                 \rd b_{1,1} &amp;amp; \ldots &amp;amp; \bl b_{1,r} \\&lt;br /&gt;
                 \vdots &amp;amp; &amp;amp; \vdots \\&lt;br /&gt;
                 \rd b_{n,r} &amp;amp; \ldots &amp;amp; \bl b_{n,r}&lt;br /&gt;
             \end{array}&lt;br /&gt;
      \right ) = ({\rd b_1}, \ldots , {\bl b_r})\\&lt;br /&gt;
A \cdot B &amp;amp;:= (Ab_1, \ldots, Ab_r) \in \bR^{m,r}&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{ccc}&lt;br /&gt;
                 1 &amp;amp; 2 &amp;amp; -1\\&lt;br /&gt;
                 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
                 3 &amp;amp; 0 &amp;amp; 4&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) \cdot&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 5 &amp;amp; 0\\&lt;br /&gt;
                 6 &amp;amp; 0 \\&lt;br /&gt;
                 7 &amp;amp; 1&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &amp;amp;=&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 1\cdot5+2\cdot 6-1\cdot 7 &amp;amp; 1\cdot 0 + 2 \cdot 0 -1\cdot 1\\&lt;br /&gt;
                 0\cdot 5 + 1\cdot 6 + 0\cdot 7 &amp;amp; 0\cdot 0 + 1\cdot0+0\cdot 1 \\&lt;br /&gt;
                 3\cdot 5 + 0\cdot 6 + 4 \cdot 7 &amp;amp; 3\cdot 0 + 0\cdot 0 + 4\cdot 1&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) =              \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 10 &amp;amp; -1 \\&lt;br /&gt;
                 6 &amp;amp; 0 \\&lt;br /&gt;
                 43 &amp;amp; 4&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin {align*}&lt;br /&gt;
f(g(y)) &amp;amp;= A\cdot B \cdot y\\&lt;br /&gt;
A\cdot(x+x') &amp;amp;= A\cdot x + A\cdot x' \\&lt;br /&gt;
A\cdot(B+C) &amp;amp;= A \cdot B + A\cdot C \\&lt;br /&gt;
A\cdot(\lambda\cdot c) &amp;amp;= \lambda \cdot A \cdot x&lt;br /&gt;
\end{align*}&lt;br /&gt;
\end{document}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Matrizen in OpenGl==&lt;br /&gt;
===Die drei OpenGL Matrizen===&lt;br /&gt;
In OpenGL gibt es drei 4x4-Matrizen welche alle mit Hilfe von [[glTranslate]], [[glScale]], [[glRotate]],[[glMultMatrix]],[[glLoadMatrix]] und [[glLoadIdentity]] bearbeitet werden können. Welche Matrix von diesen Funktionen beeinfusst wird, kann durch [[glMatrixMode]] gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Die 3 Matrizen sind:&lt;br /&gt;
&lt;br /&gt;
====GL_PERSPECTIVE====&lt;br /&gt;
&lt;br /&gt;
Sollte nur für die Festlegung der Perspektive genutzt werden.&lt;br /&gt;
&lt;br /&gt;
====GL_MODELVIEW==== &lt;br /&gt;
&lt;br /&gt;
Legt Position und Größe des zu zeichnenden Primitiven fest&lt;br /&gt;
&lt;br /&gt;
====GL_TEXTURE====&lt;br /&gt;
&lt;br /&gt;
Beinhaltet Informationen wie Texturen dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Noch mehr Informationen zu den Matrizen und was sie bewirken gibts im [[Tutorial Matrix2]].&lt;br /&gt;
&lt;br /&gt;
===Aufbau einer OpenGL-Matrix===&lt;br /&gt;
&lt;br /&gt;
Möchte man mit OpenGL an einer bestimmten Stelle etwas zeichnen, so kann man mit Hilfe von [[glTranslate]] und [[glRotate]] die Modelview-Matrix so manipulieren, dass etwa der mit [[glVertex]] übergebene Eckpunkt (0/0/0) im Weltkoordinaten System nicht mehr in der Mitte liegt. Alle Punkte erscheinen scheinbar in einen zweiten Koordinaten System welches etwas verdreht, vegrößert oder verrutsch liegen kann.&lt;br /&gt;
&lt;br /&gt;
Dieses zweite Koordinaten-System wird durch eine 4x4-Matrix, also einem zwei dimensionenlen Array mit vier Spalten und Zeilen, beschrieben.&lt;br /&gt;
&lt;br /&gt;
Damit besser verstanden werden kann, wie dies funktioniert, wird die Funktionsweise anhand eines zwei dimensionalen Koordinaten System demonstiert.&lt;br /&gt;
&lt;br /&gt;
Möchte man in einem einfachen 2D Koordiaten-System den Punkt (X/Y) antragen, so hängt man X mal den Vektor der X-Achse aneinander, und Y mal den Vektor der Y-Achse.&lt;br /&gt;
&lt;br /&gt;
[[Bild:KoordinatenSystemA.png]]&lt;br /&gt;
&lt;br /&gt;
Um die Lage und Größe eines Koordinatensystems zu beschreiben werden also einmal die Vektoren benötiget die 1 '''L'''ängen '''E'''inheit meiner Achsen beschreiben, sowie ein Vektor der ihre Position in Anhängigkeit zum übergeordneten Koordinatensystems beschreibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:KoordinatenSystemB.png]]&lt;br /&gt;
&lt;br /&gt;
Wie bereits bemerkt, müssten die Matrizen eigentlich 3x3-Matrizen sein, da sie ja auf dem 3D-Raum operieren sollen. Damit lassen sich jedoch keine Verschiebungen beschreiben, weswegen man bei der Übergabe von Vertexdaten mit [[glVertex]] im Hintergrund eine 4. Koordinate ''w'' neben (x,y,z) einführt. Diese hat, wenn nicht explizit über glVertex4x angegeben, den Wert 1. So lassen sich mit 3x3 Matrizen (aus denen jetzt durch Hinzunahme von ''w'', 4x4 Matrizen geworden sind) auch Verschiebungen beschreiben:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| X || X || X || X || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Y || Y || Y || Y || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Z || Z || Z || Z || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| W || W || W || W || |&lt;br /&gt;
|}&lt;br /&gt;
So wirkt jede Zeile der OpenGl-Matrix auf genau die entsprechende &lt;br /&gt;
Koordinate des Vertex nach der Multiplikation mit einem Vertex (x,y,z,1). Ist die letzte Zeile der Matrix (0,0,0,1), hat also die Matrix die Form:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| X || X || X || X || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Y || Y || Y || Y || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Z || Z || Z || Z || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 0 || 0 || 1 || |&lt;br /&gt;
|}&lt;br /&gt;
Dann beschreibt die letzte Spalte der Matrix gerade die Verschiebung unseres Vertices, wie man mit der oben definierten Anwendung einer Matrix auf einen Vektor leicht überprüft. Am Ende wird die w-Koordinate, sofern sie 1 ist, wieder verworfen - was sie auch bleibt, denn die letzte Zeile der OpenGl Matrix ist gerade so gewählt, daß dies sichergestellt ist. Nur bei der endgültigen Darstellung auf den Monitor kommt der w-Koordinate noch eine weitere Bedeutung zu, weshalb Projektionsmatrizen ( erzeugt durch [[glOrtho]], [[glFrustum]], ... ) sich an Regel der letzten Zeile (0,0,0,1) nicht halten. &lt;br /&gt;
&lt;br /&gt;
Folgendes Format könnte man nutzen, um eine Matrix mit [[glGetFloatv]] auszulesen oder mit [[glLoadMatrix]] zu setzen.&lt;br /&gt;
&lt;br /&gt;
 TVektor = '''record''' X,Y,Z,W:glFloat '''end''';&lt;br /&gt;
 TMatrix = '''array'''[(mat_XAchse,mat_YAchse,mat_ZAchse,mat_Position)]'''of''' TVektor;&lt;br /&gt;
 PMatrix = ^TMatrix;&lt;br /&gt;
&lt;br /&gt;
Man beachte dabei, daß OpenGL Matrizen '''Spaltenweise''' im Speicher ablegt sind. Siehe dazu auch: [[glMultMatrix]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Berechnungen===&lt;br /&gt;
&lt;br /&gt;
====Anwenden einer Matrix auf einen Vektor/Punkt====&lt;br /&gt;
&lt;br /&gt;
Möchte man zum Beispiel wissen wie ein Punkt im übergeordneten Koordinaten-System aussieht, so kann man das folgendermaßen ausrechnen (wie dies zu Berechnen ist kann auch der obigen Zeichung entnommen werden (w wird nicht beachtet)):&lt;br /&gt;
&lt;br /&gt;
 ErgebnisVektor=X*XAchsenVektor + Y*YAchsenVektor + Z*ZAchsenVektor + PositionsVektor&lt;br /&gt;
&lt;br /&gt;
Ausführlich sähe dies dann so aus:&lt;br /&gt;
&lt;br /&gt;
 Ergebnis.X=X*XAchse.X + X*YAchse.X + X*ZAchse.X + Position.X;&lt;br /&gt;
 Ergebnis.Y=Y*XAchse.Y + Y*YAchse.Y + Y*ZAchse.Y + Position.Y;&lt;br /&gt;
 Ergebnis.Z=Z*XAchse.Z + Y*YAchse.Z + Y*ZAchse.Z + Position.Z;&lt;br /&gt;
&lt;br /&gt;
====Matrizen multiplizieren====&lt;br /&gt;
&lt;br /&gt;
Das Multiplizieren, also das Hintereinanderausführen von zwei Matrizen ist einfach, wenn man weis, wie man Vektoren auf Matrizen anwendet und dass (in OpenGL) Matrizen aus in die Spalten geschriebenen Vektoren bestehen. Man braucht nämlich nur auf alle Spalten einer Matrix die andere Matrix anwenden und erhält so eine neue Matrix. Wichtig bei der Matrizenmultiplikation ist auch die &amp;quot;Reihenfolge&amp;quot;, also welche Matrix auf die Spalten der jeweils Anderen angewendet wird (erst drehen dann verschieben oder erst verschieben und dann drehen macht einen Unterschied). &lt;br /&gt;
&lt;br /&gt;
===Die Identitätsmatrix===&lt;br /&gt;
Ist eine Matrix mit folgenden Werten:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|rowspan=4 valign=&amp;quot;middle&amp;quot; |&amp;lt;font style=&amp;quot;font-size:30pt&amp;quot;&amp;gt;{&amp;lt;/font&amp;gt;&lt;br /&gt;
| 1 || 0 || 0 || 0&lt;br /&gt;
|rowspan=4 valign=&amp;quot;middle&amp;quot; |&amp;lt;font style=&amp;quot;font-size:30pt&amp;quot;&amp;gt;}&amp;lt;/font&amp;gt;   &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 1&lt;br /&gt;
|-   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wendet man auf einen Vektor eine solche Matrix an, so bleibt der Vektor gleich.&lt;br /&gt;
&lt;br /&gt;
Um die aktuelle Matrix zur einer Identitätsmatrix zu machen, ruft man [[glLoadIdentity]] auf.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zum leichteren Verständnis===&lt;br /&gt;
''Dieser Abschnitt ist nicht für fortgeschrittene 3D Entwickler gedacht, sollte aber Anfängern die immer noch nicht wissen, was Matrizen eigentlich in OpenGL machen einen leichteren Einblick verschaffen.''&lt;br /&gt;
&lt;br /&gt;
Um sich Matrizen in OpenGL leichter vorzustellen, kann man folgendes Bild benutzen:&lt;br /&gt;
&lt;br /&gt;
* Die 3D-Welt ist in einer Art Glaskasten abgelegt in dem es keine Physik gibt (Dinge können in der Luft schweben u.ä.).&lt;br /&gt;
* Matrizen sind Maschinen/Greifarme.&lt;br /&gt;
* Matrizen sind die einzige Möglichkeit in den Glaskasten hinein zu greifen.&lt;br /&gt;
&lt;br /&gt;
Wie wir weiter oben bereits gelernt haben sind Matrizen ja eigentlich Tabellen mit Zahlen. Diese Zahlen sind die Stellschrauben an unseren &amp;quot;Greifarmen&amp;quot;. Mit diesen Stellschrauben können wir die Greifarme im Glaskasten positionieren. Durch den OpenGL-Befehl [[glMatrixMode]] können wir auswählen welchen der beiden Arme wir gerade steuern. &lt;br /&gt;
&lt;br /&gt;
'''ModelView - Der Objektmanipulator'''&lt;br /&gt;
: Wird diese Matrix auf ein Objekt angewendet, ändert sich je nach Einstellung der Matrix dessen Position, Ausrichtung, Größe usw. (Man kann sogar den kompletten Glaskasten damit verschieben.)  (Beispiel: Wirft man einen Würfel in eine Drehungsmatrix, kommt am Ende ein gedrehter Würfel raus.)&lt;br /&gt;
&lt;br /&gt;
'''PerspectivMatrix - Die Kameralinse'''&lt;br /&gt;
: Diese Maschine ist nur für die Ausgabe zuständig. Man kann über die Stellschrauben einstellen, welche Art der Projektion (Parallel-, Perspektivisch-,...), und wie nah und wie weit Objekte maximal von der Kamera entfernt sein dürfen, um sichtbar zu sein.&lt;br /&gt;
&lt;br /&gt;
Wer nun auf den Geschmack gekommen ist und mittels [[glLoadMatrix]] mal selber die Stellschrauben einer der beiden Matrizen ändern möchte, der sollte sich das sehr gute '''Mathe Script''' zum Thema '''Computer Geometrie''' einmal ansehen (siehe Links). Das eben vermittelte Bild mag zwar helfen. Die Theorie muss aber verstanden werden um damit arbeiten zu können.&lt;br /&gt;
&lt;br /&gt;
===Zugehörige Wertrückgaben===&lt;br /&gt;
&lt;br /&gt;
Inhalt einer Matrix:&lt;br /&gt;
*[[glGet#GL_MODELVIEW_MATRIX|glGet]] mit GL_MODELVIEW_MATRIX&lt;br /&gt;
*[[glGet#GL_PROJECTION_MATRIX|glGet]] mit GL_PROJECTION_MATRIX&lt;br /&gt;
*[[glGet#GL_TEXTURE_MATRIX|glGet]] mit GL_TEXTURE_MATRIX&lt;br /&gt;
&lt;br /&gt;
Aktive Matrix:&lt;br /&gt;
*[[glGet#GL_MATRIX_MODE|glGet]] mit GL_MATRIX_MODE&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zum leichteren Verständnis===&lt;br /&gt;
''Dieser Abschnitt ist nicht für fortgeschrittene 3D Entwickler gedacht, sollte aber Anfängern die immer noch nicht wissen, was Matrizen eigentlich in OpenGL machen einen leichteren Einblick verschaffen.''&lt;br /&gt;
&lt;br /&gt;
Um sich Matrizen in OpenGL leichter vorzustellen, kann man folgendes Bild benutzen:&lt;br /&gt;
&lt;br /&gt;
* Die 3D-Welt ist in einer Art Glaskasten abgelegt in dem es keine Physik gibt (Dinge können in der Luft schweben u.ä.).&lt;br /&gt;
* Matrizen sind Maschinen/Greifarme.&lt;br /&gt;
* Matrizen sind die einzige Möglichkeit in den Glaskasten hinein zu greifen.&lt;br /&gt;
&lt;br /&gt;
Wie wir weiter oben bereits gelernt haben sind Matrizen ja eigentlich Tabellen mit Zahlen. Diese Zahlen sind die Stellschrauben an unseren &amp;quot;Greifarmen&amp;quot;. Mit diesen Stellschrauben können wir die Greifarme im Glaskasten positionieren. Durch den OpenGL-Befehl [[glMatrixMode]] können wir auswählen welchen der beiden Arme wir gerade steuern. &lt;br /&gt;
&lt;br /&gt;
'''ModelView - Der Objektmanipulator'''&lt;br /&gt;
: Wird diese Matrix auf ein Objekt angewendet, ändert sich je nach Einstellung der Matrix dessen Position, Ausrichtung, Größe usw. (Man kann sogar den kompletten Glaskasten damit verschieben.)  (Beispiel: Wirft man einen Würfel in eine Drehungsmatrix, kommt am Ende ein gedrehter Würfel raus.)&lt;br /&gt;
&lt;br /&gt;
'''PerspectivMatrix - Die Kameralinse'''&lt;br /&gt;
: Diese Maschine ist nur für die Ausgabe zuständig. Man kann über die Stellschrauben einstellen, welche Art der Projektion (Parallel-, Perspektivisch-,...), und wie nah und wie weit Objekte maximal von der Kamera entfernt sein dürfen, um sichtbar zu sein.&lt;br /&gt;
&lt;br /&gt;
Wer nun auf den Geschmack gekommen ist und mittels [[glLoadMatrix]] mal selber die Stellschrauben einer der beiden Matrizen ändern möchte, der sollte sich das sehr gute '''Mathe Script''' zum Thema '''Computer Geometrie''' einmal ansehen (siehe Links). Das eben vermittelte Bild mag zwar helfen. Die Theorie muss aber verstanden werden um damit arbeiten zu können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Siehe auch===&lt;br /&gt;
[[glMatrixMode]], [[glGet]], [[glLoadIdentity]], [[glLoadMatrix]], [[glTranslate]], [[glRotate]], [[glScale]], [[Quaternion|Quaternionen]]&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
*[[Tutorial_Nachsitzen|Tutorial: Nachsitzen]]&lt;br /&gt;
*[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf Recht umfangreiches, gut verständliches Script zum Thema &amp;quot;Computer Geometrie&amp;quot; (PDF)]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Matrix&amp;diff=24069</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Matrix&amp;diff=24069"/>
				<updated>2009-08-06T03:46:27Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Rn Vektorräume */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Matrix / Matrizen==&lt;br /&gt;
&lt;br /&gt;
===Übersicht===&lt;br /&gt;
Eine Matrix ist im wesentlichen nichts anderes als das, was man in der Programmierung als zweidimensionales Array kennt. Dabei beschreibt eine Matrix eine [http://de.wikipedia.org/wiki/Lineare_Abbildung lineare Abbildung], was als Information bei Rechnungen sehr wichtig ist.&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' Für den Einstieg in OpenGl ist ein tiefergehendes Verständnis von Matrizen noch nicht notwendig um bereits interessante Ergebnisse zu erzielen. Es genügt am Anfang zu wissen, daß man damit Verscheibungen, Drehungen und Streckungen beschreiben kann und daß die Reihenfolge der Befehle zum Manipulieren der Matrix wichtig ist. Wer also noch seine ersten Erfahrungen mit OpenGl macht, kann sich zuerst in unseren [[Tutorial|Tutorials]] informieren und erst anschließend hier wieder vorbeischauen.&lt;br /&gt;
&lt;br /&gt;
'''Anmerkung:''' Wir wollen mit den Definitionen hier nur soweit gehen, wie es für ein Verständnis von OpenGl Geometrie wichtig ist. In der Linearen Algebra werden einige der hier gegebenen Begriffe deutlich genauer und häufig auch abstrakter betrachtet. Dies würde jedoch unseren kleinen Rahmen deutlich sprengen.&lt;br /&gt;
&lt;br /&gt;
===Definition===&lt;br /&gt;
Matrizen sind Abbildungen auf Vektorräumen ganzzahliger Dimension. Für alle weiteren Betrachtungen seien deshalb die Zahlen n,m und r aus dem Bereich {1,2,3,4,5,...}, also den natürlichen Zahlen ohne Null, fest vorgegeben.&lt;br /&gt;
&lt;br /&gt;
====R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; Vektorräume====&lt;br /&gt;
Um Matrizen definieren zu können, müssen wir zuerst Vektorräume definieren. Ein Vektorraum (V,*,+) ist eine Menge Vektoren V zusammen mit einer Skalar-Multiplikation * und einer Addition auf Vektoren, auf denen man vernünftig Vektorrechnung betreiben kann.&lt;br /&gt;
&lt;br /&gt;
Hat man also zwei Vektoren v und w, so kann man diesen eindeutig einen Summevektor x zuordnen: &lt;br /&gt;
[[Bild:Vektor__summe.png|center]]&lt;br /&gt;
 &lt;br /&gt;
Ausserdem kann man sie mit einem Skalar c aus den reelen Zahlen zu einem Vektor x' strecken: &lt;br /&gt;
[[Bild:Vektor__skalar.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Beispiel''': Der Standardvektorraum R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;:&lt;br /&gt;
Ein Vektor v aus dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; besteht aus n reelen Zahlen ( seinen Komponenten v&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), deren Reihenfolge wichtig ist und auch ''n-tupel'' genannt wird. Man kann also v auch in Form seiner Komponenten schreiben:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorkomponenten.png|center]]&lt;br /&gt;
&lt;br /&gt;
Häufig wird kein Unterschied dahingehend gemacht, ob der Vektor als Zeile oder als Spalte geschrieben wird. Bei der später definierten Matrixmultiplikation wird dies jedoch durchaus interessant, wir wollen uns also erstmal darauf beschränken, daß auch die Schreibweise&lt;br /&gt;
[[Bild:Vektortranspos.png|center]]&lt;br /&gt;
für unseren Vektor v eine legitime, als Text einfacher verfassbare Schreibweise darstellt. Bei der später definierten Multiplikation mit einer Matrix der Vektor aber immer als Spalte betrachtet wird.&lt;br /&gt;
&lt;br /&gt;
Um unseren Vektorraum zu vervollständigen, brauchen wir nach Definition nun auch noch eine Addition und eine (Skalar-)Multiplikation. Die Addition geschieht komponentenweise. Hat man also einen zweiten Vektor b=(b&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,...,b&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;), so ist die Addition definiert durch:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektoraddition.png|center]]&lt;br /&gt;
&lt;br /&gt;
Die Multiplikation eines Vektors v mit einem reellen Faktor &amp;amp;lambda; entspricht einer Streckung des Vektors um &amp;amp;lambda;, was durch Multiplikation aller Komponenten von v mit &amp;amp;lambda; erreicht wird:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorskalarmultiplikation.png|center]]&lt;br /&gt;
&lt;br /&gt;
Es ergeben sich die von den normalen reelen Zahlen bekannten Rechenregeln:&lt;br /&gt;
[[Bild:Vektorassoz.png|center]]&lt;br /&gt;
D.h. man kann Skalare einfach aus Klammern ausmultiplizieren oder wieder hineinziehen. Man beachte aber, daß die Multiplikation von Vektoren mit Vektoren nicht definiert ist (Siehe auch [[Vektorprodukt]], [[Standard Skalarprodukt]]).&lt;br /&gt;
&lt;br /&gt;
Ist unser n gerade die Zahl 3 bzw. 2, so kann man durch den R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; gerade den 3-Dimensionalen bzw. 2-Dimensionalen Anschauungsraum darstellen. Vektoren kann man dann sogar zeichnen und bekommt eine bildliche Vorstellung. Vektoren werden zu einer Darstellung von Pfeilen, die eine Richtung beschreiben oder ausgehend vom Nullpunkt des Koordinatensystems einen Punkt definieren:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorvorstellung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
====Lineare Abbildungen auf dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; in den R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt;====&lt;br /&gt;
Weiter kann man Abbildungen f, die als Parameter Vektoren des R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; annehmen und diese in den R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt; abbilden, definieren. Insbesondere kann man Abbildungen definieren, die linear sind, d.h. daß f folgende Eigenschaften erfüllt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Lineare Abbildungen.png|center]]&lt;br /&gt;
&lt;br /&gt;
und zwar für alle a,b aus R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; und alle &amp;amp;lambda; aus den reellen Zahlen R. Interessant ist, daß solche Abbildungen die Rechenregeln aus unserer Vektorraumdefinition erhalten. Sehr wichtig ist jedoch: Solche Abbildungen existieren. Die einfachste ist die, die alle Vektoren aus R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&lt;br /&gt;
auf die 0 abbildet ( die 0 ist der Vektor des R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt;, in dem alle Komponenten gleich 0 ist. ). Tatsächlich gibt es deutlich mehr dieser Abbildungen und alle lassen sich als Matrizen darstellen. Und umgekehrt: Mit Matrizen lassen sich alle lineare Abbildungen auf unseren Vektorräumen beschreiben.&lt;br /&gt;
&lt;br /&gt;
====mxn-Matrizen und ihre Anwendung auf Vektoren====&lt;br /&gt;
Wie bereits angesprochen, sind Matrizen also 2 Dimensionale Felder aus rellen Zahlen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:mxnMatrix.png|center]]&lt;br /&gt;
&lt;br /&gt;
Die a&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; werden dann die Koeffizienten der Matrix genannt. Nun wollen wir das Anwenden der Matrix A aus R&amp;lt;sup&amp;gt;mxn&amp;lt;/sup&amp;gt; auf einen Vektor x definieren:&lt;br /&gt;
&lt;br /&gt;
[[Bild:mxnMatrixAnwendungaufx.png|center]]&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
[[Bild:AnwendungsbeispielMatrizen.png|center]]&lt;br /&gt;
&lt;br /&gt;
Am Bild erkennt man auch, warum die Matrix-Vektor Multiplikation ( &amp;quot; Anwendung &amp;quot; ) auch als Zeile mal Spalte bezeichnet wird, denn die Koeffizienten einer Zeile der Matrix werden der Reihe nach mit den Koeffizienten der &amp;quot;Spalte&amp;quot; des Vektors multipliziert. Dieses Verfahren kann man erweitern, indem man Vektoren als Matrizen interpretiert, die nur eine Spalte haben. Schreibt man mehrere Vektoren nebeneinander, kann man auf jede dieser Spalten die Matrix A darauf anwenden:&lt;br /&gt;
&lt;br /&gt;
====mxn-nxr-Matrix-Matrix Multiplikation====&lt;br /&gt;
Man hat also eine mxn-Matrix A und eine nxr-Matrix B, die man Spaltenweise als Vektoren versteht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:zerlegungMatrixInEinzelvektoren.png|center]]&lt;br /&gt;
&lt;br /&gt;
Bei der Multiplikation von A mit B, wird dann einfach A auf die Vektoren b&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; angewendet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikation.png|center]]&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationBeispiel.png|center]]&lt;br /&gt;
&lt;br /&gt;
====Eigenschaften====&lt;br /&gt;
Diese Multiplikation hat eine Reihe von Eigenschaften:&lt;br /&gt;
* Versteht man die Matrizen A,B als lineare Abbildungen auf Vektoren x aus dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; und y aus R&amp;lt;sup&amp;gt;r&amp;lt;/sup&amp;gt;, also f(x) = A*x und g(y) = B*y und ist A eine mxn-Matrix, sowie B eine nxr Matrix, dann ist die Abbildung f(g(y)) eine Lineare Abbildung, die beschrieben ist durch &lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationLinear.png|center]]&lt;br /&gt;
* Daraus ergibt sich, da schon die Definitions-Vektorräume verschieden sind, daß in den meisten Fällen '''nicht gilt''': '''A*B=B*A''' . Wer sich dies genauer überlegt, stellt fest, daß das 2. Produkt nur dann definiert ist, wenn A und B beides nxn-Matrizen sind. Aber selbst in diesem Fall ist es im Allgemeinen ein Unterschied, ob ich A*B oder B*A rechne ( Das führt schließlich zu der Tatsache, warum man in OpenGl aufpassen muss, ob man zuerst rotiert und dann verschiebt oder umgekehrt: Diese Operationen werden durch Matrizenmultiplikationen implementiert!  Zu genau diesem Thema findet man am Ende des [[Tutorial_Matrix2]] einige Bilder.).&lt;br /&gt;
&lt;br /&gt;
* Matrizen stellen Lineare Abbildungen dar, es gilt also:&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationLinear2.png|center]]&lt;br /&gt;
* Man nennt eine Gleichung A*x = b ein Lineares Gleichungssystem, wenn A und b bekannt und x gesucht ist. Es interessiert dann, ob es eine Lösung gibt und welche das ( sofern sie eindeutig ist ) ist.&lt;br /&gt;
&lt;br /&gt;
===Siehe Auch===&lt;br /&gt;
Es gibt noch eine Menge weiterer Eigenschaften, und Funktionen, die in Bezug auf Matrizen höchst interessant sind:&lt;br /&gt;
&lt;br /&gt;
[[Matrix_Transposition]], [[Determinante]], [[Matrix_Inversion]], [[Gauss_Algorithmus]], [[Matrixmultiplikation|Matrizenmultiplikation]], [[Techniken zur Matrixinversion]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- LaTeX-Quellcode &lt;br /&gt;
\documentclass[11pt]{article}&lt;br /&gt;
\newcommand {\bR}{{\mathbb R}}&lt;br /&gt;
\usepackage{amsmath,amsfonts}&lt;br /&gt;
\usepackage{xcolor}&lt;br /&gt;
\newcommand {\rd}{\color{red}}&lt;br /&gt;
\newcommand {\bl}{\color{blue}}&lt;br /&gt;
\begin{document}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
x &amp;amp;= v + w\\&lt;br /&gt;
x &amp;amp;= c \cdot v\\&lt;br /&gt;
v &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1} \\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) &lt;br /&gt;
     =&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                \vdots\\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) \qquad (v \in V)\\&lt;br /&gt;
v^t &amp;amp;= (v_1, \ldots, v_n)\\&lt;br /&gt;
v+b &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1} \\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) +&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                b_1 \\&lt;br /&gt;
                b_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                b_{n-1} \\&lt;br /&gt;
                b_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) =&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                v_1 +b_1\\&lt;br /&gt;
                v_2 +b_1\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1}+b_{n-1} \\&lt;br /&gt;
                v_n+b_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) &lt;br /&gt;
     \qquad (b,v \in V)\\&lt;br /&gt;
     \lambda \cdot v &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                \lambda \cdot v_1 \\&lt;br /&gt;
                \lambda \cdot v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                \lambda \cdot v_{n-1} \\&lt;br /&gt;
                \lambda \cdot v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) \qquad (\lambda \in \bR, v\in V) \\&lt;br /&gt;
     \lambda \cdot (v+b) &amp;amp;= \lambda \cdot v + \lambda \cdot b \qquad (\lambda \in \bR, v,b \in V)&lt;br /&gt;
\end{align*}&lt;br /&gt;
&lt;br /&gt;
\begin{align*}&lt;br /&gt;
     1) \; f(a+b) &amp;amp;= f(a) + f(b) &amp;amp;(a,b \in \bR^n, f(a),f(b) \in \bR^m)\\&lt;br /&gt;
     2) \; f(\lambda \cdot a) &amp;amp;= \lambda \cdot f(a) &amp;amp;(a \in \bR^n, \lambda \in \bR, f(a) \in \bR^m)&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
A &amp;amp;:= \left ( \begin{array}{ccc}&lt;br /&gt;
                 a_{1,1} &amp;amp; \ldots &amp;amp; a_ {1,n} \\&lt;br /&gt;
                 \vdots &amp;amp; &amp;amp; \vdots \\&lt;br /&gt;
                 a_{m,n} &amp;amp; \ldots &amp;amp; a_{m,n}&lt;br /&gt;
             \end{array}&lt;br /&gt;
      \right ) \\&lt;br /&gt;
A\cdot v &amp;amp;:= &lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 \sum_{i=1}^{n}a_{1,i}\cdot v_i\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                 \sum_{i=1}^{n}a_{m,i}\cdot v_i&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) = &lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 a_{1,1}\cdot v_1 + \ldots + a_{1,n}v_n\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                 a_{m,1}\cdot v_1 + \ldots + a_{m,n}v_n&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) \mbox {[m Zeilen!]} \qquad (A \in \bR^{m,n})&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
A &amp;amp;:=       \left ( &lt;br /&gt;
               \begin{array}{ccc}&lt;br /&gt;
                 1 &amp;amp; 2 &amp;amp; 3\\&lt;br /&gt;
                 \rd 4 &amp;amp; \rd 5 &amp;amp; \rd 6&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
             \qquad&lt;br /&gt;
             v =&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 \bl 7\\&lt;br /&gt;
                 \bl 8\\&lt;br /&gt;
                 \bl 9&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right )&lt;br /&gt;
             \Rightarrow&lt;br /&gt;
             A\cdot v = &lt;br /&gt;
       \left ( &lt;br /&gt;
               \begin{array}{ccccc}&lt;br /&gt;
                 1\cdot {\bl 7} &amp;amp; +&amp;amp; 2 \cdot {\bl 8} &amp;amp;+&amp;amp; 3\cdot {\bl 9}\\&lt;br /&gt;
                 {\rd 4}\cdot {\bl 7} &amp;amp; +&amp;amp; {\rd 5} \cdot {\bl 8} &amp;amp;+&amp;amp; {\rd 6}\cdot {\bl 9}&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) =&lt;br /&gt;
       \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 50\\&lt;br /&gt;
                 122&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
\\&lt;br /&gt;
             &amp;amp; (n = 3, m = 2)&lt;br /&gt;
             \\&lt;br /&gt;
B &amp;amp;= \left ( \begin{array}{ccc}&lt;br /&gt;
                 \rd b_{1,1} &amp;amp; \ldots &amp;amp; \bl b_{1,r} \\&lt;br /&gt;
                 \vdots &amp;amp; &amp;amp; \vdots \\&lt;br /&gt;
                 \rd b_{n,r} &amp;amp; \ldots &amp;amp; \bl b_{n,r}&lt;br /&gt;
             \end{array}&lt;br /&gt;
      \right ) = ({\rd b_1}, \ldots , {\bl b_r})\\&lt;br /&gt;
A \cdot B &amp;amp;:= (Ab_1, \ldots, Ab_r) \in \bR^{m,r}&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{ccc}&lt;br /&gt;
                 1 &amp;amp; 2 &amp;amp; -1\\&lt;br /&gt;
                 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
                 3 &amp;amp; 0 &amp;amp; 4&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) \cdot&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 5 &amp;amp; 0\\&lt;br /&gt;
                 6 &amp;amp; 0 \\&lt;br /&gt;
                 7 &amp;amp; 1&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &amp;amp;=&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 1\cdot5+2\cdot 6-1\cdot 7 &amp;amp; 1\cdot 0 + 2 \cdot 0 -1\cdot 1\\&lt;br /&gt;
                 0\cdot 5 + 1\cdot 6 + 0\cdot 7 &amp;amp; 0\cdot 0 + 1\cdot0+0\cdot 1 \\&lt;br /&gt;
                 3\cdot 5 + 0\cdot 6 + 4 \cdot 7 &amp;amp; 3\cdot 0 + 0\cdot 0 + 4\cdot 1&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) =              \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 10 &amp;amp; -1 \\&lt;br /&gt;
                 6 &amp;amp; 0 \\&lt;br /&gt;
                 43 &amp;amp; 4&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin {align*}&lt;br /&gt;
f(g(y)) &amp;amp;= A\cdot B \cdot y\\&lt;br /&gt;
A\cdot(x+x') &amp;amp;= A\cdot x + A\cdot x' \\&lt;br /&gt;
A\cdot(B+C) &amp;amp;= A \cdot B + A\cdot C \\&lt;br /&gt;
A\cdot(\lambda\cdot c) &amp;amp;= \lambda \cdot A \cdot x&lt;br /&gt;
\end{align*}&lt;br /&gt;
\end{document}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Matrizen in OpenGl==&lt;br /&gt;
===Die drei OpenGL Matrizen===&lt;br /&gt;
In OpenGL gibt es drei 4x4-Matrizen welche alle mit Hilfe von [[glTranslate]], [[glScale]], [[glRotate]],[[glMultMatrix]],[[glLoadMatrix]] und [[glLoadIdentity]] bearbeitet werden können. Welche Matrix von diesen Funktionen beeinfusst wird, kann durch [[glMatrixMode]] gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Die 3 Matrizen sind:&lt;br /&gt;
&lt;br /&gt;
====GL_PERSPECTIVE====&lt;br /&gt;
&lt;br /&gt;
Sollte nur für die Festlegung der Perspektive genutzt werden.&lt;br /&gt;
&lt;br /&gt;
====GL_MODELVIEW==== &lt;br /&gt;
&lt;br /&gt;
Legt Position und Größe des zu zeichnenden Primitiven fest&lt;br /&gt;
&lt;br /&gt;
====GL_TEXTURE====&lt;br /&gt;
&lt;br /&gt;
Beinhaltet Informationen wie Texturen dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Noch mehr Informationen zu den Matrizen und was sie bewirken gibts im [[Tutorial Matrix2]].&lt;br /&gt;
&lt;br /&gt;
===Aufbau einer OpenGL-Matrix===&lt;br /&gt;
&lt;br /&gt;
Möchte man mit OpenGL an einer bestimmten Stelle etwas zeichnen, so kann man mit Hilfe von [[glTranslate]] und [[glRotate]] die Modelview-Matrix so manipulieren, dass etwa der mit [[glVertex]] übergebene Eckpunkt (0/0/0) im Weltkoordinaten System nicht mehr in der Mitte liegt. Alle Punkte erscheinen scheinbar in einen zweiten Koordinaten System welches etwas verdreht, vegrößert oder verrutsch liegen kann.&lt;br /&gt;
&lt;br /&gt;
Dieses zweite Koordinaten-System wird durch eine 4x4-Matrix, also einem zwei dimensionenlen Array mit vier Spalten und Zeilen, beschrieben.&lt;br /&gt;
&lt;br /&gt;
Damit besser verstanden werden kann, wie dies funktioniert, wird die Funktionsweise anhand eines zwei dimensionalen Koordinaten System demonstiert.&lt;br /&gt;
&lt;br /&gt;
Möchte man in einem einfachen 2D Koordiaten-System den Punkt (X/Y) antragen, so hängt man X mal den Vektor der X-Achse aneinander, und Y mal den Vektor der Y-Achse.&lt;br /&gt;
&lt;br /&gt;
[[Bild:KoordinatenSystemA.png]]&lt;br /&gt;
&lt;br /&gt;
Um die Lage und Größe eines Koordinatensystems zu beschreiben werden also einmal die Vektoren benötiget die 1 '''L'''ängen '''E'''inheit meiner Achsen beschreiben, sowie ein Vektor der ihre Position in Anhängigkeit zum übergeordneten Koordinatensystems beschreibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:KoordinatenSystemB.png]]&lt;br /&gt;
&lt;br /&gt;
Wie bereits bemerkt, müssten die Matrizen eigentlich 3x3-Matrizen sein, da sie ja auf dem 3D-Raum operieren sollen. Damit lassen sich jedoch keine Verschiebungen beschreiben, weswegen man bei der Übergabe von Vertexdaten mit [[glVertex]] im Hintergrund eine 4. Koordinate ''w'' neben (x,y,z) einführt. Diese hat, wenn nicht explizit über glVertex4x angegeben, den Wert 1. So lassen sich mit 3x3 Matrizen (aus denen jetzt durch Hinzunahme von ''w'', 4x4 Matrizen geworden sind) auch Verschiebungen beschreiben:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| X || X || X || X || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Y || Y || Y || Y || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Z || Z || Z || Z || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| W || W || W || W || |&lt;br /&gt;
|}&lt;br /&gt;
So wirkt jede Zeile der OpenGl-Matrix auf genau die entsprechende &lt;br /&gt;
Koordinate des Vertex nach der Multiplikation mit einem Vertex (x,y,z,1). Ist die letzte Zeile der Matrix (0,0,0,1), hat also die Matrix die Form:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| X || X || X || X || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Y || Y || Y || Y || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Z || Z || Z || Z || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 0 || 0 || 1 || |&lt;br /&gt;
|}&lt;br /&gt;
Dann beschreibt die letzte Spalte der Matrix gerade die Verschiebung unseres Vertices, wie man mit der oben definierten Anwendung einer Matrix auf einen Vektor leicht überprüft. Am Ende wird die w-Koordinate, sofern sie 1 ist, wieder verworfen - was sie auch bleibt, denn die letzte Zeile der OpenGl Matrix ist gerade so gewählt, daß dies sichergestellt ist. Nur bei der endgültigen Darstellung auf den Monitor kommt der w-Koordinate noch eine weitere Bedeutung zu, weshalb Projektionsmatrizen ( erzeugt durch [[glOrtho]], [[glFrustum]], ... ) sich an Regel der letzten Zeile (0,0,0,1) nicht halten. &lt;br /&gt;
&lt;br /&gt;
Folgendes Format könnte man nutzen, um eine Matrix mit [[glGetFloatv]] auszulesen oder mit [[glLoadMatrix]] zu setzen.&lt;br /&gt;
&lt;br /&gt;
 TVektor = '''record''' X,Y,Z,W:glFloat '''end''';&lt;br /&gt;
 TMatrix = '''array'''[(mat_XAchse,mat_YAchse,mat_ZAchse,mat_Position)]'''of''' TVektor;&lt;br /&gt;
 PMatrix = ^TMatrix;&lt;br /&gt;
&lt;br /&gt;
Man beachte dabei, daß OpenGL Matrizen '''Spaltenweise''' im Speicher ablegt sind. Siehe dazu auch: [[glMultMatrix]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Berechnungen===&lt;br /&gt;
&lt;br /&gt;
====Anwenden einer Matrix auf einen Vektor/Punkt====&lt;br /&gt;
&lt;br /&gt;
Möchte man zum Beispiel wissen wie ein Punkt im übergeordneten Koordinaten-System aussieht, so kann man das folgendermaßen ausrechnen (wie dies zu Berechnen ist kann auch der obigen Zeichung entnommen werden (w wird nicht beachtet)):&lt;br /&gt;
&lt;br /&gt;
 ErgebnisVektor=X*XAchsenVektor + Y*YAchsenVektor + Z*ZAchsenVektor + PositionsVektor&lt;br /&gt;
&lt;br /&gt;
Ausführlich sähe dies dann so aus:&lt;br /&gt;
&lt;br /&gt;
 Ergebnis.X=X*XAchse.X + X*YAchse.X + X*ZAchse.X + Position.X;&lt;br /&gt;
 Ergebnis.Y=Y*XAchse.Y + Y*YAchse.Y + Y*ZAchse.Y + Position.Y;&lt;br /&gt;
 Ergebnis.Z=Z*XAchse.Z + Y*YAchse.Z + Y*ZAchse.Z + Position.Z;&lt;br /&gt;
&lt;br /&gt;
====Matrizen multiplizieren====&lt;br /&gt;
&lt;br /&gt;
Das Multiplizieren, also das Hintereinanderausführen von zwei Matrizen ist einfach, wenn man weis, wie man Vektoren auf Matrizen anwendet und dass (in OpenGL) Matrizen aus in die Spalten geschriebenen Vektoren bestehen. Man braucht nämlich nur auf alle Spalten einer Matrix die andere Matrix anwenden und erhält so eine neue Matrix. Wichtig bei der Matrizenmultiplikation ist auch die &amp;quot;Reihenfolge&amp;quot;, also welche Matrix auf die Spalten der jeweils Anderen angewendet wird (erst drehen dann verschieben oder erst verschieben und dann drehen macht einen Unterschied). &lt;br /&gt;
&lt;br /&gt;
===Die Identitätsmatrix===&lt;br /&gt;
Ist eine Matrix mit folgenden Werten:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|rowspan=4 valign=&amp;quot;middle&amp;quot; |&amp;lt;font style=&amp;quot;font-size:30pt&amp;quot;&amp;gt;{&amp;lt;/font&amp;gt;&lt;br /&gt;
| 1 || 0 || 0 || 0&lt;br /&gt;
|rowspan=4 valign=&amp;quot;middle&amp;quot; |&amp;lt;font style=&amp;quot;font-size:30pt&amp;quot;&amp;gt;}&amp;lt;/font&amp;gt;   &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 1&lt;br /&gt;
|-   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wendet man auf einen Vektor eine solche Matrix an, so bleibt der Vektor gleich.&lt;br /&gt;
&lt;br /&gt;
Um die aktuelle Matrix zur einer Identitätsmatrix zu machen, ruft man [[glLoadIdentity]] auf.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zum leichteren Verständnis===&lt;br /&gt;
''Dieser Abschnitt ist nicht für fortgeschrittene 3D Entwickler gedacht, sollte aber Anfängern die immer noch nicht wissen, was Matrizen eigentlich in OpenGL machen einen leichteren Einblick verschaffen.''&lt;br /&gt;
&lt;br /&gt;
Um sich Matrizen in OpenGL leichter vorzustellen, kann man folgendes Bild benutzen:&lt;br /&gt;
&lt;br /&gt;
* Die 3D-Welt ist in einer Art Glaskasten abgelegt in dem es keine Physik gibt (Dinge können in der Luft schweben u.ä.).&lt;br /&gt;
* Matrizen sind Maschinen/Greifarme.&lt;br /&gt;
* Matrizen sind die einzige Möglichkeit in den Glaskasten hinein zu greifen.&lt;br /&gt;
&lt;br /&gt;
Wie wir weiter oben bereits gelernt haben sind Matrizen ja eigentlich Tabellen mit Zahlen. Diese Zahlen sind die Stellschrauben an unseren &amp;quot;Greifarmen&amp;quot;. Mit diesen Stellschrauben können wir die Greifarme im Glaskasten positionieren. Durch den OpenGL-Befehl [[glMatrixMode]] können wir auswählen welchen der beiden Arme wir gerade steuern. &lt;br /&gt;
&lt;br /&gt;
'''ModelView - Der Objektmanipulator'''&lt;br /&gt;
: Wird diese Matrix auf ein Objekt angewendet, ändert sich je nach Einstellung der Matrix dessen Position, Ausrichtung, Größe usw. (Man kann sogar den kompletten Glaskasten damit verschieben.)  (Beispiel: Wirft man einen Würfel in eine Drehungsmatrix, kommt am Ende ein gedrehter Würfel raus.)&lt;br /&gt;
&lt;br /&gt;
'''PerspectivMatrix - Die Kameralinse'''&lt;br /&gt;
: Diese Maschine ist nur für die Ausgabe zuständig. Man kann über die Stellschrauben einstellen, welche Art der Projektion (Parallel-, Perspektivisch-,...), und wie nah und wie weit Objekte maximal von der Kamera entfernt sein dürfen, um sichtbar zu sein.&lt;br /&gt;
&lt;br /&gt;
Wer nun auf den Geschmack gekommen ist und mittels [[glLoadMatrix]] mal selber die Stellschrauben einer der beiden Matrizen ändern möchte, der sollte sich das sehr gute '''Mathe Script''' zum Thema '''Computer Geometrie''' einmal ansehen (siehe Links). Das eben vermittelte Bild mag zwar helfen. Die Theorie muss aber verstanden werden um damit arbeiten zu können.&lt;br /&gt;
&lt;br /&gt;
===Zugehörige Wertrückgaben===&lt;br /&gt;
&lt;br /&gt;
Inhalt einer Matrix:&lt;br /&gt;
*[[glGet#GL_MODELVIEW_MATRIX|glGet]] mit GL_MODELVIEW_MATRIX&lt;br /&gt;
*[[glGet#GL_PROJECTION_MATRIX|glGet]] mit GL_PROJECTION_MATRIX&lt;br /&gt;
*[[glGet#GL_TEXTURE_MATRIX|glGet]] mit GL_TEXTURE_MATRIX&lt;br /&gt;
&lt;br /&gt;
Aktive Matrix:&lt;br /&gt;
*[[glGet#GL_MATRIX_MODE|glGet]] mit GL_MATRIX_MODE&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zum leichteren Verständnis===&lt;br /&gt;
''Dieser Abschnitt ist nicht für fortgeschrittene 3D Entwickler gedacht, sollte aber Anfängern die immer noch nicht wissen, was Matrizen eigentlich in OpenGL machen einen leichteren Einblick verschaffen.''&lt;br /&gt;
&lt;br /&gt;
Um sich Matrizen in OpenGL leichter vorzustellen, kann man folgendes Bild benutzen:&lt;br /&gt;
&lt;br /&gt;
* Die 3D-Welt ist in einer Art Glaskasten abgelegt in dem es keine Physik gibt (Dinge können in der Luft schweben u.ä.).&lt;br /&gt;
* Matrizen sind Maschinen/Greifarme.&lt;br /&gt;
* Matrizen sind die einzige Möglichkeit in den Glaskasten hinein zu greifen.&lt;br /&gt;
&lt;br /&gt;
Wie wir weiter oben bereits gelernt haben sind Matrizen ja eigentlich Tabellen mit Zahlen. Diese Zahlen sind die Stellschrauben an unseren &amp;quot;Greifarmen&amp;quot;. Mit diesen Stellschrauben können wir die Greifarme im Glaskasten positionieren. Durch den OpenGL-Befehl [[glMatrixMode]] können wir auswählen welchen der beiden Arme wir gerade steuern. &lt;br /&gt;
&lt;br /&gt;
'''ModelView - Der Objektmanipulator'''&lt;br /&gt;
: Wird diese Matrix auf ein Objekt angewendet, ändert sich je nach Einstellung der Matrix dessen Position, Ausrichtung, Größe usw. (Man kann sogar den kompletten Glaskasten damit verschieben.)  (Beispiel: Wirft man einen Würfel in eine Drehungsmatrix, kommt am Ende ein gedrehter Würfel raus.)&lt;br /&gt;
&lt;br /&gt;
'''PerspectivMatrix - Die Kameralinse'''&lt;br /&gt;
: Diese Maschine ist nur für die Ausgabe zuständig. Man kann über die Stellschrauben einstellen, welche Art der Projektion (Parallel-, Perspektivisch-,...), und wie nah und wie weit Objekte maximal von der Kamera entfernt sein dürfen, um sichtbar zu sein.&lt;br /&gt;
&lt;br /&gt;
Wer nun auf den Geschmack gekommen ist und mittels [[glLoadMatrix]] mal selber die Stellschrauben einer der beiden Matrizen ändern möchte, der sollte sich das sehr gute '''Mathe Script''' zum Thema '''Computer Geometrie''' einmal ansehen (siehe Links). Das eben vermittelte Bild mag zwar helfen. Die Theorie muss aber verstanden werden um damit arbeiten zu können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Siehe auch===&lt;br /&gt;
[[glMatrixMode]], [[glGet]], [[glLoadIdentity]], [[glLoadMatrix]], [[glTranslate]], [[glRotate]], [[glScale]], [[Quaternion|Quaternionen]]&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
*[[Tutorial_Nachsitzen|Tutorial: Nachsitzen]]&lt;br /&gt;
*[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf Recht umfangreiches, gut verständliches Script zum Thema &amp;quot;Computer Geometrie&amp;quot; (PDF)]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Matrix&amp;diff=24068</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Matrix&amp;diff=24068"/>
				<updated>2009-08-06T03:39:47Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Aufbau einer OpenGL-Matrix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Matrix / Matrizen==&lt;br /&gt;
&lt;br /&gt;
===Übersicht===&lt;br /&gt;
Eine Matrix ist im wesentlichen nichts anderes als das, was man in der Programmierung als zweidimensionales Array kennt. Dabei beschreibt eine Matrix eine [http://de.wikipedia.org/wiki/Lineare_Abbildung lineare Abbildung], was als Information bei Rechnungen sehr wichtig ist.&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' Für den Einstieg in OpenGl ist ein tiefergehendes Verständnis von Matrizen noch nicht notwendig um bereits interessante Ergebnisse zu erzielen. Es genügt am Anfang zu wissen, daß man damit Verscheibungen, Drehungen und Streckungen beschreiben kann und daß die Reihenfolge der Befehle zum Manipulieren der Matrix wichtig ist. Wer also noch seine ersten Erfahrungen mit OpenGl macht, kann sich zuerst in unseren [[Tutorial|Tutorials]] informieren und erst anschließend hier wieder vorbeischauen.&lt;br /&gt;
&lt;br /&gt;
'''Anmerkung:''' Wir wollen mit den Definitionen hier nur soweit gehen, wie es für ein Verständnis von OpenGl Geometrie wichtig ist. In der Linearen Algebra werden einige der hier gegebenen Begriffe deutlich genauer und häufig auch abstrakter betrachtet. Dies würde jedoch unseren kleinen Rahmen deutlich sprengen.&lt;br /&gt;
&lt;br /&gt;
===Definition===&lt;br /&gt;
Matrizen sind Abbildungen auf Vektorräumen ganzzahliger Dimension. Für alle weiteren Betrachtungen seien deshalb die Zahlen n,m und r aus dem Bereich {1,2,3,4,5,...}, also den natürlichen Zahlen ohne Null, fest vorgegeben.&lt;br /&gt;
&lt;br /&gt;
====R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; Vektorräume====&lt;br /&gt;
Um Matrizen definieren zu können, müssen wir zuerst Vektorräume definieren. Ein Vektorraum (V,*,+) ist eine Menge Vektoren V zusammen mit einer Skalar-Multiplikation * und einer Addition auf Vektoren, auf denen man vernünftig Vektorrechnung betreiben kann.&lt;br /&gt;
&lt;br /&gt;
Hat man also zwei Vektoren v und w, so kann man diesen eindeutig einen Summevektor x zuordnen: &lt;br /&gt;
[[Bild:Vektor__summe.png|center]]&lt;br /&gt;
 &lt;br /&gt;
Ausserdem kann man sie mit einem Skalar c aus den reelen Zahlen zu einem Vektor x' strecken: &lt;br /&gt;
[[Bild:Vektor__skalar.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Beispiel''': Der Standardvektorraum R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;:&lt;br /&gt;
Ein Vektor v aus dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; besteht aus n reelen Zahlen ( seinen Komponenten v&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), deren Reihenfolge wichtig ist. Man kann also v auch in Form seiner Komponenten schreiben:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorkomponenten.png|center]]&lt;br /&gt;
&lt;br /&gt;
Häufig wird kein Unterschied dahingehend gemacht, ob der Vektor als Zeile oder als Spalte geschrieben wird. Bei der später definierten Matrixmultiplikation wird dies jedoch durchaus interessant, wir wollen uns also erstmal darauf beschränken, daß auch die Schreibweise&lt;br /&gt;
[[Bild:Vektortranspos.png|center]]&lt;br /&gt;
für unseren Vektor v eine legitime, als Text einfacher verfassbare Schreibweise darstellt. Bei der später definierten Multiplikation mit einer Matrix der Vektor aber immer als Spalte betrachtet wird.&lt;br /&gt;
&lt;br /&gt;
Um unseren Vektorraum zu vervollständigen, brauchen wir nach Definition nun auch noch eine Addition und eine (Skalar-)Multiplikation. Die Addition geschieht komponentenweise. Hat man also einen zweiten Vektor b=(b&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,...,b&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;), so ist die Addition definiert durch:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektoraddition.png|center]]&lt;br /&gt;
&lt;br /&gt;
Die Multiplikation eines Vektors v mit einem reellen Faktor &amp;amp;lambda; entspricht einer Streckung des Vektors um &amp;amp;lambda;, was durch Multiplikation aller Komponenten von v mit &amp;amp;lambda; erreicht wird:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorskalarmultiplikation.png|center]]&lt;br /&gt;
&lt;br /&gt;
Es ergeben sich die von den normalen reelen Zahlen bekannten Rechenregeln:&lt;br /&gt;
[[Bild:Vektorassoz.png|center]]&lt;br /&gt;
d.h. man kann Skalare einfach aus Klammern ausmultiplizieren oder wieder hineinziehen. Man beachte aber, daß die Multiplikation von Vektoren mit Vektoren nicht definiert ist( Siehe auch [[Vektorprodukt]], [[Standard Skalarprodukt]] ) .&lt;br /&gt;
&lt;br /&gt;
Ist unser n gerade die Zahl 3 bzw. 2, so kann man durch den R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; gerade den 3-Dimensionalen bzw. 2-Dimensionalen Anschauungsraum darstellen. Vektoren kann man dann sogar zeichnen und bekommt eine bildliche Vorstellung. Vektoren werden zu einer Darstellung von Pfeilen, die eine Richtung beschreiben oder ausgehend vom Nullpunkt des Koordinatensystems einen Punkt definieren:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Vektorvorstellung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
====Lineare Abbildungen auf dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; in den R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt;====&lt;br /&gt;
Weiter kann man Abbildungen f, die als Parameter Vektoren des R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; annehmen und diese in den R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt; abbilden, definieren. Insbesondere kann man Abbildungen definieren, die linear sind, d.h. daß f folgende Eigenschaften erfüllt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Lineare Abbildungen.png|center]]&lt;br /&gt;
&lt;br /&gt;
und zwar für alle a,b aus R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; und alle &amp;amp;lambda; aus den reellen Zahlen R. Interessant ist, daß solche Abbildungen die Rechenregeln aus unserer Vektorraumdefinition erhalten. Sehr wichtig ist jedoch: Solche Abbildungen existieren. Die einfachste ist die, die alle Vektoren aus R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&lt;br /&gt;
auf die 0 abbildet ( die 0 ist der Vektor des R&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt;, in dem alle Komponenten gleich 0 ist. ). Tatsächlich gibt es deutlich mehr dieser Abbildungen und alle lassen sich als Matrizen darstellen. Und umgekehrt: Mit Matrizen lassen sich alle lineare Abbildungen auf unseren Vektorräumen beschreiben.&lt;br /&gt;
&lt;br /&gt;
====mxn-Matrizen und ihre Anwendung auf Vektoren====&lt;br /&gt;
Wie bereits angesprochen, sind Matrizen also 2 Dimensionale Felder aus rellen Zahlen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:mxnMatrix.png|center]]&lt;br /&gt;
&lt;br /&gt;
Die a&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; werden dann die Koeffizienten der Matrix genannt. Nun wollen wir das Anwenden der Matrix A aus R&amp;lt;sup&amp;gt;mxn&amp;lt;/sup&amp;gt; auf einen Vektor x definieren:&lt;br /&gt;
&lt;br /&gt;
[[Bild:mxnMatrixAnwendungaufx.png|center]]&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
[[Bild:AnwendungsbeispielMatrizen.png|center]]&lt;br /&gt;
&lt;br /&gt;
Am Bild erkennt man auch, warum die Matrix-Vektor Multiplikation ( &amp;quot; Anwendung &amp;quot; ) auch als Zeile mal Spalte bezeichnet wird, denn die Koeffizienten einer Zeile der Matrix werden der Reihe nach mit den Koeffizienten der &amp;quot;Spalte&amp;quot; des Vektors multipliziert. Dieses Verfahren kann man erweitern, indem man Vektoren als Matrizen interpretiert, die nur eine Spalte haben. Schreibt man mehrere Vektoren nebeneinander, kann man auf jede dieser Spalten die Matrix A darauf anwenden:&lt;br /&gt;
&lt;br /&gt;
====mxn-nxr-Matrix-Matrix Multiplikation====&lt;br /&gt;
Man hat also eine mxn-Matrix A und eine nxr-Matrix B, die man Spaltenweise als Vektoren versteht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:zerlegungMatrixInEinzelvektoren.png|center]]&lt;br /&gt;
&lt;br /&gt;
Bei der Multiplikation von A mit B, wird dann einfach A auf die Vektoren b&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; angewendet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikation.png|center]]&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationBeispiel.png|center]]&lt;br /&gt;
&lt;br /&gt;
====Eigenschaften====&lt;br /&gt;
Diese Multiplikation hat eine Reihe von Eigenschaften:&lt;br /&gt;
* Versteht man die Matrizen A,B als lineare Abbildungen auf Vektoren x aus dem R&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; und y aus R&amp;lt;sup&amp;gt;r&amp;lt;/sup&amp;gt;, also f(x) = A*x und g(y) = B*y und ist A eine mxn-Matrix, sowie B eine nxr Matrix, dann ist die Abbildung f(g(y)) eine Lineare Abbildung, die beschrieben ist durch &lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationLinear.png|center]]&lt;br /&gt;
* Daraus ergibt sich, da schon die Definitions-Vektorräume verschieden sind, daß in den meisten Fällen '''nicht gilt''': '''A*B=B*A''' . Wer sich dies genauer überlegt, stellt fest, daß das 2. Produkt nur dann definiert ist, wenn A und B beides nxn-Matrizen sind. Aber selbst in diesem Fall ist es im Allgemeinen ein Unterschied, ob ich A*B oder B*A rechne ( Das führt schließlich zu der Tatsache, warum man in OpenGl aufpassen muss, ob man zuerst rotiert und dann verschiebt oder umgekehrt: Diese Operationen werden durch Matrizenmultiplikationen implementiert!  Zu genau diesem Thema findet man am Ende des [[Tutorial_Matrix2]] einige Bilder.).&lt;br /&gt;
&lt;br /&gt;
* Matrizen stellen Lineare Abbildungen dar, es gilt also:&lt;br /&gt;
[[Bild:MatrixMatrixMultiplikationLinear2.png|center]]&lt;br /&gt;
* Man nennt eine Gleichung A*x = b ein Lineares Gleichungssystem, wenn A und b bekannt und x gesucht ist. Es interessiert dann, ob es eine Lösung gibt und welche das ( sofern sie eindeutig ist ) ist.&lt;br /&gt;
&lt;br /&gt;
===Siehe Auch===&lt;br /&gt;
Es gibt noch eine Menge weiterer Eigenschaften, und Funktionen, die in Bezug auf Matrizen höchst interessant sind:&lt;br /&gt;
&lt;br /&gt;
[[Matrix_Transposition]], [[Determinante]], [[Matrix_Inversion]], [[Gauss_Algorithmus]], [[Matrixmultiplikation|Matrizenmultiplikation]], [[Techniken zur Matrixinversion]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- LaTeX-Quellcode &lt;br /&gt;
\documentclass[11pt]{article}&lt;br /&gt;
\newcommand {\bR}{{\mathbb R}}&lt;br /&gt;
\usepackage{amsmath,amsfonts}&lt;br /&gt;
\usepackage{xcolor}&lt;br /&gt;
\newcommand {\rd}{\color{red}}&lt;br /&gt;
\newcommand {\bl}{\color{blue}}&lt;br /&gt;
\begin{document}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
x &amp;amp;= v + w\\&lt;br /&gt;
x &amp;amp;= c \cdot v\\&lt;br /&gt;
v &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1} \\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) &lt;br /&gt;
     =&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                \vdots\\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) \qquad (v \in V)\\&lt;br /&gt;
v^t &amp;amp;= (v_1, \ldots, v_n)\\&lt;br /&gt;
v+b &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                v_1 \\&lt;br /&gt;
                v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1} \\&lt;br /&gt;
                v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) +&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                b_1 \\&lt;br /&gt;
                b_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                b_{n-1} \\&lt;br /&gt;
                b_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) =&lt;br /&gt;
     \left ( \begin{array}{c}&lt;br /&gt;
                v_1 +b_1\\&lt;br /&gt;
                v_2 +b_1\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                v_{n-1}+b_{n-1} \\&lt;br /&gt;
                v_n+b_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) &lt;br /&gt;
     \qquad (b,v \in V)\\&lt;br /&gt;
     \lambda \cdot v &amp;amp;= \left ( \begin{array}{c}&lt;br /&gt;
                \lambda \cdot v_1 \\&lt;br /&gt;
                \lambda \cdot v_2 \\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                \lambda \cdot v_{n-1} \\&lt;br /&gt;
                \lambda \cdot v_n&lt;br /&gt;
             \end{array}&lt;br /&gt;
     \right ) \qquad (\lambda \in \bR, v\in V) \\&lt;br /&gt;
     \lambda \cdot (v+b) &amp;amp;= \lambda \cdot v + \lambda \cdot b \qquad (\lambda \in \bR, v,b \in V)&lt;br /&gt;
\end{align*}&lt;br /&gt;
&lt;br /&gt;
\begin{align*}&lt;br /&gt;
     1) \; f(a+b) &amp;amp;= f(a) + f(b) &amp;amp;(a,b \in \bR^n, f(a),f(b) \in \bR^m)\\&lt;br /&gt;
     2) \; f(\lambda \cdot a) &amp;amp;= \lambda \cdot f(a) &amp;amp;(a \in \bR^n, \lambda \in \bR, f(a) \in \bR^m)&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
A &amp;amp;:= \left ( \begin{array}{ccc}&lt;br /&gt;
                 a_{1,1} &amp;amp; \ldots &amp;amp; a_ {1,n} \\&lt;br /&gt;
                 \vdots &amp;amp; &amp;amp; \vdots \\&lt;br /&gt;
                 a_{m,n} &amp;amp; \ldots &amp;amp; a_{m,n}&lt;br /&gt;
             \end{array}&lt;br /&gt;
      \right ) \\&lt;br /&gt;
A\cdot v &amp;amp;:= &lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 \sum_{i=1}^{n}a_{1,i}\cdot v_i\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                 \sum_{i=1}^{n}a_{m,i}\cdot v_i&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) = &lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 a_{1,1}\cdot v_1 + \ldots + a_{1,n}v_n\\&lt;br /&gt;
                 \vdots \\&lt;br /&gt;
                 a_{m,1}\cdot v_1 + \ldots + a_{m,n}v_n&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) \mbox {[m Zeilen!]} \qquad (A \in \bR^{m,n})&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
A &amp;amp;:=       \left ( &lt;br /&gt;
               \begin{array}{ccc}&lt;br /&gt;
                 1 &amp;amp; 2 &amp;amp; 3\\&lt;br /&gt;
                 \rd 4 &amp;amp; \rd 5 &amp;amp; \rd 6&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
             \qquad&lt;br /&gt;
             v =&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 \bl 7\\&lt;br /&gt;
                 \bl 8\\&lt;br /&gt;
                 \bl 9&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right )&lt;br /&gt;
             \Rightarrow&lt;br /&gt;
             A\cdot v = &lt;br /&gt;
       \left ( &lt;br /&gt;
               \begin{array}{ccccc}&lt;br /&gt;
                 1\cdot {\bl 7} &amp;amp; +&amp;amp; 2 \cdot {\bl 8} &amp;amp;+&amp;amp; 3\cdot {\bl 9}\\&lt;br /&gt;
                 {\rd 4}\cdot {\bl 7} &amp;amp; +&amp;amp; {\rd 5} \cdot {\bl 8} &amp;amp;+&amp;amp; {\rd 6}\cdot {\bl 9}&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) =&lt;br /&gt;
       \left ( &lt;br /&gt;
               \begin{array}{c}&lt;br /&gt;
                 50\\&lt;br /&gt;
                 122&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
\\&lt;br /&gt;
             &amp;amp; (n = 3, m = 2)&lt;br /&gt;
             \\&lt;br /&gt;
B &amp;amp;= \left ( \begin{array}{ccc}&lt;br /&gt;
                 \rd b_{1,1} &amp;amp; \ldots &amp;amp; \bl b_{1,r} \\&lt;br /&gt;
                 \vdots &amp;amp; &amp;amp; \vdots \\&lt;br /&gt;
                 \rd b_{n,r} &amp;amp; \ldots &amp;amp; \bl b_{n,r}&lt;br /&gt;
             \end{array}&lt;br /&gt;
      \right ) = ({\rd b_1}, \ldots , {\bl b_r})\\&lt;br /&gt;
A \cdot B &amp;amp;:= (Ab_1, \ldots, Ab_r) \in \bR^{m,r}&lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin{align*}&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{ccc}&lt;br /&gt;
                 1 &amp;amp; 2 &amp;amp; -1\\&lt;br /&gt;
                 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
                 3 &amp;amp; 0 &amp;amp; 4&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) \cdot&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 5 &amp;amp; 0\\&lt;br /&gt;
                 6 &amp;amp; 0 \\&lt;br /&gt;
                 7 &amp;amp; 1&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &amp;amp;=&lt;br /&gt;
             \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 1\cdot5+2\cdot 6-1\cdot 7 &amp;amp; 1\cdot 0 + 2 \cdot 0 -1\cdot 1\\&lt;br /&gt;
                 0\cdot 5 + 1\cdot 6 + 0\cdot 7 &amp;amp; 0\cdot 0 + 1\cdot0+0\cdot 1 \\&lt;br /&gt;
                 3\cdot 5 + 0\cdot 6 + 4 \cdot 7 &amp;amp; 3\cdot 0 + 0\cdot 0 + 4\cdot 1&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) =              \left ( &lt;br /&gt;
               \begin{array}{cc}&lt;br /&gt;
                 10 &amp;amp; -1 \\&lt;br /&gt;
                 6 &amp;amp; 0 \\&lt;br /&gt;
                 43 &amp;amp; 4&lt;br /&gt;
               \end{array}  &lt;br /&gt;
             \right ) &lt;br /&gt;
\end{align*}&lt;br /&gt;
\begin {align*}&lt;br /&gt;
f(g(y)) &amp;amp;= A\cdot B \cdot y\\&lt;br /&gt;
A\cdot(x+x') &amp;amp;= A\cdot x + A\cdot x' \\&lt;br /&gt;
A\cdot(B+C) &amp;amp;= A \cdot B + A\cdot C \\&lt;br /&gt;
A\cdot(\lambda\cdot c) &amp;amp;= \lambda \cdot A \cdot x&lt;br /&gt;
\end{align*}&lt;br /&gt;
\end{document}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Matrizen in OpenGl==&lt;br /&gt;
===Die drei OpenGL Matrizen===&lt;br /&gt;
In OpenGL gibt es drei 4x4-Matrizen welche alle mit Hilfe von [[glTranslate]], [[glScale]], [[glRotate]],[[glMultMatrix]],[[glLoadMatrix]] und [[glLoadIdentity]] bearbeitet werden können. Welche Matrix von diesen Funktionen beeinfusst wird, kann durch [[glMatrixMode]] gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Die 3 Matrizen sind:&lt;br /&gt;
&lt;br /&gt;
====GL_PERSPECTIVE====&lt;br /&gt;
&lt;br /&gt;
Sollte nur für die Festlegung der Perspektive genutzt werden.&lt;br /&gt;
&lt;br /&gt;
====GL_MODELVIEW==== &lt;br /&gt;
&lt;br /&gt;
Legt Position und Größe des zu zeichnenden Primitiven fest&lt;br /&gt;
&lt;br /&gt;
====GL_TEXTURE====&lt;br /&gt;
&lt;br /&gt;
Beinhaltet Informationen wie Texturen dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Noch mehr Informationen zu den Matrizen und was sie bewirken gibts im [[Tutorial Matrix2]].&lt;br /&gt;
&lt;br /&gt;
===Aufbau einer OpenGL-Matrix===&lt;br /&gt;
&lt;br /&gt;
Möchte man mit OpenGL an einer bestimmten Stelle etwas zeichnen, so kann man mit Hilfe von [[glTranslate]] und [[glRotate]] die Modelview-Matrix so manipulieren, dass etwa der mit [[glVertex]] übergebene Eckpunkt (0/0/0) im Weltkoordinaten System nicht mehr in der Mitte liegt. Alle Punkte erscheinen scheinbar in einen zweiten Koordinaten System welches etwas verdreht, vegrößert oder verrutsch liegen kann.&lt;br /&gt;
&lt;br /&gt;
Dieses zweite Koordinaten-System wird durch eine 4x4-Matrix, also einem zwei dimensionenlen Array mit vier Spalten und Zeilen, beschrieben.&lt;br /&gt;
&lt;br /&gt;
Damit besser verstanden werden kann, wie dies funktioniert, wird die Funktionsweise anhand eines zwei dimensionalen Koordinaten System demonstiert.&lt;br /&gt;
&lt;br /&gt;
Möchte man in einem einfachen 2D Koordiaten-System den Punkt (X/Y) antragen, so hängt man X mal den Vektor der X-Achse aneinander, und Y mal den Vektor der Y-Achse.&lt;br /&gt;
&lt;br /&gt;
[[Bild:KoordinatenSystemA.png]]&lt;br /&gt;
&lt;br /&gt;
Um die Lage und Größe eines Koordinatensystems zu beschreiben werden also einmal die Vektoren benötiget die 1 '''L'''ängen '''E'''inheit meiner Achsen beschreiben, sowie ein Vektor der ihre Position in Anhängigkeit zum übergeordneten Koordinatensystems beschreibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:KoordinatenSystemB.png]]&lt;br /&gt;
&lt;br /&gt;
Wie bereits bemerkt, müssten die Matrizen eigentlich 3x3-Matrizen sein, da sie ja auf dem 3D-Raum operieren sollen. Damit lassen sich jedoch keine Verschiebungen beschreiben, weswegen man bei der Übergabe von Vertexdaten mit [[glVertex]] im Hintergrund eine 4. Koordinate ''w'' neben (x,y,z) einführt. Diese hat, wenn nicht explizit über glVertex4x angegeben, den Wert 1. So lassen sich mit 3x3 Matrizen (aus denen jetzt durch Hinzunahme von ''w'', 4x4 Matrizen geworden sind) auch Verschiebungen beschreiben:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| X || X || X || X || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Y || Y || Y || Y || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Z || Z || Z || Z || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| W || W || W || W || |&lt;br /&gt;
|}&lt;br /&gt;
So wirkt jede Zeile der OpenGl-Matrix auf genau die entsprechende &lt;br /&gt;
Koordinate des Vertex nach der Multiplikation mit einem Vertex (x,y,z,1). Ist die letzte Zeile der Matrix (0,0,0,1), hat also die Matrix die Form:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| X || X || X || X || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Y || Y || Y || Y || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Z || Z || Z || Z || |&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 0 || 0 || 1 || |&lt;br /&gt;
|}&lt;br /&gt;
Dann beschreibt die letzte Spalte der Matrix gerade die Verschiebung unseres Vertices, wie man mit der oben definierten Anwendung einer Matrix auf einen Vektor leicht überprüft. Am Ende wird die w-Koordinate, sofern sie 1 ist, wieder verworfen - was sie auch bleibt, denn die letzte Zeile der OpenGl Matrix ist gerade so gewählt, daß dies sichergestellt ist. Nur bei der endgültigen Darstellung auf den Monitor kommt der w-Koordinate noch eine weitere Bedeutung zu, weshalb Projektionsmatrizen ( erzeugt durch [[glOrtho]], [[glFrustum]], ... ) sich an Regel der letzten Zeile (0,0,0,1) nicht halten. &lt;br /&gt;
&lt;br /&gt;
Folgendes Format könnte man nutzen, um eine Matrix mit [[glGetFloatv]] auszulesen oder mit [[glLoadMatrix]] zu setzen.&lt;br /&gt;
&lt;br /&gt;
 TVektor = '''record''' X,Y,Z,W:glFloat '''end''';&lt;br /&gt;
 TMatrix = '''array'''[(mat_XAchse,mat_YAchse,mat_ZAchse,mat_Position)]'''of''' TVektor;&lt;br /&gt;
 PMatrix = ^TMatrix;&lt;br /&gt;
&lt;br /&gt;
Man beachte dabei, daß OpenGL Matrizen '''Spaltenweise''' im Speicher ablegt sind. Siehe dazu auch: [[glMultMatrix]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Berechnungen===&lt;br /&gt;
&lt;br /&gt;
====Anwenden einer Matrix auf einen Vektor/Punkt====&lt;br /&gt;
&lt;br /&gt;
Möchte man zum Beispiel wissen wie ein Punkt im übergeordneten Koordinaten-System aussieht, so kann man das folgendermaßen ausrechnen (wie dies zu Berechnen ist kann auch der obigen Zeichung entnommen werden (w wird nicht beachtet)):&lt;br /&gt;
&lt;br /&gt;
 ErgebnisVektor=X*XAchsenVektor + Y*YAchsenVektor + Z*ZAchsenVektor + PositionsVektor&lt;br /&gt;
&lt;br /&gt;
Ausführlich sähe dies dann so aus:&lt;br /&gt;
&lt;br /&gt;
 Ergebnis.X=X*XAchse.X + X*YAchse.X + X*ZAchse.X + Position.X;&lt;br /&gt;
 Ergebnis.Y=Y*XAchse.Y + Y*YAchse.Y + Y*ZAchse.Y + Position.Y;&lt;br /&gt;
 Ergebnis.Z=Z*XAchse.Z + Y*YAchse.Z + Y*ZAchse.Z + Position.Z;&lt;br /&gt;
&lt;br /&gt;
====Matrizen multiplizieren====&lt;br /&gt;
&lt;br /&gt;
Das Multiplizieren, also das Hintereinanderausführen von zwei Matrizen ist einfach, wenn man weis, wie man Vektoren auf Matrizen anwendet und dass (in OpenGL) Matrizen aus in die Spalten geschriebenen Vektoren bestehen. Man braucht nämlich nur auf alle Spalten einer Matrix die andere Matrix anwenden und erhält so eine neue Matrix. Wichtig bei der Matrizenmultiplikation ist auch die &amp;quot;Reihenfolge&amp;quot;, also welche Matrix auf die Spalten der jeweils Anderen angewendet wird (erst drehen dann verschieben oder erst verschieben und dann drehen macht einen Unterschied). &lt;br /&gt;
&lt;br /&gt;
===Die Identitätsmatrix===&lt;br /&gt;
Ist eine Matrix mit folgenden Werten:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|rowspan=4 valign=&amp;quot;middle&amp;quot; |&amp;lt;font style=&amp;quot;font-size:30pt&amp;quot;&amp;gt;{&amp;lt;/font&amp;gt;&lt;br /&gt;
| 1 || 0 || 0 || 0&lt;br /&gt;
|rowspan=4 valign=&amp;quot;middle&amp;quot; |&amp;lt;font style=&amp;quot;font-size:30pt&amp;quot;&amp;gt;}&amp;lt;/font&amp;gt;   &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 1&lt;br /&gt;
|-   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wendet man auf einen Vektor eine solche Matrix an, so bleibt der Vektor gleich.&lt;br /&gt;
&lt;br /&gt;
Um die aktuelle Matrix zur einer Identitätsmatrix zu machen, ruft man [[glLoadIdentity]] auf.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zum leichteren Verständnis===&lt;br /&gt;
''Dieser Abschnitt ist nicht für fortgeschrittene 3D Entwickler gedacht, sollte aber Anfängern die immer noch nicht wissen, was Matrizen eigentlich in OpenGL machen einen leichteren Einblick verschaffen.''&lt;br /&gt;
&lt;br /&gt;
Um sich Matrizen in OpenGL leichter vorzustellen, kann man folgendes Bild benutzen:&lt;br /&gt;
&lt;br /&gt;
* Die 3D-Welt ist in einer Art Glaskasten abgelegt in dem es keine Physik gibt (Dinge können in der Luft schweben u.ä.).&lt;br /&gt;
* Matrizen sind Maschinen/Greifarme.&lt;br /&gt;
* Matrizen sind die einzige Möglichkeit in den Glaskasten hinein zu greifen.&lt;br /&gt;
&lt;br /&gt;
Wie wir weiter oben bereits gelernt haben sind Matrizen ja eigentlich Tabellen mit Zahlen. Diese Zahlen sind die Stellschrauben an unseren &amp;quot;Greifarmen&amp;quot;. Mit diesen Stellschrauben können wir die Greifarme im Glaskasten positionieren. Durch den OpenGL-Befehl [[glMatrixMode]] können wir auswählen welchen der beiden Arme wir gerade steuern. &lt;br /&gt;
&lt;br /&gt;
'''ModelView - Der Objektmanipulator'''&lt;br /&gt;
: Wird diese Matrix auf ein Objekt angewendet, ändert sich je nach Einstellung der Matrix dessen Position, Ausrichtung, Größe usw. (Man kann sogar den kompletten Glaskasten damit verschieben.)  (Beispiel: Wirft man einen Würfel in eine Drehungsmatrix, kommt am Ende ein gedrehter Würfel raus.)&lt;br /&gt;
&lt;br /&gt;
'''PerspectivMatrix - Die Kameralinse'''&lt;br /&gt;
: Diese Maschine ist nur für die Ausgabe zuständig. Man kann über die Stellschrauben einstellen, welche Art der Projektion (Parallel-, Perspektivisch-,...), und wie nah und wie weit Objekte maximal von der Kamera entfernt sein dürfen, um sichtbar zu sein.&lt;br /&gt;
&lt;br /&gt;
Wer nun auf den Geschmack gekommen ist und mittels [[glLoadMatrix]] mal selber die Stellschrauben einer der beiden Matrizen ändern möchte, der sollte sich das sehr gute '''Mathe Script''' zum Thema '''Computer Geometrie''' einmal ansehen (siehe Links). Das eben vermittelte Bild mag zwar helfen. Die Theorie muss aber verstanden werden um damit arbeiten zu können.&lt;br /&gt;
&lt;br /&gt;
===Zugehörige Wertrückgaben===&lt;br /&gt;
&lt;br /&gt;
Inhalt einer Matrix:&lt;br /&gt;
*[[glGet#GL_MODELVIEW_MATRIX|glGet]] mit GL_MODELVIEW_MATRIX&lt;br /&gt;
*[[glGet#GL_PROJECTION_MATRIX|glGet]] mit GL_PROJECTION_MATRIX&lt;br /&gt;
*[[glGet#GL_TEXTURE_MATRIX|glGet]] mit GL_TEXTURE_MATRIX&lt;br /&gt;
&lt;br /&gt;
Aktive Matrix:&lt;br /&gt;
*[[glGet#GL_MATRIX_MODE|glGet]] mit GL_MATRIX_MODE&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zum leichteren Verständnis===&lt;br /&gt;
''Dieser Abschnitt ist nicht für fortgeschrittene 3D Entwickler gedacht, sollte aber Anfängern die immer noch nicht wissen, was Matrizen eigentlich in OpenGL machen einen leichteren Einblick verschaffen.''&lt;br /&gt;
&lt;br /&gt;
Um sich Matrizen in OpenGL leichter vorzustellen, kann man folgendes Bild benutzen:&lt;br /&gt;
&lt;br /&gt;
* Die 3D-Welt ist in einer Art Glaskasten abgelegt in dem es keine Physik gibt (Dinge können in der Luft schweben u.ä.).&lt;br /&gt;
* Matrizen sind Maschinen/Greifarme.&lt;br /&gt;
* Matrizen sind die einzige Möglichkeit in den Glaskasten hinein zu greifen.&lt;br /&gt;
&lt;br /&gt;
Wie wir weiter oben bereits gelernt haben sind Matrizen ja eigentlich Tabellen mit Zahlen. Diese Zahlen sind die Stellschrauben an unseren &amp;quot;Greifarmen&amp;quot;. Mit diesen Stellschrauben können wir die Greifarme im Glaskasten positionieren. Durch den OpenGL-Befehl [[glMatrixMode]] können wir auswählen welchen der beiden Arme wir gerade steuern. &lt;br /&gt;
&lt;br /&gt;
'''ModelView - Der Objektmanipulator'''&lt;br /&gt;
: Wird diese Matrix auf ein Objekt angewendet, ändert sich je nach Einstellung der Matrix dessen Position, Ausrichtung, Größe usw. (Man kann sogar den kompletten Glaskasten damit verschieben.)  (Beispiel: Wirft man einen Würfel in eine Drehungsmatrix, kommt am Ende ein gedrehter Würfel raus.)&lt;br /&gt;
&lt;br /&gt;
'''PerspectivMatrix - Die Kameralinse'''&lt;br /&gt;
: Diese Maschine ist nur für die Ausgabe zuständig. Man kann über die Stellschrauben einstellen, welche Art der Projektion (Parallel-, Perspektivisch-,...), und wie nah und wie weit Objekte maximal von der Kamera entfernt sein dürfen, um sichtbar zu sein.&lt;br /&gt;
&lt;br /&gt;
Wer nun auf den Geschmack gekommen ist und mittels [[glLoadMatrix]] mal selber die Stellschrauben einer der beiden Matrizen ändern möchte, der sollte sich das sehr gute '''Mathe Script''' zum Thema '''Computer Geometrie''' einmal ansehen (siehe Links). Das eben vermittelte Bild mag zwar helfen. Die Theorie muss aber verstanden werden um damit arbeiten zu können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Siehe auch===&lt;br /&gt;
[[glMatrixMode]], [[glGet]], [[glLoadIdentity]], [[glLoadMatrix]], [[glTranslate]], [[glRotate]], [[glScale]], [[Quaternion|Quaternionen]]&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
*[[Tutorial_Nachsitzen|Tutorial: Nachsitzen]]&lt;br /&gt;
*[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf Recht umfangreiches, gut verständliches Script zum Thema &amp;quot;Computer Geometrie&amp;quot; (PDF)]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Matrixtransposition&amp;diff=24066</id>
		<title>Matrixtransposition</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Matrixtransposition&amp;diff=24066"/>
				<updated>2009-08-06T03:30:34Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei der ''[[Matrix]]-Transposition'' werden die Spalten einer Matrix zu ihren Zeilen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt; [[Bild:Matrix.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
zu&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt; [[Bild:TransMatrix.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies kommt einer Spiegelung um die Diagonalachse gleich.&lt;br /&gt;
In der 3D-Grafik ist dies insbesondere nützlich, um Matrizen zu [[Techniken zur Matrixinversion|invertieren]].&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:Matrix.png&amp;diff=24065</id>
		<title>Datei:Matrix.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:Matrix.png&amp;diff=24065"/>
				<updated>2009-08-06T03:25:30Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:TransMatrix.png&amp;diff=24064</id>
		<title>Datei:TransMatrix.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:TransMatrix.png&amp;diff=24064"/>
				<updated>2009-08-06T03:24:51Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glLoadTransposeMatrix&amp;diff=24063</id>
		<title>glLoadTransposeMatrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glLoadTransposeMatrix&amp;diff=24063"/>
				<updated>2009-08-06T03:17:33Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Name */ Link korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glLoadTransposeMatrix =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glLoadTransposeMatrix''' - ersetzt die aktuelle Matrix durch eine beliebige, [[Matrix_Transposition|transponierte]] 4x4-Matrix auf dem [[Matrixstack]].&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 '''procedure''' glLoadTransposeMatrixd('''const''' ''m'': PGLdouble); &amp;lt;br&amp;gt;&lt;br /&gt;
 '''procedure''' glLoadTransposeMatrixf('''const''' ''m'': PGLfloat);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
{| border=1 rules=all&lt;br /&gt;
! ''m''&lt;br /&gt;
| Ein Zeiger auf eine 4x4-Matrix, welche die aktuelle Matrix ersetzen soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glLoadTransposeMatrix''' arbeitet fast genauso wie [[glLoadMatrix]], nur dass die Werte der Matrix zusätzlich an der Hauptdiagonalen gespiegelt werden.&lt;br /&gt;
&lt;br /&gt;
Abhängig vom aktuellen Matrix-Modus ([[glMatrixMode]]) wird dadurch die Projektions-Matrix, die Modelview-Matrix oder die Texture-Matrix ersetzt (siehe dazu [[Matrix#Die_drei_OpenGL_Matrizen|&amp;quot;Die_drei_OpenGL_Matrizen&amp;quot;]]).&amp;lt;br&amp;gt;&lt;br /&gt;
Der Parameter ''m'' zeigt auf eine 4x4-Matrix, welche zeilenweise Fließkommazahlen mit einfacher oder doppelter Genauigkeit (Single oder Double) enthält.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Matrix muß also in der folgenden Reihenfolge gespeichert sein:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 +-              -+&lt;br /&gt;
 |  0   1   2   3 |&lt;br /&gt;
 |  4   5   6   7 |&lt;br /&gt;
 |  8   9  10  11 |&lt;br /&gt;
 | 12  13  14  15 |&lt;br /&gt;
 +-              -+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glLoadTransposeMatrix''' ist erst ab OpenGL Version 1.3 oder höher nutzbar.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glLoadTransposeMatrix''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGet]] mit Token '''GL_MATRIX_MODE'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_COLOR_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TRANSPOSE_COLOR_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_MODELVIEW_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TRANSPOSE_MODELVIEW_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_PROJECTION_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TRANSPOSE_PROJECTION_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TEXTURE_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TRANSPOSE_TEXTURE_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glLoadIdentity]], [[glLoadMatrix]], [[glMatrixMode]], [[glMultMatrix]], [[glMultTransposeMatrix]], [[glPopMatrix]], [[glPushMatrix]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|LoadTransposeMatrix]]&lt;br /&gt;
[[Kategorie:GL1.3]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glLoadTransposeMatrix&amp;diff=24062</id>
		<title>glLoadTransposeMatrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glLoadTransposeMatrix&amp;diff=24062"/>
				<updated>2009-08-06T03:15:21Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Name */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glLoadTransposeMatrix =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glLoadTransposeMatrix''' - ersetzt die aktuelle Matrix durch eine beliebige, [[Matrix|transponierte]] 4x4-Matrix auf dem [[Matrixstack]].&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 '''procedure''' glLoadTransposeMatrixd('''const''' ''m'': PGLdouble); &amp;lt;br&amp;gt;&lt;br /&gt;
 '''procedure''' glLoadTransposeMatrixf('''const''' ''m'': PGLfloat);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
{| border=1 rules=all&lt;br /&gt;
! ''m''&lt;br /&gt;
| Ein Zeiger auf eine 4x4-Matrix, welche die aktuelle Matrix ersetzen soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glLoadTransposeMatrix''' arbeitet fast genauso wie [[glLoadMatrix]], nur dass die Werte der Matrix zusätzlich an der Hauptdiagonalen gespiegelt werden.&lt;br /&gt;
&lt;br /&gt;
Abhängig vom aktuellen Matrix-Modus ([[glMatrixMode]]) wird dadurch die Projektions-Matrix, die Modelview-Matrix oder die Texture-Matrix ersetzt (siehe dazu [[Matrix#Die_drei_OpenGL_Matrizen|&amp;quot;Die_drei_OpenGL_Matrizen&amp;quot;]]).&amp;lt;br&amp;gt;&lt;br /&gt;
Der Parameter ''m'' zeigt auf eine 4x4-Matrix, welche zeilenweise Fließkommazahlen mit einfacher oder doppelter Genauigkeit (Single oder Double) enthält.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Matrix muß also in der folgenden Reihenfolge gespeichert sein:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 +-              -+&lt;br /&gt;
 |  0   1   2   3 |&lt;br /&gt;
 |  4   5   6   7 |&lt;br /&gt;
 |  8   9  10  11 |&lt;br /&gt;
 | 12  13  14  15 |&lt;br /&gt;
 +-              -+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glLoadTransposeMatrix''' ist erst ab OpenGL Version 1.3 oder höher nutzbar.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glLoadTransposeMatrix''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGet]] mit Token '''GL_MATRIX_MODE'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_COLOR_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TRANSPOSE_COLOR_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_MODELVIEW_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TRANSPOSE_MODELVIEW_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_PROJECTION_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TRANSPOSE_PROJECTION_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TEXTURE_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TRANSPOSE_TEXTURE_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glLoadIdentity]], [[glLoadMatrix]], [[glMatrixMode]], [[glMultMatrix]], [[glMultTransposeMatrix]], [[glPopMatrix]], [[glPushMatrix]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|LoadTransposeMatrix]]&lt;br /&gt;
[[Kategorie:GL1.3]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glScale&amp;diff=24061</id>
		<title>glScale</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glScale&amp;diff=24061"/>
				<updated>2009-08-06T03:03:58Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glScale =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glScale''' - bewirkt eine Verzerrung oder Spiegelung des Koordinatensystems.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 '''procedure''' glScaled(''x'', ''y'', ''z'': TGLdouble);&amp;lt;br&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 '''procedure''' glScalef(''x'', ''y'', ''z'': TGLfloat);&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;''x, y, z''&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Die einzelnen Parameter bestimmen die Verzerrung für die einzelnen Achsen&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
[[Bild:Tutorial Matrix2 Scale.png|344px|thumb|right|Skalierung des Koordinatensystems durch den Aufruf von '''glScalef(0.8,1,0.6);'''(''Auf Bild klicken zum vergrößern'')&amp;lt;br&amp;gt;Weitere Erklärungen im [[Tutorial Matrix2]].]]&lt;br /&gt;
&lt;br /&gt;
Die Funktion '''glScale''' bewirkt eine Verzerrung oder Spiegelung des Koordinatensystems. &lt;br /&gt;
&lt;br /&gt;
Hierfür wird eine Skalierungsmatrix mit der [[glMatrixMode|aktuellen]] [[Matrix]] multipliziert.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Skalierungsmatrix sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt; [[Bild:GlScale.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei x, y, z den übergebenen Parametern entspricht.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''Es sollte um jeden Preis vermieden werden, eine Achse auf 0 zu skalieren''' (''x,y'' und ''z'' immer &amp;lt;&amp;gt; 0.0)! Dies führt dazu, dass die aktuelle Matrix [http://www.math.unizh.ch/fachverein/forum/detail.jsp?FORUM=120 singulär] wird und Funktionen wie [[gluProject]] sowie [[gluUnProject]] nicht mehr korrekt funktionieren.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
GL_INVALID_OPERATION wird generiert wenn glScale zwischen einem [[glBegin]] und dem zugehörigen [[glBegin|glEnd]] aufgerufen wird.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGet]] mit Token '''GL_MATRIX_MODE'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_MODELVIEW_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_PROJECTION_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Token '''GL_TEXTURE_MATRIX'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[bild:Glscale_normal.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Ein ganz normaler Würfel der keinerlei Skalierung erfahren hat.&amp;lt;br&amp;gt;Entspricht:'''glScale(1,1,1);'''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;[[bild:Glscale_scaledx.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;Der gleiche Würfel, der diesmal entlang der X-Achse gestreckt wurde.&amp;lt;br&amp;gt;Entspricht:'''glScale(3,1,1);'''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;[[bild:Glscale_invert.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;Der vorige Würfel, der nun auch entlang der Y-Achse invertiert wurde. &amp;lt;br&amp;gt;Entspricht:'''glScale(3,-1,1);'''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele bei [[Tutorial_Matrix2#Auswirkungen_von_Matrixmanipulationen_-_oder_.22Wie_positioniere_ich_meine_Objekte_richtig.3F.22|Tutorial Matrix2]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glLoadMatrix]], [[glMatrixMode]], [[glMultMatrix]], [[glPushMatrix]], [[glRotate]], [[glTranslate]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|Scale]]&lt;br /&gt;
 [[Kategorie:GL1.0]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:GlScale.png&amp;diff=24060</id>
		<title>Datei:GlScale.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:GlScale.png&amp;diff=24060"/>
				<updated>2009-08-06T03:02:10Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=gluPerspective&amp;diff=24057</id>
		<title>gluPerspective</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=gluPerspective&amp;diff=24057"/>
				<updated>2009-08-06T02:42:53Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: /* Beschreibung */ Matrix durch Latexbild ersetzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= gluPerspective =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''gluPerspective''' - Erstellt eine perspektivische Projektionsmatrix.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
&lt;br /&gt;
 procedure '''gluPerspective'''(''fovy'', ''aspect'', ''zNear'', ''zFar'' : ''glDouble'');&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''fovy''&lt;br /&gt;
| Gibt das Betrachtungsfeld (FOV) in Grad, entlang der Y-Achse, an.&lt;br /&gt;
|-&lt;br /&gt;
! ''aspect''&lt;br /&gt;
| Gibt den Aspektratio, der das Betrachtungsfeld entlang der X-Achse setzt. Der Aspektratio ist das Verhältnis von Höhe zu Breite.&lt;br /&gt;
|-&lt;br /&gt;
! ''zNear''&lt;br /&gt;
| Entfernung vom Betrachter zur nahen Z-Schnittfläche (muss positiv sein).&lt;br /&gt;
|-&lt;br /&gt;
! ''zFar''&lt;br /&gt;
| Entfernung vom Betrachter zur fernen Z-Schnittfläche (muss positiv sein).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''gluPerspective''' beschreibt ein Betrachtungssichtfeld (Frustum) ins Weltkoordinatensystem hinein. Meistens setzt man den Aspektratio dabei gleich dem Aspektratio des zugewiesenen Viewports. &lt;br /&gt;
Die von '''gluPerspective''' erstellte Matrix wird mit der aktuellen Matrix multipliziert, so als ob man [[glMultMatrix]] mit der generierten Matrix aufgerufen hätte. Um die perspektivische Matrix zu setzen, sollte man zuerst [[glLoadIdentity]] und dann '''gluPerspective''' aufrufen.&lt;br /&gt;
&lt;br /&gt;
Für ''f'' = cotangent(fovy/2), sieht die erstellte Matrix so aus :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt; [[Bild:GluPerspective.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anwendung===&lt;br /&gt;
'''gluPerspective''' wird nur gebraucht wenn eine perspektivische Projektion benutzt werden soll. (siehe auch [[glOrtho]])&lt;br /&gt;
*Wo gehört '''gluPerspective''' hin?:&lt;br /&gt;
: In die Initialisierung des Forumulars um überhaupt eine Projektion zu erhalten.&lt;br /&gt;
: In die Behandlung des OnResize-Events, da die Projektion an die neuen Fenstermaße angepasst werden sollte.&lt;br /&gt;
: In den Render-Code wenn sich innerhalb des Renderdurchgangs die Projektion ändert.&lt;br /&gt;
&lt;br /&gt;
*Wo gehört '''gluPerspective''' nicht hin?:&lt;br /&gt;
: In den Render-Code wenn sich die Projektion während des Rendervorgangs nicht ändert.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Die Genauigkeit des Tiefenpuffer wird von den in ''zNear'' und ''zFar'' angegebenen Werten beeinflusst. Je größer das Verhältnis von  ''zFar'' zu ''zNear'', je ineffektiver kann der Tiefenpuffer zwischen nah beieinander liegenden Oberflächen unterscheiden.&lt;br /&gt;
Wenn ''r'' = ''zFar'' / ''zNear'', dann gehen ungefähr log(2)r Bits and Tiefenpuffergenauigkeit verloren. Da ''r'' gegen Unendlich strebt wenn ''zNear'' gegen 0 strebt, darf ''zNear'' niemals gleich 0 gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glFrustum]], [[glLoadIdentity]], [[glMultMatrix]], [[gluOrtho2D]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GLU|Perspective]]&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:GluPerspective.png&amp;diff=24056</id>
		<title>Datei:GluPerspective.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:GluPerspective.png&amp;diff=24056"/>
				<updated>2009-08-06T02:40:05Z</updated>
		
		<summary type="html">&lt;p&gt;Global667: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Global667</name></author>	</entry>

	</feed>