<?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=Tilman</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=Tilman"/>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php/Spezial:Beitr%C3%A4ge/Tilman"/>
		<updated>2026-04-21T18:59:35Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glDeleteTextures&amp;diff=24966</id>
		<title>glDeleteTextures</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glDeleteTextures&amp;diff=24966"/>
				<updated>2010-09-23T00:53:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tilman: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glDeleteTextures =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glDeleteTextures''' - gibt die angegeben Texturen frei.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glDeleteTextures'''(''n'': TGLsizei; const ''textures'': PGLuint);&lt;br /&gt;
&lt;br /&gt;
&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;
! ''n'' &lt;br /&gt;
| Bestimmt die Anzahl freizugebender Texturen.&lt;br /&gt;
|-&lt;br /&gt;
! ''textures'' &lt;br /&gt;
| Ist ein Zeiger auf ein Feld mit Texturen (die [[OpenGL Name]]n), die freigegeben werden sollen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
'''glDeleteTextures''' gibt die ''n'' Texturen frei,die über die Elemente des Feldes ''textures'' benannt wurden. Nachdem eine Textur freigegeben wurde, hat diese keinen Inhalt oder Dimension mehr. Außerdem ist ihr Name wieder frei für eine erneute Benutzung (z.B. mittels [[glGenTextures]]).&lt;br /&gt;
&lt;br /&gt;
Wenn die aktuell gebundene Textur gelöscht wird, wird 0 (die Standardtextur) anstelle dessen gebunden.&lt;br /&gt;
&lt;br /&gt;
'''glDeleteTextures''' ignoriert (keine Fehlermeldung) den Texturnamen 0 und alle Namen die nicht zu einer existierenden Textur gehören.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glDeleteTextures''' ist erst ab OpenGL Version 1.1 oder höher verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_VALUE''' wird generiert, wenn ''n'' negativ ist.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glDeleteTextures''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glIsTexture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glAreTexturesResident]], [[glBindTexture]], [[glCopyTexImage1D]], [[glCopyTexImage2D]], [[glGenTextures]], [[glGet]], [[glGetTexParameter]], [[glPrioritizeTextures]], [[glTexImage1D]], [[glTexImage2D]], [[glTexImage3D]], [[glTexParameter]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|DeleteTextures]]&lt;br /&gt;
[[Kategorie:GL1.1|DeleteTextures]]&lt;/div&gt;</summary>
		<author><name>Tilman</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=GetObject&amp;diff=24933</id>
		<title>GetObject</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=GetObject&amp;diff=24933"/>
				<updated>2010-09-05T14:27:50Z</updated>
		
		<summary type="html">&lt;p&gt;Tilman: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= getObject =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''getObject''' - liefert die Pixeldaten für ein TBitmap-Objekt, welche dann z.B. für [[glTexImage2D]] weiterverwendet werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 function '''getObject'''(''hgdiobj'': Cardinal; ''cbBuffer'': Integer; ''lpvObject'': Pointer): Integer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Parameter==&lt;br /&gt;
&amp;lt;table border=1 rules=all&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;''hgdiobj''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Hier muss ein Handle zu einem Bitmap übergeben werden.&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;''cbBuffer''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Größe des Puffers für die Rückgabe.&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;''lpvObject''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Zeiger auf ein windows.BITMAP-Objekt&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''getObject''' liefert zu einem Bitmap-Handle die Windows-Bitmap-Struktur, aus der einfach die Adresse der Pixeldaten gelesen werden kann, um sie z.B. für [[glTexImage2D]] weiter zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Anwendungsbeispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  bm: tBitmap;  // Delphi-Bitmap&lt;br /&gt;
  buffer: windows.BITMAP; &lt;br /&gt;
begin&lt;br /&gt;
  bm := tBitmap.Create;&lt;br /&gt;
  // Weitere Operationen, wie bm.loadFromFile o.ä.&lt;br /&gt;
  getObject(bm.Handle,sizeof(buffer),@buffer);&lt;br /&gt;
  // buffer.bmBits enthält nun die Adresse der Pixeldaten, die von glTexImage2D genutzt werden kann.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alternativen ==&lt;br /&gt;
