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

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=TextureBufferObjects&amp;diff=24517</id>
		<title>TextureBufferObjects</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=TextureBufferObjects&amp;diff=24517"/>
				<updated>2010-01-08T18:51:56Z</updated>
		
		<summary type="html">&lt;p&gt;K-bal: Neu strukuriert, andere Formulierungen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Shader Model 4.0 führt mit der Extension [[GL_ARB_texture_buffer_object]] einen zusätzlichen Texturtyp ein: Das TextureBufferObject, oftmals abgekürzt mit TBO. Dabei handelt es sich um eine eindimensionale Textur, welche ihren Speicherbereich nicht selbst enthält, sondern auf den Speicher eines verknüpften BufferObjects zugreift. Bei einem solchen BufferObject kann es sich beispielsweise um ein [[VBO|VertexBufferObject]] (VBO) handeln. Es steht somit die Flexibilität von Bufferobjekten auch für Texturen zur Verfügung (fast) ohne zusätzliche Schnittstellen. &lt;br /&gt;
&lt;br /&gt;
Im Zusammenhang mit [[Shader#Transform-Feedback_.28auch_Stream-Out.29|Transform Feedback]] aber auch mit [[Instancing]] und bei anderen Gelegenheiten erweisen sich TextureBufferObjects als sehr nützlich. Mit Transform-Feedback kann in einen Vertexbuffer geschrieben werden, welcher dann im nächsten Renderpass ohne zusätzliche Kopiervorgänge als Textur benutzt werden kann. Dies wird unter anderem beim [[GLSL_Partikel_2|Shader Model 4.0 Partikelsystem]] exzessiv benutzt. Ein [[shader_Instancing|Beispiel zu Instancing]] findet sich in der [[Shadersammlung]].&lt;br /&gt;
&lt;br /&gt;
Im Shader können TextureBufferObjects ausschließlich mit Integer-Koordinaten adressiert werden. Daher findet auch keine Interpolation zwischen Texeln statt. Wer eine Interpolation benötigt kann diese aber einfach selbst im Shader implementieren.&lt;br /&gt;
&lt;br /&gt;
Für TextureBufferObjects muss keine Größe angegeben werden. Die Größe der Textur berechnet sich aus der Gesamtgröße des zugehörigen Bufferobjektes geteilt durch die Größe eines Texels. Die maximale Größe eines TextureBufferObjects beträgt dabei 2^27 = 134.217.728 Texel im Gegensatz zu normalen eindimensionalen Texturen, welche eine maximale Größe von 2^13 = 8.192 Texeln haben. In Kombination mit einem 4x32bit Texelformat (z.B. RGBA32F) bedeutet dies, dass ein TBO theoretisch bis zu 2 GB groß werden darf. Praktisch ist die Größe natürlich durch den Speicher der Grafikkarte begrenzt.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
===Verwendung im Programm===&lt;br /&gt;
Um unser TextureBufferObject zu Erstellen benutzen wir wie bei gewöhnlichen Texturen die Funktion [[glGenTextures]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
GLuint myTBO;&lt;br /&gt;
glGenTextures(1, &amp;amp;myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Löschen geschieht genauso gewohnt mit [[glDeleteTextures]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glDeleteTextures(1, &amp;amp;myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um das TextureBufferObject zu verwenden muss es wie eine normale Textur mit [[glBindTexture]] gebunden werden. Wir übergeben dabei allerdings die Konstante &amp;lt;tt&amp;gt;GL_TEXTURE_BUFFER_ARB&amp;lt;/tt&amp;gt; als ersten Parameter:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glBindTexture(GL_TEXTURE_BUFFER_ARB, myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend geben wir mit [[glTexBufferARB]]''(enum target, enum internalformat, uint buffer)''&lt;br /&gt;
an, welches BufferObject mit dem TextureBufferObject verknüpft werden soll. Bei diesem BufferObject kann es sich zum Beispiel um ein [[VBO|VertexBufferObject]] handeln.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glTexBufferARB(GL_TEXTURE_BUFFER_ARB, GL_RGBA32F_ARB, myVBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der zweite Parameter gibt hierbei den Datentyp unserer Textur an. Als Beispiel wurde hier ''GL_RGBA32F_ARB'' gewählt. Damit wird unsere Textur als vierelementiger 32-bit-float-Vektor benutzt (4*4 = 16 Byte pro Texel). Die Tabelle im [[#Texelformate|Abschnitt Texelformate]] gibt eine Übersicht über die möglichen Formate, welche als zweiter Parameter angegeben werden können.&lt;br /&gt;
&lt;br /&gt;
===Verwendung im Shader===&lt;br /&gt;
Unser TextureBufferObject ist nun erstellt und gebunden. Nun ist es an der Zeit, es im Shader auszulesen. Dafür brauchen wir neue Textursampler-Typen: &amp;lt;tt&amp;gt;samplerBuffer&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;usamplerBuffer&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;isamplerBuffer&amp;lt;/tt&amp;gt;, je nachdem, was unser TextureBufferObject für einen Datentyp repräsentiert: &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;unsigned int&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. Über diesen Sampler greifen wir mit der Funktion &amp;lt;tt&amp;gt;texelFetchBuffer(samplerBuffer sampler, uint index)&amp;lt;/tt&amp;gt; auf unser TextureBufferObject zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;&lt;br /&gt;
#extension GL_EXT_gpu_shader4 : require&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
uniform samplerBuffer tbo;  // Unser Sampler, wir benutzen floats =&amp;gt; samplerBuffer&lt;br /&gt;
&lt;br /&gt;
void main() &lt;br /&gt;
{ &lt;br /&gt;
	// Wir brauchen einen Array-Index um einen Texel zum Auslesen zu bestimmen.&lt;br /&gt;
	unsigned int index;&lt;br /&gt;
&lt;br /&gt;
	// Wir berechnen unseren Index.&lt;br /&gt;
	// ...&lt;br /&gt;
	&lt;br /&gt;
	// Wir holen einen Texel aus unserem TextureBufferObject.&lt;br /&gt;
	vec4 tmp = texelFetchBuffer(tbo, index); &lt;br /&gt;
&lt;br /&gt;
	// Wir machen etwas mit tmp&lt;br /&gt;
	// ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Texelformate ==&lt;br /&gt;
Die folgende Tabelle aus der [http://www.opengl.org/registry/specs/ARB/texture_buffer_object.txt Extension-Spezifikation] gibt eine Übersicht über die möglichen Texelformate.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Es gibt nur ein-, zwei- und vier-elementige Typen. Will man also drei-elementige Daten benutzen, so muss man eine vierte Komponente ergänzen (zusätzlicher Speicherverbrauch) oder die Komponenten-Indizes im Shader zurückrechnen (zusätzlicher Rechenaufwand).}}&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|- style=&amp;quot;background:#CCCCCC;&amp;quot;&lt;br /&gt;
! rowspan=2 | Sized Internal Format&lt;br /&gt;
! rowspan=2 | Base Type&lt;br /&gt;
! rowspan=2 | Components&lt;br /&gt;
! rowspan=2 | Norm&lt;br /&gt;
! colspan=4 | Component&lt;br /&gt;
|- style=&amp;quot;background:#CCCCCC;&amp;quot;&lt;br /&gt;
! 0 !! 1 !! 2 !! 3&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA8 || ubyte || 1 || Y || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA16 || ushort || 1 || Y || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA16F_ARB || half || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA32F_ARB || float || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA8I_EXT || byte || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA16I_EXT || short || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA32I_EXT || int || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA8UI_EXT || ubyte || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA16UI_EXT || ushort || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_ALPHA32UI_EXT || uint || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE8 || ubyte || 1 || Y || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE16 || ushort || 1 || Y || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE16F_ARB || half || 1 || N || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE32F_ARB || float || 1 || N || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE8I_EXT || byte || 1 || N || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE16I_EXT || short || 1 || N || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE32I_EXT || int || 1 || N || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE8UI_EXT || ubyte || 1 || N || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE16UI_EXT || ushort || 1 || N || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE32UI_EXT || uint || 1 || N || L || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE8_ALPHA8 || ubyte || 2 || Y || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE16_ALPHA16 || ushort || 2 || Y || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE_ALPHA16F_ARB || half || 2 || N || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE_ALPHA32F_ARB || float || 2 || N || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE_ALPHA8I_EXT || byte || 2 || N || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE_ALPHA16I_EXT || short || 2 || N || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE_ALPHA32I_EXT || int || 2 || N || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE_ALPHA8UI_EXT || ubyte || 2 || N || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE_ALPHA16UI_EXT || ushort || 2 || N || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_LUMINANCE_ALPHA32UI_EXT || uint || 2 || N || L || A || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY8 || ubyte || 1 || Y || I || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY16 || ushort || 1 || Y || I || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY16F_ARB || half || 1 || N || I || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY32F_ARB || float || 1 || N || I || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY8I_EXT || byte || 1 || N || I || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY16I_EXT || short || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY32I_EXT || int || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY8UI_EXT || ubyte || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY16UI_EXT || ushort || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_INTENSITY32UI_EXT || uint || 1 || N || A || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA8 || ubyte || 4 || Y || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA16 || ushort || 4 || Y || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA16F_ARB || half || 4 || N || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA32F_ARB || float || 4 || N || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA8I_EXT || byte || 4 || N || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA16I_EXT || short || 4 || N || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA32I_EXT || int || 4 || N || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA8UI_EXT || ubyte || 4 || N || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA16UI_EXT || ushort || 4 || N || R || G || B || A&lt;br /&gt;
|-&lt;br /&gt;
| GL_RGBA32UI_EXT || uint || 4 || N || R || G || B || A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [http://www.opengl.org/registry/specs/ARB/texture_buffer_object.txt ARB_texture_buffer_object] (Englisch)&lt;/div&gt;</summary>
		<author><name>K-bal</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=TextureBufferObjects&amp;diff=24511</id>
		<title>TextureBufferObjects</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=TextureBufferObjects&amp;diff=24511"/>
				<updated>2010-01-07T21:26:04Z</updated>
		
		<summary type="html">&lt;p&gt;K-bal: /* Benutzung seitens der CPU */  (gl)BindTexture, gl ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Texture Buffer Objects ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einleitung&lt;br /&gt;
Das Shader Model 4.0 bietet einen neuen Texturtyp, die Texture Buffer Objects (GL_ARB_texture_buffer_object). Diese sind eindimensionale Texturen, welche ihren Speicherbereich nicht selbst enthalten, sondern auf den Speicher eines verknüpften Buffer Objects zugreifen. Es steht somit die Flexibilität von Bufferobjekten auch für Texturen zur Verfügung (fast) ohne zusätzliche Schnittstellen. So kann zum Beispiel mit Transform Feedback in einen Vertexbuffer geschrieben werden, welcher im nächsten Renderpass wiederum ohne zusätzliche Kopiervorgänge als Textur benutzt werden kann. Dies wird unter anderem beim [[GLSL_Partikel_2|Shader Model 4.0 Partikelsystem]] exzessiv benutzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Erstellung und Löschung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um unser Texture Buffer Object zu erstellen benutzen wir die Funktion ''glGenTextures(sizei count, uint* texturehandles)'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
GLuint myTBO;&lt;br /&gt;
glGenTextures(1, &amp;amp;myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Löschen geschieht mit ''glDeleteTextures(sizei count, uint* texturehandles)'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glDeleteTextures(1, &amp;amp;myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Benutzung seitens der CPU ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst binden wir das Texture Buffer Object wie eine normale Textur mit ''glBindTexture(enum target, uint texture)''. Wir übergeben die Konstante ''GL_TEXTURE_BUFFER_ARB'' als ersten Parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glBindTexture(GL_TEXTURE_BUFFER_ARB, myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend geben wir mit ''glTexBufferARB(enum target, enum internalformat, uint buffer)''&lt;br /&gt;
an, welches Buffer Object mit dem Texture Buffer Object verknüpft werden soll:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glTexBufferARB(GL_TEXTURE_BUFFER_ARB GL_RGBA32F_ARB, myVBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der zweite Parameter gibt hierbei den Datentyp unserer Textur an. Als Beispiel ist hier ''GL_RGBA32F_ARB'' gewählt. Damit wird unsere Textur als vierelementiger 32-bit-float-Vektor benutzt (4*4 = 16 byte pro Texel). Folgende Tabelle aus der OpenGL-Spezifikation gibt eine Übersicht über die möglichen Konstanten, welche als zweiter Parameter angegeben werden können:&lt;br /&gt;
&lt;br /&gt;
                                                             Component&lt;br /&gt;
      Sized Internal Format     Base Type  Components  Norm   0 1 2 3&lt;br /&gt;
      ------------------------  ---------  ----------  ----   -------&lt;br /&gt;
      ALPHA8                     ubyte         1        Y     A . . .&lt;br /&gt;
      ALPHA16                    ushort        1        Y     A . . .&lt;br /&gt;
      ALPHA16F_ARB               half          1        N     A . . .&lt;br /&gt;
      ALPHA32F_ARB               float         1        N     A . . .&lt;br /&gt;
      ALPHA8I_EXT                byte          1        N     A . . .&lt;br /&gt;
      ALPHA16I_EXT               short         1        N     A . . .&lt;br /&gt;
      ALPHA32I_EXT               int           1        N     A . . .&lt;br /&gt;
      ALPHA8UI_EXT               ubyte         1        N     A . . .&lt;br /&gt;
      ALPHA16UI_EXT              ushort        1        N     A . . .&lt;br /&gt;
      ALPHA32UI_EXT              uint          1        N     A . . .&lt;br /&gt;
&lt;br /&gt;
      LUMINANCE8                 ubyte         1        Y     L . . .&lt;br /&gt;
      LUMINANCE16                ushort        1        Y     L . . .&lt;br /&gt;
      LUMINANCE16F_ARB           half          1        N     L . . .&lt;br /&gt;
      LUMINANCE32F_ARB           float         1        N     L . . .&lt;br /&gt;
      LUMINANCE8I_EXT            byte          1        N     L . . .&lt;br /&gt;
      LUMINANCE16I_EXT           short         1        N     L . . .&lt;br /&gt;
      LUMINANCE32I_EXT           int           1        N     L . . .&lt;br /&gt;
      LUMINANCE8UI_EXT           ubyte         1        N     L . . .&lt;br /&gt;
      LUMINANCE16UI_EXT          ushort        1        N     L . . .&lt;br /&gt;
      LUMINANCE32UI_EXT          uint          1        N     L . . .&lt;br /&gt;
&lt;br /&gt;
      LUMINANCE8_ALPHA8          ubyte         2        Y     L A . .&lt;br /&gt;
      LUMINANCE16_ALPHA16        ushort        2        Y     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA16F_ARB     half          2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA32F_ARB     float         2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA8I_EXT      byte          2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA16I_EXT     short         2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA32I_EXT     int           2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA8UI_EXT     ubyte         2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA16UI_EXT    ushort        2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA32UI_EXT    uint          2        N     L A . .&lt;br /&gt;
&lt;br /&gt;
      INTENSITY8                 ubyte         1        Y     I . . .&lt;br /&gt;
      INTENSITY16                ushort        1        Y     I . . .&lt;br /&gt;
      INTENSITY16F_ARB           half          1        N     I . . .&lt;br /&gt;
      INTENSITY32F_ARB           float         1        N     I . . .&lt;br /&gt;
      INTENSITY8I_EXT            byte          1        N     I . . .&lt;br /&gt;
      INTENSITY16I_EXT           short         1        N     A . . .&lt;br /&gt;
      INTENSITY32I_EXT           int           1        N     A . . .&lt;br /&gt;
      INTENSITY8UI_EXT           ubyte         1        N     A . . .&lt;br /&gt;
      INTENSITY16UI_EXT          ushort        1        N     A . . .&lt;br /&gt;
      INTENSITY32UI_EXT          uint          1        N     A . . .&lt;br /&gt;
&lt;br /&gt;
      RGBA8                      ubyte         4        Y     R G B A&lt;br /&gt;
      RGBA16                     ushort        4        Y     R G B A&lt;br /&gt;
      RGBA16F_ARB                half          4        N     R G B A&lt;br /&gt;
      RGBA32F_ARB                float         4        N     R G B A&lt;br /&gt;
      RGBA8I_EXT                 byte          4        N     R G B A&lt;br /&gt;
      RGBA16I_EXT                short         4        N     R G B A&lt;br /&gt;
      RGBA32I_EXT                int           4        N     R G B A&lt;br /&gt;
      RGBA8UI_EXT                ubyte         4        N     R G B A&lt;br /&gt;
      RGBA16UI_EXT               ushort        4        N     R G B A&lt;br /&gt;
      RGBA32UI_EXT               uint          4        N     R G B A&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, gibt es nur ein-, zwei- und vier-elementige Typen. Will man also drei-elementige Daten benutzen, so muss man eine vierte Komponente ergänzen (zusätzlicher Speicherverbrauch) oder die Komponenten-Indizes im Shader zurückrechnen (zusätzlicher Rechenaufwand).&lt;br /&gt;
&lt;br /&gt;
=== Benutzung seitens der GPU ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unser Texture Buffer Object ist nun erstellt und gebunden. Nun ist es an der Zeit, es im Shader auszulesen. Dafür brauchen wir neue Textursampler-Typen: ''samplerBuffer'', ''usamplerBuffer'' oder ''isamplerBuffer'', je nachdem, was unser Texture Buffer Object für einen Datentyp repräsentiert: ''float'', ''unsigned int'' oder ''int''. Über diesen Sampler greifen wir mit der Funktion ''texelFetchBuffer(samplerBuffer sampler, uint index)'' auf unser Texture Buffer Object zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt; &lt;br /&gt;
// .....&lt;br /&gt;
&lt;br /&gt;
uniform samplerBuffer tbo;  // Unser sampler, wir benutzen floats =&amp;gt; samplerBuffer&lt;br /&gt;
&lt;br /&gt;
void main() &lt;br /&gt;
{ &lt;br /&gt;
	// Wir brauchen einen Array-Index um einen Texel zum Auslesen zu bestimmen.&lt;br /&gt;
&lt;br /&gt;
	unsigned int index;&lt;br /&gt;
&lt;br /&gt;
	// Wir berechnen unseren Index.&lt;br /&gt;
&lt;br /&gt;
	// ....&lt;br /&gt;
	&lt;br /&gt;
	// Wir holen einen Texel aus unserem Texture Buffer Object.&lt;br /&gt;
&lt;br /&gt;
	vec4 tmp = texelFetchBuffer(tbo, index); &lt;br /&gt;
&lt;br /&gt;
	// Wir machen etwas mit tmp&lt;br /&gt;
&lt;br /&gt;
	// .....&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Größe ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für Texture Buffer Objects muss keine Größe angegeben werden; Die Größe der Textur berechnet sich aus der Gesamtgröße des zugehörigen Buffer Objektes geteilt durch die Größe eines Texels. Die maximale Größe eines Texture Buffer Objects beträgt dabei 2^27 = 134217728 im Gegensatz zu normalen eindimensionalen Texturen, welche eine maximale Größe von 2^13 = 8192 haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Literatur ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://www.opengl.org/registry/specs/ARB/texture_buffer_object.txt&lt;/div&gt;</summary>
		<author><name>K-bal</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=TextureBufferObjects&amp;diff=24510</id>
		<title>TextureBufferObjects</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=TextureBufferObjects&amp;diff=24510"/>
				<updated>2010-01-07T21:24:33Z</updated>
		
		<summary type="html">&lt;p&gt;K-bal: Artikel erstellt!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Texture Buffer Objects ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einleitung&lt;br /&gt;
Das Shader Model 4.0 bietet einen neuen Texturtyp, die Texture Buffer Objects (GL_ARB_texture_buffer_object). Diese sind eindimensionale Texturen, welche ihren Speicherbereich nicht selbst enthalten, sondern auf den Speicher eines verknüpften Buffer Objects zugreifen. Es steht somit die Flexibilität von Bufferobjekten auch für Texturen zur Verfügung (fast) ohne zusätzliche Schnittstellen. So kann zum Beispiel mit Transform Feedback in einen Vertexbuffer geschrieben werden, welcher im nächsten Renderpass wiederum ohne zusätzliche Kopiervorgänge als Textur benutzt werden kann. Dies wird unter anderem beim [[GLSL_Partikel_2|Shader Model 4.0 Partikelsystem]] exzessiv benutzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Erstellung und Löschung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um unser Texture Buffer Object zu erstellen benutzen wir die Funktion ''glGenTextures(sizei count, uint* texturehandles)'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
GLuint myTBO;&lt;br /&gt;
glGenTextures(1, &amp;amp;myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Löschen geschieht mit ''glDeleteTextures(sizei count, uint* texturehandles)'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glDeleteTextures(1, &amp;amp;myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Benutzung seitens der CPU ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst binden wir das Texture Buffer Object wie eine normale Textur mit ''BindTexture(enum target, uint texture)''. Wir übergeben die Konstante ''GL_TEXTURE_BUFFER_ARB'' als ersten Parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glBindTexture(GL_TEXTURE_BUFFER_ARB, myTBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend geben wir mit ''glTexBufferARB(enum target, enum internalformat, uint buffer)''&lt;br /&gt;
an, welches Buffer Object mit dem Texture Buffer Object verknüpft werden soll:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glTexBufferARB(GL_TEXTURE_BUFFER_ARB GL_RGBA32F_ARB, myVBO);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der zweite Parameter gibt hierbei den Datentyp unserer Textur an. Als Beispiel ist hier ''GL_RGBA32F_ARB'' gewählt. Damit wird unsere Textur als vierelementiger 32-bit-float-Vektor benutzt (4*4 = 16 byte pro Texel). Folgende Tabelle aus der OpenGL-Spezifikation gibt eine Übersicht über die möglichen Konstanten, welche als zweiter Parameter angegeben werden können:&lt;br /&gt;
&lt;br /&gt;
                                                             Component&lt;br /&gt;
      Sized Internal Format     Base Type  Components  Norm   0 1 2 3&lt;br /&gt;
      ------------------------  ---------  ----------  ----   -------&lt;br /&gt;
      ALPHA8                     ubyte         1        Y     A . . .&lt;br /&gt;
      ALPHA16                    ushort        1        Y     A . . .&lt;br /&gt;
      ALPHA16F_ARB               half          1        N     A . . .&lt;br /&gt;
      ALPHA32F_ARB               float         1        N     A . . .&lt;br /&gt;
      ALPHA8I_EXT                byte          1        N     A . . .&lt;br /&gt;
      ALPHA16I_EXT               short         1        N     A . . .&lt;br /&gt;
      ALPHA32I_EXT               int           1        N     A . . .&lt;br /&gt;
      ALPHA8UI_EXT               ubyte         1        N     A . . .&lt;br /&gt;
      ALPHA16UI_EXT              ushort        1        N     A . . .&lt;br /&gt;
      ALPHA32UI_EXT              uint          1        N     A . . .&lt;br /&gt;
&lt;br /&gt;
      LUMINANCE8                 ubyte         1        Y     L . . .&lt;br /&gt;
      LUMINANCE16                ushort        1        Y     L . . .&lt;br /&gt;
      LUMINANCE16F_ARB           half          1        N     L . . .&lt;br /&gt;
      LUMINANCE32F_ARB           float         1        N     L . . .&lt;br /&gt;
      LUMINANCE8I_EXT            byte          1        N     L . . .&lt;br /&gt;
      LUMINANCE16I_EXT           short         1        N     L . . .&lt;br /&gt;
      LUMINANCE32I_EXT           int           1        N     L . . .&lt;br /&gt;
      LUMINANCE8UI_EXT           ubyte         1        N     L . . .&lt;br /&gt;
      LUMINANCE16UI_EXT          ushort        1        N     L . . .&lt;br /&gt;
      LUMINANCE32UI_EXT          uint          1        N     L . . .&lt;br /&gt;
&lt;br /&gt;
      LUMINANCE8_ALPHA8          ubyte         2        Y     L A . .&lt;br /&gt;
      LUMINANCE16_ALPHA16        ushort        2        Y     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA16F_ARB     half          2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA32F_ARB     float         2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA8I_EXT      byte          2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA16I_EXT     short         2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA32I_EXT     int           2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA8UI_EXT     ubyte         2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA16UI_EXT    ushort        2        N     L A . .&lt;br /&gt;
      LUMINANCE_ALPHA32UI_EXT    uint          2        N     L A . .&lt;br /&gt;
&lt;br /&gt;
      INTENSITY8                 ubyte         1        Y     I . . .&lt;br /&gt;
      INTENSITY16                ushort        1        Y     I . . .&lt;br /&gt;
      INTENSITY16F_ARB           half          1        N     I . . .&lt;br /&gt;
      INTENSITY32F_ARB           float         1        N     I . . .&lt;br /&gt;
      INTENSITY8I_EXT            byte          1        N     I . . .&lt;br /&gt;
      INTENSITY16I_EXT           short         1        N     A . . .&lt;br /&gt;
      INTENSITY32I_EXT           int           1        N     A . . .&lt;br /&gt;
      INTENSITY8UI_EXT           ubyte         1        N     A . . .&lt;br /&gt;
      INTENSITY16UI_EXT          ushort        1        N     A . . .&lt;br /&gt;
      INTENSITY32UI_EXT          uint          1        N     A . . .&lt;br /&gt;
&lt;br /&gt;
      RGBA8                      ubyte         4        Y     R G B A&lt;br /&gt;
      RGBA16                     ushort        4        Y     R G B A&lt;br /&gt;
      RGBA16F_ARB                half          4        N     R G B A&lt;br /&gt;
      RGBA32F_ARB                float         4        N     R G B A&lt;br /&gt;
      RGBA8I_EXT                 byte          4        N     R G B A&lt;br /&gt;
      RGBA16I_EXT                short         4        N     R G B A&lt;br /&gt;
      RGBA32I_EXT                int           4        N     R G B A&lt;br /&gt;
      RGBA8UI_EXT                ubyte         4        N     R G B A&lt;br /&gt;
      RGBA16UI_EXT               ushort        4        N     R G B A&lt;br /&gt;
      RGBA32UI_EXT               uint          4        N     R G B A&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, gibt es nur ein-, zwei- und vier-elementige Typen. Will man also drei-elementige Daten benutzen, so muss man eine vierte Komponente ergänzen (zusätzlicher Speicherverbrauch) oder die Komponenten-Indizes im Shader zurückrechnen (zusätzlicher Rechenaufwand).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Benutzung seitens der GPU ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unser Texture Buffer Object ist nun erstellt und gebunden. Nun ist es an der Zeit, es im Shader auszulesen. Dafür brauchen wir neue Textursampler-Typen: ''samplerBuffer'', ''usamplerBuffer'' oder ''isamplerBuffer'', je nachdem, was unser Texture Buffer Object für einen Datentyp repräsentiert: ''float'', ''unsigned int'' oder ''int''. Über diesen Sampler greifen wir mit der Funktion ''texelFetchBuffer(samplerBuffer sampler, uint index)'' auf unser Texture Buffer Object zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt; &lt;br /&gt;
// .....&lt;br /&gt;
&lt;br /&gt;
uniform samplerBuffer tbo;  // Unser sampler, wir benutzen floats =&amp;gt; samplerBuffer&lt;br /&gt;
&lt;br /&gt;
void main() &lt;br /&gt;
{ &lt;br /&gt;
	// Wir brauchen einen Array-Index um einen Texel zum Auslesen zu bestimmen.&lt;br /&gt;
&lt;br /&gt;
	unsigned int index;&lt;br /&gt;
&lt;br /&gt;
	// Wir berechnen unseren Index.&lt;br /&gt;
&lt;br /&gt;
	// ....&lt;br /&gt;
	&lt;br /&gt;
	// Wir holen einen Texel aus unserem Texture Buffer Object.&lt;br /&gt;
&lt;br /&gt;
	vec4 tmp = texelFetchBuffer(tbo, index); &lt;br /&gt;
&lt;br /&gt;
	// Wir machen etwas mit tmp&lt;br /&gt;
&lt;br /&gt;
	// .....&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Größe ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für Texture Buffer Objects muss keine Größe angegeben werden; Die Größe der Textur berechnet sich aus der Gesamtgröße des zugehörigen Buffer Objektes geteilt durch die Größe eines Texels. Die maximale Größe eines Texture Buffer Objects beträgt dabei 2^27 = 134217728 im Gegensatz zu normalen eindimensionalen Texturen, welche eine maximale Größe von 2^13 = 8192 haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Literatur ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://www.opengl.org/registry/specs/ARB/texture_buffer_object.txt&lt;/div&gt;</summary>
		<author><name>K-bal</name></author>	</entry>

	</feed>