getObject ist eine Windows-API-Funktion und funktioniert generell mit allen Bitmaps für die ein Bitmap-Handle bekannt ist; für TBitmap im speziellen kann alternativ auch die Property Scanline mit dem Index height-1 aufgerufen werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  bm: tBitmap;  // Delphi-Bitmap&lt;br /&gt;
begin&lt;br /&gt;
  bm := tBitmap.Create;&lt;br /&gt;
  // Weitere Operationen, wie bm.loadFromFile o.ä.&lt;br /&gt;
  // bm.ScanLine[bm.height-1] enthält nun die Adresse der Pixeldaten, die von glTexImage2D genutzt werden kann.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tilman</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glTexImage2D&amp;diff=24932</id>
		<title>glTexImage2D</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glTexImage2D&amp;diff=24932"/>
				<updated>2010-09-05T12:36:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tilman: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glTexImage2D =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glTexImage2D''' - Spezifiziert ein zweidimensionales Texturbild.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
 procedure '''glTexImage2D'''(''target'': TGLenum; ''level'': TGLint; ''internalformat'': TGLint; ''width'': TGLsizei; &lt;br /&gt;
                        ''height'': TGLsizei; ''border'': TGLint; ''format'': TGLenum; ''_type'': TGLenum; &lt;br /&gt;
                        '''const''' ''pixels'': PGLvoid); &lt;br /&gt;
 &lt;br /&gt;
== Parameter ==&lt;br /&gt;
&amp;lt;table border=1 rules=all&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;''target''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Gibt das Ziel der Textur an.&lt;br /&gt;
 &lt;br /&gt;
'''GL_TEXTURE_2D, GL_PROXY_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z''' oder '''GL_PROXY_TEXTURE_CUBE_MAP'''&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;''level''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Gibt den Detailgrad für das gewünschte Bild an. &amp;lt;br&amp;gt;&lt;br /&gt;
''level'' '''0''' ist das Basisbild. Level n ist die n-te Mipmap-Reduzierung des Bildes.&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;''internalformat''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;'''1''' für '''R''' &amp;lt;br&amp;gt; '''2''' für '''R''' und '''A''' &amp;lt;br&amp;gt; '''3''' für '''RGB''' &amp;lt;br&amp;gt; '''4''' für '''RGBA''' &amp;lt;br&amp;gt;&lt;br /&gt;
oder eine der folgenden symbolischen Konstanten :&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_ALPHA,     GL_ALPHA4, GL_ALPHA8, GL_ALPHA12, GL_ALPHA16, GL_COMPRESSED_ALPHA, GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_INTENSITY, GL_COMPRESSED_RGB, GL_COMPRESSED_RGBA, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, GL_LUMINANCE12, GL_LUMINANCE16, GL_LUMINANCE_ALPHA, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12, GL_LUMINANCE16_ALPHA16, GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8, GL_INTENSITY12, GL_INTENSITY16, GL_R3_G3_B2, GL_RGB, GL_RGB4, GL_RGB5, GL_RGB8, GL_RGB10, GL_RGB12, GL_RGB16, GL_RGBA, GL_RGBA2, GL_RGBA4, GL_RGB5_A1, GL_RGBA8, GL_RGB10_A2, GL_RGBA12, GL_RGBA16, GL_SLUMINANCE, GL_SLUMINANCE8, GL_SLUMINANCE_ALPHA, GL_SLUMINANCE8_ALPHA8, GL_SRGB, GL_SRGB8, GL_SRGB_ALPHA''' oder '''GL_SRGB8_ALPHA8'''.&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;''width''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Breite = Anzahl der Pixel pro Zeile &amp;lt;br&amp;gt; muss als Wert ''2^n + 2 * border'' für n Integerwerte haben.&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;''height''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Höhe = Anzahl der Zeilen &amp;lt;br&amp;gt; muss als Wert ''2^n + 2 * border'' für n Integerwerte haben&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;''border''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Breite des Rahmens || '''0''' oder '''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;''format''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Bestimmt das Format der Pixeldaten.&amp;lt;br&amp;gt;&lt;br /&gt;
Folgende symbolische Werte werden akzeptiert: &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_COLOR_INDEX, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA, GL_LUMINANCE,''' und '''GL_LUMINANCE_ALPHA'''&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;''_type''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Bestimmt den Pixeltyp für den Inhalt von ''pixels''.&amp;lt;br&amp;gt;&lt;br /&gt;
Folgende Typen werden unterstützt:&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT, GL_UNSIGNED_BYTE_3_3_2, GL_UNSIGNED_BYTE_2_3_3_REV, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_5_6_5_REV, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_4_4_4_4_REV, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_1_5_5_5_REV, GL_UNSIGNED_INT_8_8_8_8, GL_UNSIGNED_INT_8_8_8_8_REV, GL_UNSIGNED_INT_10_10_10_2''' und '''GL_UNSIGNED_INT_2_10_10_10_REV.'''&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;''pixels''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Die Texture-Image Daten vom Typ, der in ''format'' angegeben wurde (Array, in dem die Pixel gespeichert sind) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
Texturierung bildet einen bestimmten Teil eines Texturbildes auf alle [[Primitive|Grafikprimitiven]] ab für die Texturierung aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
Zur Aktivierung einer zweidimensionalen Textur ruft man [[glEnable]] mit dem Parameter '''GL_TEXTURE_2D''' auf. Die Deaktivierung erfolgt entsprechend mittels [[glDisable]].&lt;br /&gt;
Um Texturierung für [[Cubemap]]-Texturen zu aktivieren oder zu deaktivieren, ruft man [[glEnable]] oder [[glDisable]] mit Argument '''GL_TEXTURE_CUBE_MAP''' auf.&lt;br /&gt;
&lt;br /&gt;
Das Texturbild wird durch die Funktion '''glTexImage2D''' definiert. Die Argumente der Funktion beschreiben die Eigenschaften des Texturbildes wie z.B. Breite, Höhe, Tiefe (je nach Dimension), Breite des Randes, [[LOD]]-Nummer (siehe [[glTexParameter]]) und Anzahl der unterstützen Farbkomponenten. Die letzten 3 Argumente beschreiben wie das Bild im Speicher abgelegt wird. Die 3 Argumente sind identisch mit denen, die das Pixelformat bei [[glDrawPixels]] steuern.&lt;br /&gt;
&lt;br /&gt;
Falls ''target'' '''GL_PROXY_TEXTURE_2D''' oder '''GL_PROXY_TEXTURE_CUBE_MAP''' ist, werden keine Daten von ''data'' gelesen, sondern der Zustand des Texturbildes neu berechnet, auf Konsistenz überprüft und gegen die Fähigkeiten der Implementation geprüft. Falls die Implementation mit einer Textur der angeforderten Grösse nicht klarkommt, setzt sie jeden Bildzustand auf 0, generiert jedoch keinen Fehler ( siehe [[glGetError]] ). Um ein vollständiges Mipmap-Array abzufragen, sollte man ''level'' grösser oder gleich 1 wählen.&lt;br /&gt;
&lt;br /&gt;
Falls ''target'' '''GL_TEXTURE_2D''' oder eins der '''GL_TEXTURE_CUBE_MAP'''-targets ist, werden die Daten aus ''pixels'' als Sequenz von vorzeichenlosen oder -behafteten Byte-, Shortint- oder Longint-Werten oder als Fließkommazahlen einfacher Genauigkeit gelesen. Der Typ wird über ''type'' festgelegt. &amp;lt;br&amp;gt;&lt;br /&gt;
Die ausgelesen Werte werden abhängig von ''format'' gruppiert zu Gruppen mit je einem, zwei, drei oder vier Werten. Diese Gruppen entsprechen einem Element. &lt;br /&gt;
&lt;br /&gt;
Wenn ''type'' gleich '''GL_BITMAP''' ist, werden die Daten als Folge (orig.: &amp;quot;String&amp;quot;) von vorzeichenlosen Bytewerten angesehen (wobei ''format'' '''GL_COLOR_INDEX''' sein muss). Jedes Byte des Datenblocks wird als Gruppe von 8 1-Bit Elementen interpretiert. Die Reihenfolge der Bits wird durch '''GL_UNPACK_LSB_FIRST''' (siehe [[glPixelStore]]) festgelegt.&lt;br /&gt;
&lt;br /&gt;
Falls ein nichtnull benamtes [[VBO | Pufferobjekt]] an das '''GL_PIXEL_UNPACK_BUFFER '''-target gebunden ist ( siehe [[glBindBuffer]] ) während ein Texturbild definiert wird, wird ''data'' als Byte-Offset im Datenspeicher des Pufferobjektes behandelt.&lt;br /&gt;
                    &lt;br /&gt;
Das erste Element entspricht der unteren linken Ecke des Texturbildes. Nachfolgende Elemente laufen von links nach rechts durch die verbleibenden Texel in der untersten Zeile und dann in nachfolgenden höheren Zeilen. Das letzte Element entspricht der oberen rechten Ecke.&lt;br /&gt;
&lt;br /&gt;
Der ''format'' Parameter bestimmt die Zusammenstellung der Elemente aus ''pixels''. Folgende 13 möglichen Werte kann ''format'' haben:&lt;br /&gt;
&lt;br /&gt;
'''GL_COLOR_INDEX'''&lt;br /&gt;
:Jedes Element entspricht einem einzelnen Wert, dem Farbindex. Jeder Index wird in eine Festkommazahl (mit einer unbestimmten Anzahl 0 Bits rechts vom Komma) konvertiert, abhängig von Wert und Vorzeichen von '''GL_INDEX_SHIFT''' bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert ( siehe [[glPixelTransfer]] ). Dann werden die Indizes durch ihre entsprechenden Werte aus den Tabellen '''GL_PIXEL_MAP_I_TO_R''', '''GL_PIXEL_MAP_I_TO_G''', '''GL_PIXEL_MAP_I_TO_B''' und '''GL_PIXEL_MAP_I_TO_A''' ersetzt und auf das Intervall [0, 1] heruntergerechnet.&lt;br /&gt;
&lt;br /&gt;
'''GL_RED'''&lt;br /&gt;
:Jedes Element entspricht einer roten Farbkomponente. Der Wert wird in eine Fließkommazahl konvertiert und zu einem RGBA Wert ergänzt, indem man 0.0 für die beiden anderen Farben und 1.0 für den Alphakanal hinzufügt. Jede Komponente wird mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll. (siehe [[glPixelTransfer]])&lt;br /&gt;
&lt;br /&gt;
'''GL_GREEN'''&lt;br /&gt;
:Jedes Element entspricht einer grünen Farbkomponente. Der Wert wird in eine Fließkommazahl konvertiert und zu einem RGBA Wert ergänzt, indem man 0.0 für die beiden anderen Farben und 1.0 für den Alphakanal hinzufügt. Jede Komponente wird mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll. (siehe [[glPixelTransfer]])&lt;br /&gt;
&lt;br /&gt;
'''GL_BLUE'''&lt;br /&gt;
:Jedes Element entspricht einer blauen Farbkomponente. Der Wert wird in eine Fließkommazahl konvertiert und zu einem RGBA Wert ergänzt, indem man 0.0 für die beiden anderen Farben und 1.0 für den Alphakanal hinzufügt. Jede Komponente wird mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll. (siehe [[glPixelTransfer]])&lt;br /&gt;
&lt;br /&gt;
'''GL_ALPHA'''&lt;br /&gt;
:Jedes Element entspricht einer Alpha-Farbkomponente. Der Wert wird in eine Fließkommazahl konvertiert und zu einem RGBA Wert ergänzt, indem man 0.0 für die drei anderen Farben hinzufügt. Jede Komponente wird mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll. (siehe [[glPixelTransfer]])&lt;br /&gt;
&lt;br /&gt;
'''GL_INTENSITY'''&lt;br /&gt;
:Jedes Element entspricht einem einzelnem Intesivitäts-Wert. OpenGL wandelt dieses in eine Fließkommazahl um und setzt es zu einem RGBA-Element zusammen, indem der Intensitätswert drei Mal für Rot, Grün, Blau und Alpha kopiert wird. Jede Komponente wird dann mit dem vorzeichenbehafteten Skalierungsfaktor '''GL_'''''c'''''_SCALE''' multipliziert, zu dem vorzeichenbehafteten Bias '''GL_'''''c'''''_BIAS''' addiert und auf den Bereich [0,1] begrenzt ( siehe [[glPixelTransfer]] ).&lt;br /&gt;
&lt;br /&gt;
'''GL_RGB'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_BGR'''&lt;br /&gt;
:Jedes Element entspricht den drei RGB-Farbwerten. Die Werte werden in Fließkommazahlen konvertiert und zu einem RGBA Wert ergänzt, indem man 1.0 für den Alphakanal hinzufügt. Jede Komponente wird mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll. (siehe [[glPixelTransfer]])&lt;br /&gt;
&lt;br /&gt;
'''GL_RGBA'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_BGRA'''&lt;br /&gt;
:Jedes Element enthält alle vier Farbkomponenten. Jede Komponente wird mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll. (siehe [[glPixelTransfer]])&lt;br /&gt;
&lt;br /&gt;
'''GL_LUMINANCE'''&lt;br /&gt;
:Jedes Element entspricht einem Helligkeitswert. Der Wert wird in Fließkommazahlen konvertiert und zu einem RGBA Wert ergänzt, indem man den Helligkeitswert drei mal für R, G und B einsetzt und 1.0 für den Alphakanal hinzufügt. Jede Komponente wird mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll. (siehe [[glPixelTransfer]])&lt;br /&gt;
&lt;br /&gt;
'''GL_LUMINANCE_ALPHA'''&lt;br /&gt;
:Jedes Element entspricht einem Paar aus Helligkeitswert und Alphawert. Beide Werte werden in Fließkommazahlen konvertiert und zu einem RGBA Wert ergänzt, indem man den Helligkeitswert drei mal für R, G und B einsetzt und den Alphawert hinzufügt. Jede Komponente wird mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll. (siehe [[glPixelTransfer]])&lt;br /&gt;
&lt;br /&gt;
'''GL_DEPTH_COMPONENT'''&lt;br /&gt;
:Jedes Element ist ein einzelner Tiefenwert. OpenGL wandelt diesen in eine Fließkommazahl um, multipliziert diese mit dem vorzeichenbehafteten Skalierungsfaktor '''GL_DEPTH_SCALE''', addiert den vorzeichenbehafteten Bias '''GL_DEPTH_BIAS''' und begrenzt auf den Bereich [0,1] ( siehe [[glPixelTransfer]] ).&lt;br /&gt;
&lt;br /&gt;
Lesen Sie den Artikel [[glDrawPixels]] um eine Beschreibung der zulässigen Werte für ''type'' zu erhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Anwendung die Textur in einer bestimmten Auflösung oder in einem bestimmten Format speichern möchte, kann sie die Auflösung und das Format mit ''internalFormat'' abfragen. OpenGL wird eine interne Repräsentation wählen die das gewünschte ''internalFormat'' approximiert, aber das Format muß nicht exakt übereinstimmen. ( Die Repräsentationen spezifiziert durch '''GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB''' und '''GL_RGBA''' müssen exakt übereinstimmen ). Die numerischen Werte 1, 2, 3 und 4 dürfen ebenfalls benutzt werden um die obrigen Repräsentationen zu spezifizieren.&lt;br /&gt;
&lt;br /&gt;
Wenn der Parameter ''internalFormat'' eins der generischen gepackten Formate '''GL_COMPRESSED_ALPHA, GL_COMPRESSED_INTENSITY, GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_RGB''' oder '''GL_COMPRESSED_RGBA''' ist, wird OpenGL das interne Format mit der symbolischen Konstante für ein spezifisches internes Format ersetzen und die Textur vor der Speicherung komprimieren. Falls kein entsprechendes internes Format zu Verfügung steht oder OpenGL das Bild aus irgendeinem Grund nicht komprimieren kann, wird das interne Format stattdessen durch das entsprechende interne Basisformat ersetzt.&lt;br /&gt;
&lt;br /&gt;
Falls der Parameter ''internalFormat'' '''GL_SRGB, GL_SRGB8, GL_SRGB_ALPHA, GL_SRGB8_ALPHA8, GL_SLUMINANCE, GL_SLUMINANCE8, GL_SLUMINANCE_ALPHA''' oder '''GL_SLUMINANCE8_ALPHA8''' ist, wird die Textur behandelt als wären die roten, grünen, blauen oder Luminance-Komponenten im [[sRGB-Farbraum]] kodiert. Jegliche Alpha-Komponente bleibt unverändert. Die Umwandlung von der sRGB kodierten Komponente ''cs'' in eine lineare Komponente ''cl'' ist :&lt;br /&gt;
&lt;br /&gt;
[[Bild:Formel_sRGB.png]]&lt;br /&gt;
&lt;br /&gt;
Vorausgesetzt ''cs'' ist die sRGB-Komponente im Bereich [0,1].&lt;br /&gt;
       &lt;br /&gt;
Man kann als ''target'' '''GL_PROXY_TEXTURE_2D''' oder '''GL_PROXY_TEXTURE_CUBE_MAP''' nutzen um zu überprüfen, ob eine bestimmte Resolution und ein bestimmtes Format akzeptiert werden. Die Implementation wird ihre beste Anpassung für die geforderte Speicherauflösung und das Format aktualisieren und neu berechnen. Um dann den neu berechneten Zustand abzufragen ruft man [[glGetTexLevelParameter]]. Falls die Textur nicht gespeichert werden kann wird der Texturzustand auf 0 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ein Einkomponenten-Texturbild benutzt nur die aus ''data'' extrahierte rote Komponente der RGBA-Farbe. Ein Zweikomponenten-Bild benutzt die R und A Werte. Ein Dreikomponenten-Bild benutzt die R, G und B Werte. Ein Vierkomponenten-Bild benutzt alle RGBA-Komponenten.&lt;br /&gt;
&lt;br /&gt;
Tiefentexturen können während der Texturfilterung und -anwendung als '''LUMINANCE, INTENSITY''' oder '''ALPHA'''-Texturen behandelt werden. [[Image-based shadowing]] kann aktiviert werden, indem die r-Koordinaten der Textur mit den Werten der Tiefentextur verglichen werden um ein Boolsches Ergebnis zu erhalten. Für mehr Details beim Texturvergleich siehe [[glTexParameter]].&lt;br /&gt;
&lt;br /&gt;
===Verwendungsmöglichkeit===&lt;br /&gt;
Abseits dem einfachen Laden von Texturen wird diese Funktion auch benutzt um Speicherbereiche für die spätere Verwendung zu reservieren. Ruft man glTexImage mit ''pixels'' = '''nil''' auf, wird der Speicherbereich zwar angelegt aber nicht gefüllt. Dies kann zum Beispiel gewünscht sein, wenn man einen Screenshot als Textur verwenden möchte (&amp;quot;Render To Texture&amp;quot;). Man kann dann den [[Framebuffer]] (=Screenshot) mittels [[glCopyTexImage]] in den durch glTexImage reservierten Speicherbereich kopieren. (Siehe dazu auch diesen [http://www.delphigl.com/forum/viewtopic.php?p=59156 Thread im Forum])&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Texturierung hat im Farbindexmodus keinen Effekt.&lt;br /&gt;
&lt;br /&gt;
Falls die [[ARB_imaging]]-Erweiterung unterstützt wird dürfen RGBA-Elemente auch in der [[Image-Pipeline]] verarbeitet werden.&lt;br /&gt;
Die folgenden Stufen dürfen an eine RGBA-Farbe angewendet werden, bevor die Farbkomponenten auf den Bereich [0, 1] eingegrenzt werden :&lt;br /&gt;
&lt;br /&gt;
# Ersetzung der Farbkomponenten durch die Farbtabelle, die durch '''GL_COLOR_TABLE''' definiert wurde, falls aktiviert. Siehe [[glColorTable]].&amp;lt;br&amp;gt;&lt;br /&gt;
# Zweidimensionale [[Convolution | Convolution-Filterung]], falls aktiviert. Siehe [[glConvolutionFilter]].&amp;lt;br&amp;gt;Falls ein Convolution-Filter die Breite der Textur ändert ( z.B. durch Abarbeitung mit einem '''GL_CONVOLUTION_BORDER_MODE''' von '''GL_REDUCE''' ) und OpenGL [[NPOT]]-Texturen nicht unterstützt, muss nach der Filterung die Breite ''2^n + 2*border'' für eine Integerzahl n und die Höhe muss ''2^m + 2*border'' für eine Integer-Zahl m sein.&amp;lt;br&amp;gt;&lt;br /&gt;
# RGBA-Komponenten können mit '''GL_POST_CONVOLUTION_'''''c'''''_SCALE''' multipliziert und mit '''GL_POST_CONVOLUTION_'''''c'''''_BIAS''' addiert werden, falls aktiviert. Siehe [[glPixelTransfer]].&amp;lt;br&amp;gt;                        &lt;br /&gt;
# Ersetzung der Farbkomponenten durch die Farbtabelle, die durch '''GL_POST_CONVOLUTION_COLOR_TABLE''' definiert wurde, falls aktiviert. Siehe [[glColorTable]].&amp;lt;br&amp;gt;&lt;br /&gt;
# Transformation durch die [[Farbmatrix]]. Siehe [[glMatrixMode]].&amp;lt;br&amp;gt;                        &lt;br /&gt;
# RGBA-Komponenten können mit '''GL_POST_COLOR_MATRIX_'''''c'''''_SCALE''' multipliziert und mit '''GL_POST_COLOR_MATRIX_'''''c'''''_BIAS''' addiert werden, falls aktiviert. Siehe [[glPixelTransfer]].&amp;lt;br&amp;gt;                        &lt;br /&gt;
# Ersetzung der Farbkomponenten durch die Farbtabelle, die durch '''GL_POST_COLOR_MATRIX_COLOR_TABLE''' definiert wurde, falls aktiviert. Siehe [[glColorTable]].&amp;lt;br&amp;gt;&lt;br /&gt;
                        &lt;br /&gt;
Das Texturbild kann in den selben Datenformaten vorliegen wie die Pixel bei [[glDrawPixels]] ausgenommen '''GL_STENCIL_INDEX''' und '''GL_DEPTH_COMPONENT'''. [[glPixelStore]] und [[glPixelTransfer]] beeinflussen das Texturbild in exakt der Art und Weise, wie sie auch [[glDrawPixels]] beeinflussen.&lt;br /&gt;
&lt;br /&gt;
Eine Textur die 0 Pixel hoch oder breit ist, stellt die NULL-Textur dar. Wenn die NULL-Textur für die LOD-Stufe 0 spezifiziert wird entspricht das Verhalten dem bei deaktivierter Texturierung.&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
Folgende Erweiterungen hat die Funktion erfahren:&lt;br /&gt;
&lt;br /&gt;
=== Ab OpenGL Version 1.1 ===&lt;br /&gt;
'''glTexImage2D''' und '''GL_PROXY_TEXTURE_2D''' stehen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Andere interne Formate als 1, 2, 3 oder 4 dürfen benutzt werden.&lt;br /&gt;
&lt;br /&gt;
''data'' darf ein Null-Pointer sein. In diesem Fall wird Texturspeicher allokiert um eine Textur der Breite ''width'' und Höhe ''height'' aufzunehmen. Man kann dann Sub-Texturen laden um diesen Texturspeicher zu initialisieren. Das Bild ist undefiniert, falls der Nutzer versucht einen  nichtinitialisierten Teil des Texturbildes auf eine Primitive anzuwenden.     &lt;br /&gt;
    &lt;br /&gt;
=== Ab OpenGL Version 1.2 ===    &lt;br /&gt;
Die Formate '''GL_BGR''' und '''GL_BGRA''' und die Typen '''            GL_UNSIGNED_BYTE_3_3_2, GL_UNSIGNED_BYTE_2_3_3_REV, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_5_6_5_REV, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_4_4_4_4_REV, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_1_5_5_5_REV, GL_UNSIGNED_INT_8_8_8_8, GL_UNSIGNED_INT_8_8_8_8_REV, GL_UNSIGNED_INT_10_10_10_2''' und '''GL_UNSIGNED_INT_2_10_10_10_REV''' stehen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== Ab OpenGL Version 1.3 ===&lt;br /&gt;
'''glTexImage2D''' gibt die zweidimensionale Textur der aktuellen, mit [[glActiveTexture]] definierten Textur-Einheit an ( oder schon vorher, falls die [[ARB_multitexture]]-Erweiterung unterstützt wird ).&lt;br /&gt;
&lt;br /&gt;
'''GL_TEXTURE_CUBE_MAP''' und '''GL_PROXY_TEXTURE_CUBE_MAP''' stehen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== Ab OpenGL Version 1.4 ===&lt;br /&gt;
'''GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24''' und '''GL_DEPTH_COMPONENT32''' stehen zur Verfügung.&lt;br /&gt;
    &lt;br /&gt;
=== Ab OpenGL Version 2.0 ===  &lt;br /&gt;
[[NPOT]]-Texturen werden unterstützt ( oder schon vorher, falls die Implementation die [[GL_ARB_texture_non_power_of_two]]-Erweiterung unterstützt ).&lt;br /&gt;
        &lt;br /&gt;
=== Ab OpenGL Version 2.1 === &lt;br /&gt;
Die internen Formate '''GL_SRGB, GL_SRGB8, GL_SRGB_ALPHA, GL_SRGB8_ALPHA8, GL_SLUMINANCE, GL_SLUMINANCE8, GL_SLUMINANCE_ALPHA''' und '''GL_SLUMINANCE8_ALPHA8''' stehen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_ENUM''' wird generiert wenn ''target'' nicht '''GL_TEXTURE_2D, GL_PROXY_TEXTURE_2D, GL_PROXY_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z''' oder '''GL_TEXTURE_CUBE_MAP_NEGATIVE_Z''' ist. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_ENUM''' wird generiert, falls ''target'' einer der sechs Cubemap ''target''-Parameter für '''glTexImage2D''' ist und ''width'' und ''height'' nicht gleich sind.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_ENUM''' wird generiert wenn ''format'' ungültige Werte übergeben wurden. Akzeptiert werden alle Formatangaben außer '''GL_STENCIL_INDEX''' und '''GL_DEPTH_COMPONENT''' &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_ENUM''' wird generiert wenn ''type'' keine gültige Typkonstante übergeben wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_ENUM''' wird generiert wenn '''GL_BITMAP''' als ''type'' und '''GL_COLOR_INDEX''' nicht(!) als ''format'' angegeben wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_VALUE''' wird generiert wenn ''level'' kleiner 0 oder größer ''ld(max)'' ist, wobei ''max'' der Rückgabewert von '''GL_MAX_TEXTURE_SIZE''' ist. (ld = Logarithmus Dualis = Basis 2). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_VALUE''' wird generiert wenn für ''internalformat'' etwas anderes als ''1'', ''2'', ''3'', ''4'' oder eine der akzeptieren Resolutions- und symbolischen Formatkonstanten angegeben wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_VALUE''' wird generiert wenn ''width'' bzw. ''height'' kleiner als 0 oder größer als 2 + '''GL_MAX_TEXTURE_SIZE''' ist, oder die Bedingung  ''2^k + 2 * border'' (k=Integerwerte) nicht erfüllt. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_VALUE''' wenn ''border'' nicht ''0'' oder ''1'' ist. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, falls ''type'' eine der Konstanten '''GL_UNSIGNED_BYTE_3_3_2, GL_UNSIGNED_BYTE_2_3_3_REV, GL_UNSIGNED_SHORT_5_6_5''' oder '''GL_UNSIGNED_SHORT_5_6_5_REV''' ist und ''format'' nicht '''GL_RGB'''.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, falls ''type'' eine der Konstanten '''GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_4_4_4_4_REV, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_1_5_5_5_REV, GL_UNSIGNED_INT_8_8_8_8, GL_UNSIGNED_INT_8_8_8_8_REV, GL_UNSIGNED_INT_10_10_10_2''' oder '''GL_UNSIGNED_INT_2_10_10_10_REV''' und ''format'' weder '''GL_RGBA''' noch '''GL_BGRA''' ist.&lt;br /&gt;
        &lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, falls ''target'' nicht '''GL_TEXTURE_2D''' oder '''GL_PROXY_TEXTURE_2D''' und ''internalFormat'' '''GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24''' oder '''GL_DEPTH_COMPONENT32''' ist.&lt;br /&gt;
        &lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, falls ''format'' '''GL_DEPTH_COMPONENT'''' und ''internalFormat'' nicht '''GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24''' oder '''GL_DEPTH_COMPONENT32''' ist.&lt;br /&gt;
        &lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, falls ''internalFormat'' '''GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24''' oder '''GL_DEPTH_COMPONENT32''' und ''format'' nicht '''GL_DEPTH_COMPONENT''' ist.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, falls ein Pufferobjekt-Name ungleich null an das '''GL_PIXEL_UNPACK_BUFFER'''-target gebunden ist und der Datenspeicher des Pufferobjektes währenddessen gemappt wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, falls ein Pufferobjekt-Name ungleich null an das '''GL_PIXEL_UNPACK_BUFFER'''-target gebunden ist und die Daten derart vom Pufferobjekt entpackt werden, dass der gelesene Speicher die Grösse des Speichers der Daten überschreitet.&lt;br /&gt;
       &lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, falls ein Pufferobjekt-Name ungleich null an das '''GL_PIXEL_UNPACK_BUFFER'''-target gebunden ist und ''data'' nicht gleichartig auf die Anzahl der Bytes aufgeteilt werden kann, um im Speicher ein Datum abzuspeichern welches durch ''type'' angegeben wurde.&lt;br /&gt;
 &lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert wenn eine '''glTexImage'''-Funktion in einem [[glBegin]]- und [[glEnd]]-Block aufgerufen wird. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGetTexImage]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsEnabled]] mit dem Token '''GL_TEXTURE_2D''' oder '''GL_TEXTURE_CUBE_MAP'''.&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]] mit Argument '''GL_PIXEL_UNPACK_BUFFER_BINDING'''&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glActiveTexture]], [[glColorTable]], [[glConvolutionFilter2D]], [[glCopyPixels]], [[glCopyTexImage1D]], [[glCopyTexImage2D]], [[glCopyTexSubImage1D]], [[glCopyTexSubImage2D]], [[glCopyTexSubImage3D]], [[glDrawPixels]], [[glMatrixMode]], [[glPixelStore]], [[glPixelTransfer]], [[glSeparableFilter2D]], [[glTexEnv]], [[glTexGen]], [[glTexImage1D]], [[glTexImage3D]], [[glTexSubImage1D]], [[glTexSubImage2D]], [[glTexSubImage3D]], [[glTexParameter]] &lt;br /&gt;
&lt;br /&gt;
*[[getObject]] (Pixeldaten eines TBitmap bekommen)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|TexImage2D]]&lt;br /&gt;
 [[Kategorie:GL1.0]]&lt;/div&gt;</summary>
		<author><name>Tilman</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=GetObject&amp;diff=24931</id>
		<title>GetObject</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=GetObject&amp;diff=24931"/>
				<updated>2010-09-05T12:36:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tilman: Die Seite wurde neu angelegt: „= getObject =    == Name == '''getObject''' - liefert die Pixeldaten für ein TBitmap-Objekt, welche dann z.B. für glTexImage2D weiterverwendet werden könne…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= getObject =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''getObject''' - liefert die Pixeldaten für ein TBitmap-Objekt, welche dann z.B. für [[glTexImage2D]] weiterverwendet werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 function '''getObject'''(''hgdiobj'': Cardinal; ''cbBuffer'': Integer; ''lpvObject'': Pointer): Integer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Parameter==&lt;br /&gt;
&amp;lt;table border=1 rules=all&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;''hgdiobj''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Hier muss ein Handle zu einem Bitmap übergeben werden.&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;''cbBuffer''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Größe des Puffers für die Rückgabe.&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;''lpvObject''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Zeiger auf ein windows.BITMAP-Objekt&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''getObject''' liefert zu einem Bitmap-Handle die Windows-Bitmap-Struktur, aus der einfach die Adresse der Pixeldaten gelesen werden kann, um sie z.B. für [[glTexImage2D]] weiter zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Anwendungsbeispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  bm: tBitmap;  // Delphi-Bitmap&lt;br /&gt;
  buffer: windows.BITMAP; &lt;br /&gt;
begin&lt;br /&gt;
  bm := tBitmap.Create;&lt;br /&gt;
  // Weitere Operationen, wie bm.loadFromFile o.ä.&lt;br /&gt;
  getObject(bm.Handle,sizeof(buffer),@buffer);&lt;br /&gt;
  // buffer.bmBits enthält nun die Adresse der Pixeldaten, die von glTexImage2D genutzt werden kann.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tilman</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Benutzer:Tilman&amp;diff=24930</id>
		<title>Benutzer:Tilman</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Benutzer:Tilman&amp;diff=24930"/>
				<updated>2010-09-04T06:45:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tilman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi, ich bin Tilman. Seit ca. einem Jahr bin ich im Forum aktiv. Ich verfolge ein Projekt, das ich demnächst vorzustellen gedenke. In der deutschen Wikipedia bin ich auch mehr oder weniger aktiv: [http://de.wikipedia.org/wiki/Benutzer:E-qual http://de.wikipedia.org/wiki/Benutzer:E-qual]&lt;br /&gt;
&lt;br /&gt;
Ich bin ausserdem Moderator im Forum von [http://www.fernsehkritik.tv Fernsehkritik-TV], wofür ich hier gerne Werbung mache ^^&lt;/div&gt;</summary>
		<author><name>Tilman</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Benutzer:Tilman&amp;diff=24929</id>
		<title>Benutzer:Tilman</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Benutzer:Tilman&amp;diff=24929"/>
				<updated>2010-09-04T06:38:38Z</updated>
		
		<summary type="html">&lt;p&gt;Tilman: Die Seite wurde neu angelegt: „Hi, ich bin Tilman. Seit ca. einem Jahr bin ich im Forum aktiv. Ich verfolge ein Projekt, das ich demnächst vorzustellen gedenke. In der deutschen Wikipedia bin …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi, ich bin Tilman. Seit ca. einem Jahr bin ich im Forum aktiv. Ich verfolge ein Projekt, das ich demnächst vorzustellen gedenke. In der deutschen Wikipedia bin ich auch mehr oder weniger aktiv: [http://de.wikipedia.org/wiki/Benutzer:E-qual http://de.wikipedia.org/wiki/Benutzer:E-qual]&lt;/div&gt;</summary>
		<author><name>Tilman</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Screenshot&amp;diff=24928</id>
		<title>Screenshot</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Screenshot&amp;diff=24928"/>
				<updated>2010-09-04T03:14:51Z</updated>
		
		<summary type="html">&lt;p&gt;Tilman: /* Bilddaten besorgen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemeines zum Screenshot erstellen ==&lt;br /&gt;
=== Einleitung ===&lt;br /&gt;
Ein '''Screenshot''' ist ein Abbild des aktuellen Bildschirm Inhaltes. &lt;br /&gt;
&lt;br /&gt;
Im Falle von OpenGL greifen wir nicht auf das Fenster zurück sondern auf den [[Framebuffer]]. Neben dem eigentlichen Vorgang des Bilddatenbesorgens ist es meistens auch noch sinnvoll die Daten dem Benutzer verfügbar zu machen. Dies geschieht meistens in Form einer Bild-Datei oder eines Eintrages in der Zwischenablage.&lt;br /&gt;
&lt;br /&gt;
=== Bilddaten besorgen ===&lt;br /&gt;
Mit Hilfe des [[glReadPixels]] Befehls kann der [[Framebuffer]] ausgelesen werden. Für einen Screenshot sind meistens die [[RGB]]-Werte interessant. Bei diesen Werten ergibt sich auch schon das erste Problem: OpenGL speichert die Daten in der Reihenfolge Rot Grün Blau, während es in einigen Bildformaten (nämlich denen die auf Bitmaps aufbauen) üblich ist, die Daten in der Reihenfolge Blau Grün Rot zu speichern. Glücklicherweise kann man in aktuellen OpenGL Versionen [[glReadPixels]] anweisen die Daten auch in dieser Reihenfolge zu liefern.&lt;br /&gt;
&lt;br /&gt;
Der [[glReadPixels]] Befehl für neue Grafikkarten könnte in etwa so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  // ungünstige Reihenfolge Rot Grün Blau &lt;br /&gt;
  glReadPixels( 0, 0, Breite, Hoehe, GL_RGB, GL_UNSIGNED_BYTE, Daten );&lt;br /&gt;
  // auf neueren Grafikkarten:&lt;br /&gt;
  glReadPixels( 0, 0, Breite, Hoehe, GL_BGR, GL_UNSIGNED_BYTE, Daten );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was die einzelnen Parameter bedeuten, könnt ihr im [[glReadPixels]] Artikel nachlesen. Es sei hier nur gesagt das das letzte Argument der Speicherplatz ist, an dem OpenGL die Daten abspeichern soll (meist ein Pointer z.B. auf ein Array).&lt;br /&gt;
{{Hinweis|Möchte man, dass die Pixeldaten hintereinanderweg im Speicher erscheinen, so sollte man glPixelStoref(GL_PACK_ALIGNMENT,1) setzen, ansonten werden die Daten je nach Format durch Pixelstore weiter formatiert.}}&lt;br /&gt;
&lt;br /&gt;
=== Hinweis ===&lt;br /&gt;
Unter [[SDL]] finden sich die Bilddaten schon in der [[SDL_Surface|Displaysurface]] unter ''pixels''.&lt;br /&gt;
&lt;br /&gt;
== Speichern des Screenshots ==&lt;br /&gt;
Die Speicherung der Screenshots ist, sofern man erst einmal die Rohdaten der einzelnen Pixel hat, nicht mehr allzu kompliziert. Da der Computer aber ohne zusätzliche Informationen zu diesen Rohdaten später nichts mehr mit ihnen anfangen könnte, muss man einige zusätzliche Informationen mit in seine Zieldatei schreiben, die oftmals als &amp;quot;Header&amp;quot; bezeichnet werden und Informationen zu Breite, Höhe und &amp;quot;Pixelformat&amp;quot; beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== Speichern im BMP Format ===&lt;br /&gt;
&lt;br /&gt;
Eine BMP-Datei hat einen relativ einfachen Aufbau. Als erstes kommen Header-Informationen (das Zeugs, was die Daten als Bitmap ausweist ;-)), dann FileInfo-Informationen (das, was angibt, wie groß das Bitmap ist) und schließlich die eigentlichen Bilddaten.&lt;br /&gt;
&lt;br /&gt;
Der Header sieht so aus:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt; BITMAPFILEHEADER = packed record&lt;br /&gt;
    bfType: Word;&lt;br /&gt;
    bfSize: DWORD;&lt;br /&gt;
    bfReserved1: Word;&lt;br /&gt;
    bfReserved2: Word;&lt;br /&gt;
    bfOffBits: DWORD;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
 BITMAPINFOHEADER = packed record&lt;br /&gt;
    biSize: DWORD;&lt;br /&gt;
    biWidth: Longint;&lt;br /&gt;
    biHeight: Longint;&lt;br /&gt;
    biPlanes: Word;&lt;br /&gt;
    biBitCount: Word;&lt;br /&gt;
    biCompression: DWORD;&lt;br /&gt;
    biSizeImage: DWORD;&lt;br /&gt;
    biXPelsPerMeter: Longint;&lt;br /&gt;
    biYPelsPerMeter: Longint;&lt;br /&gt;
    biClrUsed: DWORD;&lt;br /&gt;
    biClrImportant: DWORD;&lt;br /&gt;
  end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun zur Speicherfunktion für einen Screenshot:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure ScreenShot(const Name : string);&lt;br /&gt;
 var F : file;&lt;br /&gt;
     FileInfo: BITMAPINFOHEADER;&lt;br /&gt;
     FileHeader : BITMAPFILEHEADER;&lt;br /&gt;
     pPicData:Pointer;&lt;br /&gt;
     Viewport : array[0..3] of integer;&lt;br /&gt;
begin&lt;br /&gt;
 //Speicher für die Speicherung der Header-Informationen vorbereiten&lt;br /&gt;
 ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));&lt;br /&gt;
 ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));&lt;br /&gt;
&lt;br /&gt;
 //Größe des Viewports abfragen --&amp;gt; Spätere Bildgrößenangaben&lt;br /&gt;
 glGetIntegerv(GL_VIEWPORT, @Viewport);&lt;br /&gt;
&lt;br /&gt;
 //Initialisieren der Daten des Headers&lt;br /&gt;
 FileHeader.bfType := 19778; //$4D42 = 'BM'&lt;br /&gt;
 FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);&lt;br /&gt;
&lt;br /&gt;
 //Schreiben der Bitmap-Informationen&lt;br /&gt;
 FileInfo.biSize := SizeOf(BITMAPINFOHEADER);&lt;br /&gt;
 FileInfo.biWidth := Viewport[2];&lt;br /&gt;
 FileInfo.biHeight := Viewport[3];&lt;br /&gt;
 FileInfo.biPlanes := 1;&lt;br /&gt;
 FileInfo.biBitCount := 32;&lt;br /&gt;
 FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount div 8);&lt;br /&gt;
&lt;br /&gt;
 //Größenangabe auch in den Header übernehmen&lt;br /&gt;
 FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage;&lt;br /&gt;
&lt;br /&gt;
 //Speicher für die Bilddaten reservieren&lt;br /&gt;
 GetMem(pPicData, FileInfo.biSizeImage);&lt;br /&gt;
 try&lt;br /&gt;
  //Bilddaten von OpenGL anfordern (siehe oben)&lt;br /&gt;
  glReadPixels(0, 0, Viewport[2], Viewport[3], GL_BGRA, GL_UNSIGNED_BYTE, pPicData);&lt;br /&gt;
&lt;br /&gt;
  //Und den ganzen Müll in die Datei schieben ;-)&lt;br /&gt;
  //Moderne Leute nehmen dafür auch Streams ...&lt;br /&gt;
  AssignFile(f, name);&lt;br /&gt;
  Rewrite( f,1 );&lt;br /&gt;
  try&lt;br /&gt;
   BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));&lt;br /&gt;
   BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));&lt;br /&gt;
   BlockWrite(F, pPicData^, FileInfo.biSizeImage );&lt;br /&gt;
  finally&lt;br /&gt;
   CloseFile(f);&lt;br /&gt;
  end;&lt;br /&gt;
 finally&lt;br /&gt;
  //Und den angeforderten Speicher wieder freigeben ...&lt;br /&gt;
  FreeMem(pPicData, FileInfo.biSizeImage);&lt;br /&gt;
 end;&lt;br /&gt;
end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speichern im TGA Format ===&lt;br /&gt;
&lt;br /&gt;
Eine TGA-Datei hat einen ähnlich einfachen Aufbau. Als erstes kommen auch hier Header-Informationen und dannach die eigentlichen Daten.&lt;br /&gt;
&lt;br /&gt;
Der Header sieht diesmal so aus:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;type &lt;br /&gt;
  TTGAHEADER = packed record&lt;br /&gt;
    tfType : Byte;&lt;br /&gt;
    tfColorMapType : Byte;&lt;br /&gt;
    tfImageType : Byte;&lt;br /&gt;
    tfColorMapSpec : Array[0..4] of Byte;&lt;br /&gt;
    tfOrigX : Word; //Array [0..1] of Byte;&lt;br /&gt;
    tfOrigY : Word;&lt;br /&gt;
    tfWidth : Word;&lt;br /&gt;
    tfHeight : Word;&lt;br /&gt;
    tfBpp : Byte;&lt;br /&gt;
    tfImageDes : Byte;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun zur Speicherfunktion für ein Screenshot ohne Alpha Wert&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure ScreenShot(const Name : string);&lt;br /&gt;
var &lt;br /&gt;
  DataBuffer : array of Byte;&lt;br /&gt;
  f : file;&lt;br /&gt;
  tgaHeader : TTGAHEADER;&lt;br /&gt;
  width, height : integer;&lt;br /&gt;
  DataSize:Integer;&lt;br /&gt;
  viewport : Array[0..3] of integer;&lt;br /&gt;
begin&lt;br /&gt;
  //Viewport-Größe lesen&lt;br /&gt;
  glGetIntegerv(GL_VIEWPORT, @viewport);&lt;br /&gt;
  width := viewport[2];&lt;br /&gt;
  height := viewport[3];&lt;br /&gt;
&lt;br /&gt;
  //Größe der Daten berechnen&lt;br /&gt;
  DataSize := Width * Height * 3;&lt;br /&gt;
&lt;br /&gt;
  //Größe des Puffers festlegen (Speicher reservieren)&lt;br /&gt;
  SetLength(DataBuffer,DataSize);&lt;br /&gt;
&lt;br /&gt;
  // TGA Kopf mit Daten füllen&lt;br /&gt;
  ZeroMemory(@tgaHeader, SizeOf(tgaHeader));&lt;br /&gt;
  tgaHeader.tfImageType := 2; // TGA_RGB = 2&lt;br /&gt;
  tgaHeader.tfWidth := Width; &lt;br /&gt;
  tgaHeader.tfHeight := Height;&lt;br /&gt;
  tgaHeader.tfBpp := 24;&lt;br /&gt;
&lt;br /&gt;
  //Daten von OpenGL anfordern&lt;br /&gt;
  glReadPixels(0,0,Width, Height, GL_BGR, GL_UNSIGNED_BYTE, @DataBuffer[0]);&lt;br /&gt;
  &lt;br /&gt;
  //Datei erstellen&lt;br /&gt;
  AssignFile(f, Name);&lt;br /&gt;
  Rewrite( f,1 );&lt;br /&gt;
  try &lt;br /&gt;
    // TGA Kopf in die Datei reinschreiben&lt;br /&gt;
    BlockWrite(F, tgaHeader, SizeOf(tgaHeader));&lt;br /&gt;
&lt;br /&gt;
    // Die eigentlichen Bilddaten in die Datei schreiben&lt;br /&gt;
    BlockWrite(f, DataBuffer[0], DataSize );&lt;br /&gt;
  finally&lt;br /&gt;
    CloseFile(f);&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speichern im TGA-Format bei Nutzung von SDL ===&lt;br /&gt;
&lt;br /&gt;
Das Speichern eines Screenshots im TGA-Format sieht auch bei Nutzung von SDL nicht wesentlich anders aus. Als erstes müssen die Units sdl und sdl_utils eingebunden sein, was aber sicherlich schon der Fall ist. Ansonsten einfach kurz&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;uses&lt;br /&gt;
    sdl, sdl_utils;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und wir hätten auch dies erledigt.&lt;br /&gt;
&lt;br /&gt;
Was sich allerdings etwas unterscheided, ist, dass man gegebenenfalls einige Vorkehrungen treffen muss, um die richtige Reihenfolge der einzelnen Farbkanäle zu gewährleisten, was mit folgender Routine ein leichtes ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure SwapBGR(Surface: PSDL_Surface);&lt;br /&gt;
var&lt;br /&gt;
  x,y: Integer;&lt;br /&gt;
  pixel: UInt32;&lt;br /&gt;
  pred, pgreen, pblue, palpha: PUInt8;&lt;br /&gt;
  red, green, blue, alpha: UInt8;&lt;br /&gt;
begin&lt;br /&gt;
  for y:=0 to (Surface.h-1) do&lt;br /&gt;
    for x:=0 to (Surface.w-1) do&lt;br /&gt;
    begin&lt;br /&gt;
      //reads the pixels them&lt;br /&gt;
      pixel:=SDL_GetPixel(Surface, x, y);&lt;br /&gt;
&lt;br /&gt;
      pred:=@red;&lt;br /&gt;
      pgreen:=@green;&lt;br /&gt;
      pblue:=@blue;&lt;br /&gt;
      palpha:=@alpha;&lt;br /&gt;
&lt;br /&gt;
      //read and swap color&lt;br /&gt;
      SDL_GetRGBA(pixel,Surface.format, pred, pgreen, pblue, palpha);&lt;br /&gt;
      pixel:=SDL_MapRGBA(Surface.format, blue, green, red, alpha);&lt;br /&gt;
&lt;br /&gt;
      SDL_PutPixel(Surface, x, y, pixel);&lt;br /&gt;
    end;&lt;br /&gt;
end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch hier benötigen wir wieder den TGA-Header als Record:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;type&lt;br /&gt;
  TTGAHEADER = packed record&lt;br /&gt;
    tfType  : Byte;&lt;br /&gt;
    tfColorMapType : Byte;&lt;br /&gt;
    tfImageType    : Byte;&lt;br /&gt;
    tfColorMapSpec : Array[0..4] of Byte;&lt;br /&gt;
    tfOrigX    : Word;&lt;br /&gt;
    tfOrigY    : Word;&lt;br /&gt;
    tfWidth    : Word;&lt;br /&gt;
    tfHeight   : Word;&lt;br /&gt;
    tfBpp      : Byte;&lt;br /&gt;
    tfImageDes : Byte;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach diesen kleinen Vorbereitungen folgt eigentlich auch, wie gewohnt, der normale Code zum Speichern, nur eben mit SDL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;//Speichert eine Surface in eine TGA-Datei.&lt;br /&gt;
//Surface wird am Ende freigegeben. Die Videosurface sollte also vorher geblittet werden&lt;br /&gt;
//und diese dann weitergereicht werden.&lt;br /&gt;
function SaveSurfacetoTGA(filename: String; surface: PSDL_Surface): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  TGAHEADER : TTGAHEADER;&lt;br /&gt;
&lt;br /&gt;
  rwop: PSDL_RWops;&lt;br /&gt;
  ImageSize: Integer;&lt;br /&gt;
  i : Integer;&lt;br /&gt;
begin&lt;br /&gt;
  Result:=False;&lt;br /&gt;
&lt;br /&gt;
  //Prüfen, ob's was zu Speichern gibt ...  &lt;br /&gt;
  if not Assigned(surface) then&lt;br /&gt;
  begin&lt;br /&gt;
    writeln('Keine Surface übergeben');&lt;br /&gt;
    exit;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  //Haben wir ein Pixelformat mit mindestens 24 Bit?&lt;br /&gt;
  if surface.format.BytesPerPixel&amp;lt;3 then&lt;br /&gt;
  begin&lt;br /&gt;
    writeln('Farbtiefe nicht unterstützt');&lt;br /&gt;
    exit;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  //Müssen wir die Reihenfolge der Farbkanäle anpassen?&lt;br /&gt;
  if SDL_BYTEORDER&amp;lt;&amp;gt;SDL_BIG_ENDIAN then&lt;br /&gt;
  begin&lt;br /&gt;
    SwapBGR(surface);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  //Na gut, füllen wir den Header aus ...&lt;br /&gt;
  with TGAHEADER do&lt;br /&gt;
  begin&lt;br /&gt;
    tfType:=0;&lt;br /&gt;
    tfColorMapType:=0;&lt;br /&gt;
    tfImageType:=2;&lt;br /&gt;
    for i:=0 to 4 do&lt;br /&gt;
      tfColorMapSpec[i]:=0;&lt;br /&gt;
    tfOrigX:=0;&lt;br /&gt;
    tfOrigY:=0;&lt;br /&gt;
    tfWidth:=surface.w;&lt;br /&gt;
    tfHeight:=surface.h;&lt;br /&gt;
    tfBpp:=surface.format.BitsPerPixel;&lt;br /&gt;
    tfImageDes:=0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  //Ermitteln des benötigten Speicherplatze...&lt;br /&gt;
  ImageSize:=surface.w*surface.h*surface.format.BytesPerPixel;&lt;br /&gt;
&lt;br /&gt;
  //Datei zum Schreiben öffnen.&lt;br /&gt;
  rwop:=SDL_RWfromFile(PChar(filename),'w+b');&lt;br /&gt;
  if rwop=nil then&lt;br /&gt;
  begin&lt;br /&gt;
    Writeln('Fehler beim Erstellen des Rwops');&lt;br /&gt;
    exit;&lt;br /&gt;
  end;&lt;br /&gt;
  try&lt;br /&gt;
    //Versuchen, den Header in die Datei zu schreiben&lt;br /&gt;
    if SDL_RWWrite(rwop,@TGAHEADER,SizeOf(TGAHEADER),1)&amp;lt;&amp;gt;1 then&lt;br /&gt;
    begin&lt;br /&gt;
      writeln('Fehler beim Schreiben des Headers');&lt;br /&gt;
      exit;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
    //Versuchen, die Bilddaten in die Datei zu schreibenSchreiben der Bilddaten&lt;br /&gt;
    if SDL_RWWrite(rwop,surface.pixels,ImageSize,1)&amp;lt;&amp;gt;1 then&lt;br /&gt;
    begin&lt;br /&gt;
      writeln('Fehler beim Schreiben der Daten');&lt;br /&gt;
      exit;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
    //Scheinbar waren wir erfolgreich&lt;br /&gt;
    Result:=True;&lt;br /&gt;
  finally&lt;br /&gt;
    //Datei schließen ...&lt;br /&gt;
    SDL_RWClose(rwop);&lt;br /&gt;
&lt;br /&gt;
    //Und das Surface freigeben&lt;br /&gt;
    SDL_FreeSurface(surface);&lt;br /&gt;
  end;&lt;br /&gt;
end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's it. Have a nice day!&lt;br /&gt;
&lt;br /&gt;
== Siehe Auch ==&lt;br /&gt;
[[Tutorial Renderpass]] (Dieses Tutorial erklärt wie man das gerenderte zu anderen Zwecken verwenden kann.)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Anleitung]] [[Kategorie:Technik_oder_Algorithmus]]&lt;/div&gt;</summary>
		<author><name>Tilman</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glReadPixels&amp;diff=24927</id>
		<title>glReadPixels</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glReadPixels&amp;diff=24927"/>
				<updated>2010-09-04T03:13:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tilman: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glReadPixels =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glReadPixels''' - ließt einen Block von Pixel aus dem [[Framebuffer]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glReadPixels'''(''x'': TGLint; ''y'': TGLint; &lt;br /&gt;
                              ''width'': TGLsizei; ''height'': TGLsizei; &lt;br /&gt;
                              ''format'': TGLenum; ''_type'': TGLenum; &lt;br /&gt;
                              ''pixels'': PGLvoid);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&amp;lt;table border=1 rules=all&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;''x, y''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Beschreibt die Fensterkoordinaten des ersten Pixels, dass aus dem [[Framebuffer]] gelesen wird. Diese Position ist die untere, linke Ecke eines Rechtecks von Pixeln.&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;''width, height''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Beschreibt die Dimensionen des Pixelrechtecks. Die Angaben werden dabei in Pixel gemacht.&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;''format''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Bestimmt das Format der Pixeldaten. Folgende symbolische Werte werden akzeptiert: &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE,''' und '''GL_LUMINANCE_ALPHA'''&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;''type''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Beschreibt den Datentyp der Pixeldaten. Muss einer der Folgenden sein:&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT,''' oder '''GL_FLOAT'''&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;''pixels''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Liefert die Pixeldaten zurück.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glReadPixels''' kopiert Pixeldaten aus dem [[Framebuffer]] in den Klientspeicher der für ''pixels'' reserviert wurde. Der Kopiervorgang beginnt dabei mit dem Pixel, dessen linke untere Ecke am Punkt(''x, y'') liegt.&lt;br /&gt;
Verschiedene Parameter kontrollieren die Verarbeitung der Pixeldaten bevor diese in den Klientspeicher geschrieben werden. Diese Parameter werden mit drei Befehlen gesetzt:&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelStore]], [[glPixelTransfer]] und [[glPixelMap]].&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser Artikel beschreibt die Effekte welche die meisten, aber nicht alle Parameter der genannten Artikel auf '''glReadPixels''' haben.&lt;br /&gt;
{{Hinweis|Möchte man, dass die Pixeldaten hintereinanderweg im Speicher erscheinen, so sollte man glPixelStoref(GL_PACK_ALIGNMENT,1) setzen, ansonten werden die Daten je nach Format durch Pixelstore weiter formatiert.}}&lt;br /&gt;
'''glReadPixels''' liefert die Werte der Pixel die im Rechteck [''x''+i, ''y''+j] liegen. (mit 0&amp;lt;=i&amp;lt;''width'' bzw. 0&amp;lt;=j&amp;lt;height)&amp;lt;br&amp;gt;&lt;br /&gt;
Dabei bezeichnet [i,j] das i-te Pixel in der j-ten Zeile. Die Pixel werden zeilenweise beginnend mit der niedrigsten Zeile und von links nach rechts (innerhalb der Zeile) zurück geliefert.&lt;br /&gt;
&lt;br /&gt;
Der Parameter ''format'' bestimmt das Format der zurück gelieferten Pixelwerte. Akzeptiert werden:&lt;br /&gt;
&lt;br /&gt;
=== Format Parameter ===&lt;br /&gt;
'''GL_COLOR_INDEX'''&lt;br /&gt;
: Farbindizes werden aus dem  von glReadBuffer ausgewählten [[Farbpuffer]] gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von GL_INDEX_SHIFT bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Ist '''GL_MAP_COLOR''' auf '''GL_TRUE''' gesetzt, werden Indizes durch ihre entsprechenden Werte aus der '''GL_PIXEL_MAP_I_TO_I''' Tabelle ersetzt. &lt;br /&gt;
&lt;br /&gt;
'''GL_STENCIL_INDEX'''&lt;br /&gt;
: Stencilwerte werden aus dem Stencilbuffer gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von '''GL_INDEX_SHIFT''' bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Ist '''GL_MAP_STENCIL''' auf '''GL_TRUE''' gesetzt, werden Indizes durch ihre entsprechenden Werte aus der '''GL_PIXEL_MAP_S_TO_S''' Tabelle ersetzt. &lt;br /&gt;
'''GL_DEPTH_COMPONENT'''&lt;br /&gt;
: Tiefenwertkomponenten werden aus dem Z-Buffer gelesen. Jede Komponente wird in eine Gleitkommazahl umgewandelt, so dass der minimale Wert auf 0.0 abgebildet wird und der maximale auf 1.0. Dann wird der Wert mit '''GL_DEPTH_SCALE''' multipliziert und zu '''GL_DEPTH_BIAS''' addiert und am Schluss auf den Bereich [0,1] begrenzt. &lt;br /&gt;
&lt;br /&gt;
'''GL_RED''' &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_GREEN''' &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_BLUE''' &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_ALPHA''' &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_RGB''' &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_RGBA''' &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_LUMINANCE''' &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_LUMINANCE_ALPHA''' &lt;br /&gt;
&lt;br /&gt;
: Hierbei verhält sich die Verarbeitung unterschiedlich, abhängig davon, ob Farbindizes oder Farbkomponenten im Colorbuffer geschpeichert sind. Wenn Indizes gespeichert sind, werden sie aus dem mit glReadBuffer gesetzen Colorbuffer gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von '''GL_INDEX_SHIFT''' bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Dann werden die Indizes durch ihre entsprechenden Werte aus den Tabellen '''GL_PIXEL_MAP_I_TO_R''', '''GL_PIXEL_MAP_I_TO_G''', '''GL_PIXEL_MAP_I_TO_B''' und '''GL_PIXEL_MAP_I_TO_A''' ersetzt. &lt;br /&gt;
: Sind RGBA Farbkomponenten gespeichert, werden sie aus dem mit glReadBuffer gesetzen Colorbuffer gelesen. &lt;br /&gt;
:Jede Farbkomponente wird so in eine Gleitkommazahl umgewandelt, dass der minimale Wert auf 0.0 abgebildet wird und der maximale auf 1.0. Dann wird der Wert mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll.&lt;br /&gt;
:Ist '''GL_MAP_COLOR''' auf '''GL_TRUE''' gesetzt, wird jeder Farbkomponente durch die entsprechende Ersetzung aus der '''GL_PIXEL_MAP_'''''c'''''_TO_'''''c'' Tabelle (wobei ''c'' wieder R, G, B oder A ist) ersetzt. Davor wird jede Komponente auf die Größe der entsprechenden Tabelle skaliert.&lt;br /&gt;
: Abschließend werden die unbenötigen Daten verworfen, z.B.: '''GL_RED''' ignoriert die Grün, Blau und Alpha Komponente, und '''GL_RGB''' ignoriert nur den Alphawert. '''GL_LUMINANCE''' berechnet eine einzige Farbkomponente durch die Summe von Rot, Grün und Blau. '''GL_LUMINANCE_ALPHA''' hat zusätzlich noch einen Alphawert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die shift-, scale-, bias-, und lookup-Faktoren die weiter oben beschrieben wurden, werden alle durch [[glPixelTransfer]] spezifiziert. Der Inhalt der lookup-table wiederum wird über [[glPixelMap]] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
Der letzte Schritt beinhaltet eine Umwandlung der Indizes oder Komponenten in das in ''_type'' angegebene Format. Falls das Format '''GL_COLOR_INDEX''' or '''GL_STENCIL_INDEX''' ist, und der angegebene Typ nicht '''GL_FLOAT''' ist, dann wird jeder wert mit dem Masken der der folgenden Tabelle maskiert. Falls der Typ '''GL_FLOAT''' ist werden die ganzen Zahlen (Typ Integer) in einen Gleitkommerwert umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Falls das Format '''GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE''' oder '''GL_LUMINANCE_ALPHA''' ist und der Typ nicht '''GL_FLOAT''' ist, wird jede Komponente mit einen Wert multipliziert, welcher folgender Tabelle entnommen werden kann. Falls der Typ '''GL_FLOAT''' ist werden alle Komponten beibehalten wie sie sind.(Oder in das entsprechend Gleitkommaformat konventiert, falls sich dieses von dem der in GL genutzten unterscheidet)&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! '''Type''' || '''Index Mask''' || '''Komponenten &amp;lt;br&amp;gt;Konvertierung'''&lt;br /&gt;
|-&lt;br /&gt;
! '''GL_UNSIGNED_BYTE''' || 2^8-1 || (2^8-1)c&lt;br /&gt;
|-&lt;br /&gt;
! '''GL_BYTE''' || 2^7-1 || ([2^7-1]c-1)/2&lt;br /&gt;
|-&lt;br /&gt;
! '''GL_BITMAP''' || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
! '''GL_UNSIGNED_SHORT''' || 2^16-1 || (2^16-1) c&lt;br /&gt;
|-&lt;br /&gt;
! '''GL_SHORT''' || 2^15-1 || [(2^15-1) c-1] / 2&lt;br /&gt;
|-&lt;br /&gt;
! '''GL_UNSIGNED_INT''' || 2^32-1 || (2^32-1) c&lt;br /&gt;
|-&lt;br /&gt;
! '''GL_INT''' || 2^31-1 || [(2^31-1) c-1] / 2 &lt;br /&gt;
|-&lt;br /&gt;
! '''GL_FLOAT''' || keine || c&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[glReadPixels_Beispiel| Ein Rechenbeispiel zum besseren Verständnis.]]&lt;br /&gt;
&lt;br /&gt;
Die zurückgegeben Werte werden wie folgt im Speicher plaziert: Falls das Format '''GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA,''' oder '''GL_LUMINANCE''' ist, wird ein einzelner Wert zurückgebenen und die Daten für die '''i'''ten [[Pixel]] in der '''j'''ten Reihe werden an der Stelle (j) width + i plaziert.&lt;br /&gt;
'''GL_RGB''' gibt drei Werte zurück, '''GL_RGBA''' vier, und '''GL_LUMINANCE_ALPHA''' zwei für jeden Pixel. Alle Werte die zu einem einzelnen Pixel gehören liegen nebeneinander im Feld ''pixels''.&lt;br /&gt;
Speicher Parameter werden von [[glPixelStore]] gesetzt, zum Beispiel legen '''GL_PACK_SWAP_BYTES''' und '''GL_PACK_LSB_FIRST''' fest, auf welche Art die Daten in den Speicher geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Werte von Pixeln außerhalb des Fensters, das mit dem aktuellen GL-Kontext verbunden ist, sind undefiniert.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Fehler bei der Durchführung der Funktion auftritt, werden keine Veränderungen am Inhalt von ''pixels'' durchgeführt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_ENUM''' wird generiert wenn ''format'' oder ''type'' ein ungültiger Wert übergeben wird.&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_INVALID_VALUE''' wird generiert wenn entweder ''width'' oder ''height'' negativ ist.&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_COLOR_INDEX''' ist und der [[Farbpuffer]] RGBA Werte enthält.&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_STENCIL_INDEX''' ist und kein Schablonen-(/Stencil-)Puffer existiert.&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_DEPTH_COMPONENT''' ist und kein [[Tiefenpuffer]] existiert.&amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert wenn '''glReadPixels''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGet]] mit Token [[glGet#GL_INDEX_MODE|GL_INDEX_MODE]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Anwendungs Möglichkeiten ==&lt;br /&gt;
Dies ist die Funktion mit welcher [[Screenshot]]s erzeugt werden können. Durch das Auslesen des [[Tiefenpuffer]], können [[Heightmap]]s erstellt werden. Auch erhält man so die nötige Z-Koordinate wenn man mit [[gluUnProject]] die ursprüngliche Koordinate errechnen möchte.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glCopyPixels]], [[glDrawPixels]], [[glPixelMap]], [[glPixelStore]], [[glPixelTransfer]], [[glReadBuffer]] &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|ReadPixels]]&lt;br /&gt;
 [[Kategorie:GL1.0]]&lt;/div&gt;</summary>
		<author><name>Tilman</name></author>	</entry>

	</feed>