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

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24779</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24779"/>
				<updated>2010-03-15T12:31:19Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Idee */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Begriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe die Geometrieverarbeitung von der Lichtberechnung getrennt werden kann. Dies erlaubt hunderte Lichtquellen in einer hoch-komplexen Szene.&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle muss also jedes Objekt gezeichnet werden. Angenommen wir haben ''nL'' Lichtquellen und ''nO'' Objekte, dann liegt die Anzahl der Rendercalls bei ''O(nO * nL)''. Natürlich ist es möglich mehrere Lichtquellen in einem Pass (z.B. 8 auf einmal) zu berechnen, aber wir gehen von hunderten Lichtquellen aus, es sind also mehrere Passes notwendig und die Geometrie müsste entsprechend mehrfach verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jeden Licht-Pass neu zu renderen, werden zunächst für jeden Pixel alle beleuchtungsrelevanten Daten (z.B. 3D-Position, Normale, Textur-Farbe, etc.) in ein oder mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Die eigentliche Lichtberechnung kann nun durchgeführt werden indem ein bildschirmfüllendes Quad bzw. die Lichtgeometrie (Kugel für ein Punktlicht, Kegel für ein Spotlight) gerendert wird. Für jeden Pixel werden die Daten aus dem G-Buffer ausgelesen und die Beleuchtung entsprechend dieser Daten berechnet. Die Zahl der Rendercalls liegt bei diesem Ansatz nur noch bei ''O(nO + nL)''. Mit dieser Methode sind hunderte Lichter gleichzeitig in einer hoch-komplexen Szene möglich.&lt;br /&gt;
&lt;br /&gt;
Das Verfahren ist nur dann sinnvoll, wenn man es mit einer sehr komplexen Geometrie und sehr vielen Lichtquellen zu tun hat. Hat man zum Beispiel zwar viele Lichtquellen, aber eine einfache Geometrie, kann bereits ein einfacher Depth-Only-Pass zum initialisieren des Z-Buffers verhindern, dass für unsichtbare Pixel unnötige Lichtberechnungen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen bei komplexer Geometrie möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field, etc.) können einfach angeschlossen werden, da bereits alle benötigten Informationen aufbereitet vorliegen.&lt;br /&gt;
* Lichtberechnung mit reduzierter Auflösung möglich (sinnvoll z.B. bei FSAA, siehe [[Inferred Lighting]])&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Aliasing möglich&lt;br /&gt;
* Transparente Objekte müssen getrennt behandelt werden (Abhilfe schafft [[Inferred Lighting]])&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich (ab DirectX 9 kompatiblem Grafikchip; OpenGL Version ???)&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&amp;lt;br&amp;gt;&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[FBO]]&lt;br /&gt;
* [[Inferred Lighting]]&lt;br /&gt;
* [[Hintergrundwissen#Render-Pipeline|Render-Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24766</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24766"/>
				<updated>2010-03-14T22:18:11Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Vor-/Nachteile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Lichter gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field, etc.) können einfach angeschlossen werden, da bereits alle benötigten Informationen aufbereitet vorliegen.&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Aliasing möglich&lt;br /&gt;
* Transparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich (ab DirectX 9 kompatiblem Grafikchip; OpenGL Version ???)&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&amp;lt;br&amp;gt;&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Hintergrundwissen#Render-Pipeline|Render-Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24765</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24765"/>
				<updated>2010-03-14T22:03:20Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Lichter gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field) können einfach angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Alias möglich&lt;br /&gt;
* Tranparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&amp;lt;br&amp;gt;&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Hintergrundwissen#Render-Pipeline|Render-Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24764</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24764"/>
				<updated>2010-03-14T22:02:10Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Vorgehensweise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Lichter gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field) können einfach angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Alias möglich&lt;br /&gt;
* Tranparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&amp;lt;br&amp;gt;&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Hintergrundwissen#Render-Pipeline|Render-Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24763</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24763"/>
				<updated>2010-03-14T21:56:43Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Implementierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Objekte gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field) können einfach angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Alias möglich&lt;br /&gt;
* Tranparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&amp;lt;br&amp;gt;&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Hintergrundwissen#Render-Pipeline|Render-Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24762</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24762"/>
				<updated>2010-03-14T21:55:13Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Objekte gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field) können einfach angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Alias möglich&lt;br /&gt;
* Tranparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //&lt;br /&gt;
  //---- G-Buffer fill pass ----&lt;br /&gt;
  //&lt;br /&gt;
&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&amp;lt;br&amp;gt;&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = float4(0.0f, 0.0f, 1.0f, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = col;&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Hintergrundwissen#Render-Pipeline|Render-Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24761</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24761"/>
				<updated>2010-03-14T21:54:56Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Objekte gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field) können einfach angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Alias möglich&lt;br /&gt;
* Tranparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //&lt;br /&gt;
  //---- G-Buffer fill pass ----&lt;br /&gt;
  //&lt;br /&gt;
&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&amp;lt;br&amp;gt;&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = float4(0.0f, 0.0f, 1.0f, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = col;&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Hintergrundwissen#Render-Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24760</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24760"/>
				<updated>2010-03-14T21:53:53Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Objekte gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field) können einfach angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Alias möglich&lt;br /&gt;
* Tranparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //&lt;br /&gt;
  //---- G-Buffer fill pass ----&lt;br /&gt;
  //&lt;br /&gt;
&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&amp;lt;br&amp;gt;&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = float4(0.0f, 0.0f, 1.0f, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = col;&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Grafik Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24759</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24759"/>
				<updated>2010-03-14T21:53:29Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Implementierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Objekte gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field) können einfach angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Alias möglich&lt;br /&gt;
* Tranparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //&lt;br /&gt;
  //---- G-Buffer fill pass ----&lt;br /&gt;
  //&lt;br /&gt;
&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&lt;br /&gt;
Das zur Beleuchtung verwendete Quad liegt in diesem (einfachen) Fall bereits projeziert in normierten Koordinaten vor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = float4(0.0f, 0.0f, 1.0f, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = col;&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Grafik Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24758</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24758"/>
				<updated>2010-03-14T21:51:33Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Vorgehensweise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Hierdurch sind nur wenige Lichtquellen gleichzeitig möglich.&lt;br /&gt;
&lt;br /&gt;
''Deferred Shading'' verfolgt einen anderen Ansatz: Anstatt jedes Objekt der Szene für jede Lichtquelle neu zu renderen, werden zunächst alle beleuchtungsrelevanten Daten (Position des Pixels, Normalenvektoren, unbeleuchtete Farbe des Pixels (Albedo), Glanzstärke, etc.) auf Pixelbasis in mehrere Rendertargets (oftmals auch G-Buffer genannt) geschrieben. Nun muss für jede Lichtquelle lediglich die Lichtquellengeometrie gezeichnet werden und in diesem Schritt die Beleuchtung auf die zwischengespeicherten Daten angewendet werden. Die Zahl der Rendercalls liegt also bei ''no + nl''. Mit dieser Methode sind hunderte Objekte gleichzeitig in einer Szene möglich.&lt;br /&gt;
&lt;br /&gt;
== Vor-/Nachteile ==&lt;br /&gt;
&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
* Viele Lichtquellen möglich&lt;br /&gt;
* Postprocessing Effekte (Bloom, Tonemapping, Depth of Field) können einfach angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
* Kein Hardware Anti-Alias möglich&lt;br /&gt;
* Tranparente Objekte müssen getrennt behandelt werden&lt;br /&gt;
* Nur auf neueren Grafikkarten mit MRT (Mutliple Render Target) und Floating Point-Textur Support möglich&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Zunächst müssen die Geometriedaten in den (G-Buffer) geschrieben werden. Hierzu benötigen wir drei 16-Bit Float Rendertarget Texturen. Niedrigere Bittiefen sind für Positionsbeschreibung und Normalenvektor zu wenig. Alle Rendertarget-Texturen müssen die gleiche Bittiefe haben. Sind mehrere Rendertargets aktiviert, so wird Hardware-Anti-Aliasing automatisch abgeschaltet. Die folgenden Beispiele sind mit Andorra 2D entwickelt und sollten recht einfach verständlich und nach OpenGL/DirectX umzusetzen sein.&lt;br /&gt;
&lt;br /&gt;
'''Schritt 1: Erstellen der Rendertargets'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
FRT_1_Albedo := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
FRT_1_Albedo.BitDepth := adF64Bit;&lt;br /&gt;
FRT_1_Albedo.SetSize(surfacew, surfaceh);&lt;br /&gt;
FRT_1_Albedo.Filter := atPoint;&lt;br /&gt;
&lt;br /&gt;
FRT_2_Position := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_3_Normal := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
FRT_4_Composite := TAdRenderTargetTexture.Create(FDraw);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Schritt 2: Der G-Buffer-Fill Shader (HLSL/Cg)'''&lt;br /&gt;
Der hier gezeigte Shader ist nur ein einfaches Beispiel. Unter anderem kann durch das geschickte Weglassen von Daten (Berechnen von X, Y aus den Z und den Screen-Coordinaten im Lighting-Shader) Bandbreite eingespart werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//Fragment Shader&lt;br /&gt;
&lt;br /&gt;
struct fs_res {&lt;br /&gt;
  float4 position: COLOR1;&lt;br /&gt;
  float4 normal: COLOR2;&lt;br /&gt;
  float4 albedo: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fs_res fs_std_geometry(&lt;br /&gt;
  float3 viewpos: TEXCOORD0,&lt;br /&gt;
  float3 normal: TEXCOORD1&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  fs_res OUT;  &lt;br /&gt;
   &lt;br /&gt;
  OUT.position = float4(viewpos, 1.0f); &lt;br /&gt;
  OUT.normal = float4(normal, 1.0f);&lt;br /&gt;
  OUT.albedo = float4(1.0f, 1.0f, 1.0f , 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Vertex Shader&lt;br /&gt;
&lt;br /&gt;
struct vs_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 viewpos : TEXCOORD0;  &lt;br /&gt;
  float3 normal: TEXCOORD1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_res vs_std_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  float3 normal: NORMAL,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_res OUT; &lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = mul(float4(position, 1.0f), modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(float4(position, 1.0f), modelview);&lt;br /&gt;
  OUT.normal = normalize(mul(float4(normal, 0.0f), modelview));&lt;br /&gt;
&lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 3: Daten in G-Buffer Rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //&lt;br /&gt;
  //---- G-Buffer fill pass ----&lt;br /&gt;
  //&lt;br /&gt;
&lt;br /&gt;
  //Activate the G-Buffers&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_1_Albedo.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, FRT_2_Position.Texture);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(0, 0, 0, 0), 1, 1);&lt;br /&gt;
&lt;br /&gt;
  //Activate the shaders&lt;br /&gt;
  FTransformShader.FragmentShader.BindEffect;&lt;br /&gt;
  FTransformShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  FScene.Draw(FCamera, nil, 0);&lt;br /&gt;
&lt;br /&gt;
  //Deactivate the shaders&lt;br /&gt;
  FTransformShader.VertexShader.UnbindEffect;&lt;br /&gt;
  FTransformShader.FragmentShader.UnbindEffect;&lt;br /&gt;
&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(2, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(1, nil);&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, nil);&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 4: Einfacher Direktionaler Licht-Shader'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct ps_light_res {&lt;br /&gt;
  float4 color: COLOR0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
ps_light_res ps_light_geometry(&lt;br /&gt;
  float3 screenpos: TEXCOORD0,&lt;br /&gt;
  float3 viewpos: TEXCOORD1,&lt;br /&gt;
  float3 lightdir: TEXCOORD2,&lt;br /&gt;
  &lt;br /&gt;
  uniform sampler sPosition,&lt;br /&gt;
  uniform sampler sNormal,&lt;br /&gt;
  uniform sampler sAlbedo,&lt;br /&gt;
  uniform float4 lightcolor&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  ps_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  float4 col = tex2D(sAlbedo, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  float4 normal = tex2D(sNormal, float2(screenpos.x, -screenpos.y));&lt;br /&gt;
  &lt;br /&gt;
  OUT.color = float4((lightcolor * col * clamp(dot(normal.xyz, lightdir), 0.0f, 1.0f)).rgb, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = float4(0.0f, 0.0f, 1.0f, 1.0f);&lt;br /&gt;
  &lt;br /&gt;
  //OUT.color = col;&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct vs_light_res {&lt;br /&gt;
  float4 pos: POSITION;&lt;br /&gt;
  float3 screenpos: TEXCOORD0;&lt;br /&gt;
  float3 viewpos: TEXCOORD1;&lt;br /&gt;
  float3 lightdir: TEXCOORD2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
vs_light_res vs_light_geometry(&lt;br /&gt;
  float3 position : POSITION,&lt;br /&gt;
  uniform float4x4 modelview,&lt;br /&gt;
  uniform float4x4 modelviewproj,&lt;br /&gt;
  uniform float3 lightdir&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
  vs_light_res OUT;&lt;br /&gt;
  &lt;br /&gt;
  OUT.pos = float4(position, 1.0f);&lt;br /&gt;
  OUT.screenpos = position * float3(0.5f, 0.5f, 0.0f) + float3(0.5f, 0.5f, 0.0f);//mul(pos, modelviewproj);&lt;br /&gt;
  OUT.viewpos = mul(position, modelview);&lt;br /&gt;
  OUT.lightdir = normalize(mul(float4(lightdir, 0.0f), modelview));&lt;br /&gt;
  &lt;br /&gt;
  return OUT;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 5: Lichtquellen in das Composite RT rendern'''&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  //Render a directional light using a quad&lt;br /&gt;
  FDraw.AdAppl.SetRenderTarget(0, FRT_4_Composite.Texture);&lt;br /&gt;
  FDraw.AdAppl.Viewport := AdRect(0, 0, surfacew, surfaceh);&lt;br /&gt;
  FDraw.AdAppl.ClearSurface(AdRect(0, 0, surfacew, surfaceh), [alColorBuffer, alZBuffer,&lt;br /&gt;
    alStencilBuffer], Ad_ARGB(255, 0, 0, 0), 1, 1);  &lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sAlbedo', FRT_1_Albedo.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sPosition', FRT_2_Position.Texture);&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('sNormal', FRT_3_Normal.Texture);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.BindEffect;&lt;br /&gt;
  FLightShader.VertexShader.BindEffect;&lt;br /&gt;
&lt;br /&gt;
  //Render a blue light&lt;br /&gt;
  FLightShader.FragmentShader.SetParameter('lightcolor', Ad_ARGB(255, 50, 50, 100));&lt;br /&gt;
  FLightShader.VertexShader.SetParameter('lightdir', AcVector_Normalize(AcVector3(2.0, 2.0, -1.0)));&lt;br /&gt;
  FQuad.BlendMode = bmAdd;&lt;br /&gt;
  FQuad.Draw(nil);&lt;br /&gt;
&lt;br /&gt;
  FLightShader.FragmentShader.UnbindEffect;&lt;br /&gt;
  FLightShader.VertexShader.UnbindEffect;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Schritt 6: Das Ergebnis Zeichnen'''&lt;br /&gt;
Nun muss nur noch das Ergebnis im &amp;quot;Composite&amp;quot;-RT gezeichnet werden - oder weitere Post-Processing Maßnahmen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.gamedev.net/reference/programming/features/defRender/&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Shader]]&lt;br /&gt;
* [[Grafik Pipeline]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24757</id>
		<title>Deferred Shading</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Deferred_Shading&amp;diff=24757"/>
				<updated>2010-03-14T21:26:01Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: Angefangen...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Deferred Shading =&lt;br /&gt;
&lt;br /&gt;
Der Befriff ''Deferred Shading'' (zu dt. &amp;quot;verzögertes Schattieren&amp;quot;) oder auch ''Deferred Lighting'' (&amp;quot;verzögerte Beleuchtung&amp;quot;) beschreibt eine Technik, mit deren Hilfe eine komplette Lichtquelle mit nur einem einzigen Draw-Call abgebildet werden kann.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
Um eine Szene mit einem traditionellen Forward-Renderer zu beleuchten, wird normalerweise jedes Objekt der Szene mit den entsprechenden Beleuchtungsparametern der Lichtquelle gezeichnet. Die verschiedenen Ergebnisse werden durch additives Blenden akkumuliert. Für jede Lichtquelle ''nl'' muss also jedes Objekt ''no'' gezeichnet werden. Die Anzahl der Rendercalls liegt also bei ''no * nl''. Besonders bei vielen Lichtquellen führt dies zu Geschwindigkeitseinbußen.&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Shader&amp;diff=24613</id>
		<title>Shader</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Shader&amp;diff=24613"/>
				<updated>2010-01-16T19:50:49Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Beispiel: General-Purpose Computation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Konzept ==&lt;br /&gt;
Die traditionelle [[Feste Funktionspipeline|Funktionspipeline]] der [[OpenGL]] ist eine feste Pipeline, auf die man nur beschränkt durch Statechanges Einfluss nehmen kann. Man hat also an sehr vielen Stellen starre Vorgaben die nur minimal anpassbar sind. So sind z.B. Farbberechnungen oder die Beleuchtung fest definiert und nur wenige ihrer Attribute können variiert werden. Neuere Algorithmen erfordern aber eine viel höhere Flexibilität. &lt;br /&gt;
&lt;br /&gt;
Einzelne Komponenten der Pipeline können nun aber durch kleine Programme, sog. ''Shader'' ersetzt werden. Diese Shader werden in der C ähnlichen Hochsprache GLSL geschrieben. Es gibt Variablen, if-Bedingungen, Schleifen, beliebige Texturzugriffe, ... vom Prinzip ist auf aktuellen Grafikchips fast alles möglich was auch auf auf einer CPU geht. Der wesentliche Unterschied beim Programmieren der GPU ist jedoch, dass die Programme parallel laufen. Die aktuelle CPUs haben bis zu 4 parallel arbeitende Kerne. Demnächst wird es wohl auch CPUs mit 8 Kernen geben. Im Vergleich dazu hat beispielsweise die GeForce GTX 295 zwei GPUs mit jeweils 240 Kernen [[#Quellen|[1]]]. Diese Kerne können jedoch, anderes wie bei der CPU, untereinander nicht kommunizieren. Daher holen Grafikkarten ihre enorme Geschwindigkeit. Es ist also schwierig bis unmöglich einen sequenziellen Algorithmus effizient auf der GPU zu implementieren.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Hardware kennt mittlerweile nur noch Shader. Die feste Funktionspipeline existiert nur noch als Softwarelösung. Der Grafiktreiber setzt die feste Funktionspipeline also einfach als Shader um.&lt;br /&gt;
&lt;br /&gt;
Eine kleine Warnung an OpenGL-Anfänger vorweg: Bevor man sich ernsthaft mit Shadern beschäftigt, sollte man die Grundlagen von OpenGL und den Aufbau der Renderingpipeline vollständig verstanden haben!&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Shader-Versionen, das sogenannte ''ShaderModel'', kurz SM. Man sollte immer darauf achten welches SM die eigene Grafikkarte unterstützt. SM 1.0 unterstützt beispielsweise noch keine if-Bedingungen oder Schleifen. In SM 2.0 gibt es noch keine Texturzugriffe im Vertexshader. Ab SM 4.0 gibt es dann endlich auch Integer-Arithmetik und die Datentypen ''int'' bzw. ''unsigned''. Hier ein paar grobe Richtwerte:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!  &amp;amp;nbsp;Hersteller&amp;amp;nbsp; !! Chip !! ShaderModel&lt;br /&gt;
|-&lt;br /&gt;
| ATI || Radeon 9800 Pro || 2.0&lt;br /&gt;
|-&lt;br /&gt;
| Nvidia || GeForce 9800 GT || 4.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Folgendes Bild zeigt den Aufbau der festen Renderingpipeline. Die Teile der Pipeline, die sich durch eigene kleine Programme, also Shader, ersetzen lassen, sind mit roten Kästen markiert. Weiter unten im Artikel werden diese Teile dann im einzelnen kurz erklärt und die Möglichkeiten an kleinen Beispielen erläutert. Die im Bild als ''optional'' markierten Teile sind standardmäßig abgeschaltet und nur auf neuester Grafikhardware verfügbar.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pipeline.png]]&lt;br /&gt;
&lt;br /&gt;
Der Scissor- und Stencil-Test ist im Bild nach dem Pixelshader angeordnet. Auf den meisten Diagrammen im Internet ist dies ebenfalls so, daher haben wir uns entschieden diese hier genauso zu machen. Höchstwahrscheinlich ist der Scissor-Test aber direkt im Rasterizer implementiert und auch der Stencil-Test kommt vermutlich aus Performancegründen vor dem Pixelshader. Möglicherweise ist dies auch auf verschiedenen Chips unterschiedlich implementiert. Für das Verständnis der Shader sind diese Implementierungsdetails jedoch unerheblich.&lt;br /&gt;
&lt;br /&gt;
== Vertexshader ==&lt;br /&gt;
Der Vertexshader erlaubt uns jeden Vertex einzeln zu modifizieren. Wir können und müssen die Modelview-Transformation sowie die Perspective-Transformation selbst übernehmen. Wollen wir klassisches [[Gouraud Shading]] müssen wir dies auch selbst übernehmen. &lt;br /&gt;
&lt;br /&gt;
====Beispiel: Heightmap-Terrain====&lt;br /&gt;
[[Bild:Terrain_Hmap.jpg|thumb|256px|Terrain aus Heightmap mit 2048x2048 Auflösung und 16bit Graustufen]]&lt;br /&gt;
Angenommen wir benötigen für jeden Vertex eine Position, eine Normale und zwei Sets von Texturkoordinaten, also insgesamt 10 Floats bzw. 40 Bytes. Bei einer Heightmapgröße von 4096x4096 benötigen wir also 640 Mb Speicher. Dies ist also nicht wirklich sinnvoll, insbesondere da viele Grafikkarten nur 512, 256 oder gar nur 128 Mb Speicher haben. Dies ist also mit der festen Funktionspipeline nicht praktikabel zu lösen.&lt;br /&gt;
&lt;br /&gt;
Gewöhnlich rendert man das Terrain nicht am Stück sondern in Blöcken von z.B. 64x64 Quads. Wir verwenden nun ''einen'' kleinen Vertexbuffer der 65x65 minimale Vertices enthält: Jeweils nur eine 2D-Position. Im Vertexshader verschieben wir die 2D-Vertices an die richtige Stelle. Die Höhe des jeweiligen Vertex wird aus der Heightmap-Textur ausgelesen und an die entsprechende Koordinate geschrieben. Auch die Vertexnormalen und Texturkoordinaten berechnet man direkt im Shader. Letztlich benötigen wir nur den kleinen Vertexbuffer, den ebenfalls sehr kleinen Indexbuffer und natürlich die Heightmaptextur. Angenommen wir verwenden 16bit Graustufen dann hat diese Textur eine Größe von 32 Mb. Dies sollte auch auf älteren Grafikkarten im Rahmen des machbaren sein. Der hier beschriebene Shader ist in der [[Shadersammlung]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Beispiel: Meshanimation====&lt;br /&gt;
Will man ein Meshanimieren muss man normalerweise jeden Teil des Meshes einzelnen rendern. Im Vertexshader kann man jeden Teil des Meshes einzeln transformieren oder auch zwischen den Teilen interpolieren. Diese Methode erfordert natürlich eine Markierung der einzelnen Meshteile. Hier eignet sich beispielsweise ein Farbkanal der Vertexfarbe.&lt;br /&gt;
&lt;br /&gt;
== Fragmentshader ==&lt;br /&gt;
Im Fragmentshader dürfen wir die Berechnung des Farbwertes eines Fragments (Pixel) selbst übernehmen. Angenommen wir verarbeiten Dreiecke, dann erhalten wir die interpolierten Vertexattribute als Shader-Input. Als Output schreiben wir in der Regel in gl_FragColor, der Farbe, die in den Framebuffer geschrieben werden soll. In der [http://de.wikipedia.org/wiki/DirectX DirectX]-Welt ist der Fragmentshader unter der Bezeichnung ''Pixelshader'' bekannt.&lt;br /&gt;
&lt;br /&gt;
Ich denke alleine die Anzahl der folgenden Beispiele zeigt das hier so einiges möglich ist.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Per-Pixel-Lighting ====&lt;br /&gt;
[[Bild:perpixellighting.jpg|thumb|256px|Per-Vertex-Lighting vs. Per-Pixel-Lighting]]&lt;br /&gt;
Die klassische Anwendung des Fragmentshader ist sicherlich das [[Tutorial_glsl2#Per-Pixel-Lighting|Per-Pixel-Lighting]]. Die feste Funktionspipeline erlaubt nur pro Vertex eine Beleuchtungsfarbe zu berechnen. Über die Fläche des Dreiecks wird diese Farbe dann interpoliert. Bei sehr hoch aufgelösten (viele kleine Dreiecke) [[Mesh]]es mag das funktionieren. Jedoch bei niedriger Auflösung sieht dies ziemlich grauenhaft aus, insbesondere da Specular-Highlights komplett verloren gehen oder verstärkt werden können. Im Bild rechts sieht man eine niedrig aufgelöste Kugel und wie die per-Vertex-Beleuchtung hier unnatürlich wirkt.&lt;br /&gt;
&lt;br /&gt;
Beim Per-Pixel-Lighting übergibt man vom Vertexshader zusätzliche die Normale des Vertex. Im Fragmentshader erhält man dann also die interpolierte Normale aller drei Vertices. Nun führt man das Phong-Modell das sonst im Vertexshader (bzw. in der festen Pipeline) ausgewertet würde einfach im Fragmentshader auf Grundlage dieser Normale durch. Man erhält also für jeden Pixel die korrekte Beleuchtung. Der hier beschriebene Shader ist in der [[Shadersammlung]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Bump-Mapping ====&lt;br /&gt;
[[Bild:shader_diffuse_bumpmapping_cg.jpg|thumb|256px|Bump-Mapping]]&lt;br /&gt;
Anstatt wie beim [[Tutorial_glsl2#Per-Pixel-Lighting|Per-Pixel-Lighting]] die Normale über das Dreieck zu interpolieren können wir auch eine sogenannte Bump-Map benutzen. Dabei kodiert man in den RGB-Farbkanälen einer Textur eine Normale. Diese können wir dann im Pixelshader auslesen und zur Berechnung der Beleuchtung verwenden. So können wir mit geringem Aufwand ein wesentlich höheres Detail vortäuschen.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: einfacher Toon-Shader ====&lt;br /&gt;
[[Bild:Cartoon.jpg|thumb|256px|Einfacher Toon-Shader]]&lt;br /&gt;
In einigen Fällen will man gar keine realistische Beleuchtung, sondern der Szene eher einen cartoon-artigen Look verpassen. In einem Cartoon werden in der Regel nur wenige Farben verwendet und Silhouetten werden durch schwarze Striche verstärkt. Ein solcher Shader ist ziemlich einfach, wenn man die Diffuse-Beleuchtung verstanden hat.&lt;br /&gt;
&lt;br /&gt;
Die Grundidee liegt in einer 1D-Textur die man als Color-Lookup verwendet. Diese Textur kann ziemlich klein sein und enthält einfach nur ein paar Grauabstufungen, zum Beispiel:&lt;br /&gt;
 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.6, 0.6, 0.6, 0.8, 0.8, 0.8&lt;br /&gt;
Anstatt die erhaltene Diffuse-Beleuchtung direkt zu verwenden, verwendet man diesen Wert der ja zwischen 0 und 1 liegt einfach als 1D-Texturkoordinate für den Color-Lookup. Dadurch bekommen wir die gewünschten groben Schattierungen.&lt;br /&gt;
&lt;br /&gt;
Wenn wir auch Silhouetten erhalten wollen berechnen wir im Fragmentshader zusätzlich auch noch das Dot-Produkt zwischen Flächennormale und Richtung zur Kamera. Liegt dieser Wert unter einer gewissen Grenze, z.B. 0.1 oder 0.2, rendern wir einfach nur schwarze Farbe. Ansonsten benutzen wir die oben beschriebene Cartoon-Beleuchtung. Dies erzeugt eine dünne schwarze Umrandung.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Terraintextur aus Layern ====&lt;br /&gt;
[[Bild:Terrain.jpg|thumb|256px|Terrain mit 3 Texturlayern]]&lt;br /&gt;
Man kann ein Heighmap-Terrain auf verschiedene Arten texturieren. Die triviale Variante legt einfach eine kachelbare Textur über das Terrain, die dann immer wiederholt wird. Das sieht natürlich scheußlich aus, also lassen wir das. Der nächste Gedanke ist einfach eine gigantische Textur (ohne Kacheln) über das Terrain zu legen. Soll diese Textur aber eine zeitgemäße Auflösung haben wäre der Speicherbedarf einfach gigantisch und würde wohl den Grafikspeicher sprengen. Man müsste diese Textur also in kleinere Stücke Teilen und diese dann bei Bedarf von der Festplatte nachladen. Funktioniert, es gibt aber auch eine einfachere Variante: Texturlayer.&lt;br /&gt;
&lt;br /&gt;
Statt nur einer einzigen kachelbaren Textur legen wir mehrere verschiedene dieser Texturen über das Terrain. Beispielsweise eine für Sand, eine für Gras und eine für Felsen. Zusätzlich haben wir eine Alphamap die sich über das gesamte Terrain legt und etwa die Auflösung der Heightmap hat. Diese Alphamap steuert nun wo wir welches Texturlayer sehen wollen. In jedem Farbkanal der Alphamap befinden sich die Werte für ein zugehöriges Layer. Im Fragmentshader brauchen wir also nur alle 4 Texturen an den richtigen Stellen auswerten und folgende Formel auswerten:&lt;br /&gt;
:&amp;lt;tt&amp;gt;gl_FragColor = alpha.r * layer0 + alpha.g * layer1 + alpha.b * layer2;&amp;lt;/tt&amp;gt;&lt;br /&gt;
Haben wir unsere Alphamap zuvor geschickt berechnet, also beispielsweise unter Einbeziehung von Terrainsteigung, Höhe, etc. erzeugen wir so eine sehr abwechslungsreiche sich nicht wiederholende Terraintextur mit quasi beliebig hoher Auflösung. Der hier beschriebene Shader ist in der [[Shadersammlung]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Geometryshader ==&lt;br /&gt;
Der Geometryshader ist Teil von Shader Model 4.0 und somit nur auf neueren Grafikkarten verfügbar. Zudem gehört er wirklich zu den fortgeschrittenen Dingen in der Computergrafik. Als Anfänger sollte man sich also vielleicht erstmal mit Vertexshader und Fragmentshader zufriedengeben.&lt;br /&gt;
&lt;br /&gt;
Der Geometryshader kann vom Prinzip die gleichen Dinge tun wie der Vertexshader, hat aber diverse Vorteile:&lt;br /&gt;
* verarbeitet man z.B. Dreiecke, kann man ein Dreieck als ganzes Verarbeiten. Man kann also gleichzeitig auf alle 3 Vertices des Dreiecks zu greifen.&lt;br /&gt;
* es gibt neben den bekannten GL_POINTS, GL_LINES und GL_TRIANGLES neue Input-Geometrietypen, z.B.: GL_TRIANGLES_ADJACENCY_EXT und GL_TRIANGLE_STRIP_ADJACENCY_EXT. Diese erlauben es nicht nur auf das aktuelle Dreieck zuzugreifen, sondern auch auf die benachbarten Dreiecke. Bei GL_TRIANGLES_ADJACENCY_EXT bekommt man dann zum Beispiel ein Array der Größe 6 für jedes Attribut des Vertex. Diese Adjazenz-Informationen müssen natürlich auch bereits so im Vertexbuffer gegeben sein.&lt;br /&gt;
* der Geometryshader stellt neue Funktionen bereit mit denen man neue Primitive zusammenbauen kann. Es gibt drei mögliche Output-Geometrietypen: GL_POINTS, GL_LINE_STRIP und GL_TRIANGLE_STRIP&lt;br /&gt;
* alle Primitive die den Geometryshader verlassen muss man selbst erzeugen. Man kann also insbesondere auch einfach keine Primitive erzeugen.&lt;br /&gt;
&lt;br /&gt;
Kommen wir zu den Nachteilen der aktuellen Implementierung:&lt;br /&gt;
* Anzahl der Output-Vertices und der Geometrietyp müssen im voraus festgelegt werden. Egal ob die Vertices erzeugt werden oder nicht wird der dafür nötige Speicher reserviert. Aus diesem Grund ist die Performance eines Geometryshaders sehr stark von dieser einmal vom Programmierer konstant festgelegten Anzahl Output-Vertices abhängig. [[#Quellen|[2]]]&lt;br /&gt;
* Der Geometryshader eignet sich nur für kleine Modifikationen, nicht für Heavy-Output Algorithmen.&lt;br /&gt;
&lt;br /&gt;
Trotz der genannten Nachteile kann man den Geometryshader durchaus sinnvoll einsetzen.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Shadow-Volumes ====&lt;br /&gt;
[[Volumetrische_Stencilschatten|Shadow-Volumes]] haben den Nachteil, dass man zusätzliche Geometrie für die Seiten des Volumes erzeugen muss. Dafür gibt es verschiedene Wege.&lt;br /&gt;
* Man kann die zusätzliche Geometrie auf der CPU erzeugen und in drei Passes (1. Frontfaces, 2. Backfaces extrudiert, 3. Seiten) rendern. Dies ist offensichtlich ineffizient.&lt;br /&gt;
* jede Kante im Mesh durch zwei degenerierte Dreiecke ersetzen. Im Vertexshader kann man dann Backfacing-Polygone extrudieren. Dies erhöht die Vertexanzahl um den Faktor 2. Die Anzahl der Dreiecke wird um den Faktor 4 erhöht.&lt;br /&gt;
* der Geometryshader erlaubt es nun die zwei benötigten Dreiecke einfach dann zu erzeugen wenn man sie benötigt. Da man zusätzlich Adjazenz-Informationen benötigt, vergrößert sich auch hier der Vertexbuffer um den Faktor 2. Allerdings bleibt die Anzahl der Dreiecke konstant und es ist nicht notwendig degenerierte Dreiecke zu rendern.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Cube-Maps / Environment-Mapping ====&lt;br /&gt;
[[Bild:Tutorial_Cubemap_cubemap0.jpg|thumb|256px|Beispiel aus dem [[Tutorial_Cubemap|Cubemap-Tutorial]]]]&lt;br /&gt;
Der Geometryshader stellt ein neues Vertexattribut ''gl_Layer'' zur Verfügung. Dieses erlaubt es zu bestimmen in welchen Framebuffer ein Dreieck gerendert werden soll. Dies kann man nun benutzen um in 6 Framebuffer gleichzeitig zu rendern. Der Geometryshader arbeitet dabei als Geometrie-Duplizierer. Da wir volle Kontrolle über die erzeugte Geometrie haben, können wir für jeden Framebuffer eine andere ModelViewProjection-Matrix zur Transformation verwenden. Man muss natürlich beachten, dass in diesem Fall das [[Frustum_Culling|Frustum-Culling]] zu einem großen Teil im Shader stattfinden muss. Aber, letztendlich kann man so in einem einzigen Durchgang alle 6 Seiten einer [[Environment_Mapping|Environment-Cubemap]] rendern!&lt;br /&gt;
&lt;br /&gt;
== Transform-Feedback ==&lt;br /&gt;
Auch [[Transform-Feedback]] ist ein Feature von Shader Model 4.0 und somit nur auf neueren Grafikkarten verfügbar. Transform-Feedback gehört ebenfalls zu den fortgeschrittenen Dingen in der Computergrafik und sei daher für Anfänger zunächst nicht zu empfehlen. In der [http://de.wikipedia.org/wiki/DirectX DirectX]-Welt ist Transform-Feedback unter der Bezeichnung ''Stream-Out'' bekannt.&lt;br /&gt;
&lt;br /&gt;
Bei diesem Feature handelt es sich ''nicht'' um einen Shader im eigentlichen Sinne. Jedoch arbeitet Transform-Feedback eng mit dem Vertexshader bzw. dem Geometryshader zusammen. Diese Funktion ermöglicht es einzelne oder alle Output-Variablen aus dem Shader abzugreifen und in ein (oder mehrere) Buffer-Objekte zu schreiben. Buffer-Objekte sind einfach nur Speicherbereiche die sich flexibel als Textur, als Vertexbuffer oder auch Indexbuffer interpretieren lassen. Immer so wie man es gerade braucht.&lt;br /&gt;
&lt;br /&gt;
Transform-Feedback stellt also eine flexiblere Alternative zu [[Tutorial_Framebufferobject|Framebuffer-Objekten]] dar. Insbesondere kann man beispielsweise gleichzeitig 32bit Float-Vektoren und Integer schreiben, was mit einem Framebuffer bisher nicht möglich ist.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil ist, dass man die Renderpipeline direkt nach dem Transform-Feedback-Schritt (also noch vor dem Cliping) auf Wunsch auch komplett abschalten kann. Insbesondere der Pixelshader wird dann gar nicht erst ausgeführt und auch nichts in den Framebuffer geschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: GPU Partikelsystem ====&lt;br /&gt;
[[Bild:Partikel-Gravitation.jpg|thumb|256px|Gravitationssimulation mit 262144 Partikeln]]&lt;br /&gt;
Mittels Transform-Feedback kann man ein Partikelsystem fast vollständig auf der Grafikkarte realisieren. Der Vorteil liegt zum Beispiel darin, dass die Partikel nicht in jedem Frame neu auf die Grafikkarte geladen werden müssen. [[GLSL Partikel 2|Dieser Artikel]] beschreibt eine solche Anwendung.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Meshanimation ====&lt;br /&gt;
Für diverse Algorithmen muss man die Szene mehrfach, zum Teil auch aus verschiedenen Perspektiven rendern. Natürlich kann man ein komplex animiertes Mesh jedes mal komplett neu berechnen. Man könnte aber auch beim ersten Durchgang die Vertexdaten abgreifen und in einen temporären Buffer schreiben. Beim nächsten Pass kann man einfach diesen Buffer als Vertexbuffer interpretieren und rendern.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: General-Purpose Computation ====&lt;br /&gt;
Transform-Feedback ist ein wichtiges Feature, wenn man auf der Grafikkarte beliebige Berechnungen durchführen will. Zwar kann man nicht alles effizient auf der GPU implementieren, aber die Anwendung muss auch nicht unbedingt mit 3D-Grafik zusammenhängen. Der Vorteil einer Grafikkarte ist, dass sie hoch parallel arbeitet, dies kann viele Algorithmen extrem beschleunigen. Diverse Beispiele gibt es auf [http://www.gpgpu.org/ gpgpu.org].&lt;br /&gt;
&lt;br /&gt;
== Wie geht es nun weiter? ==&lt;br /&gt;
Nach der Lektüre dieses Artikels sollte dir ungefähr klar sein wozu Shader gut sind und was man damit so alles anstellen kann. Solltest du dich nun dazu entschieden haben tiefer in die Materie einzusteigen, dann empfehlen wir die Lektüre der folgenden Artikel:&lt;br /&gt;
* [[Tutorial_glsl|Tutorial GLSL]]: Einstieg in die Shader-Programmierung mit GLSL&lt;br /&gt;
* [[Tutorial_glsl2|Tutorial GLSL, Anhang]]&lt;br /&gt;
* [[Shadersammlung]]&lt;br /&gt;
* [[Shader_(historisch)|Nutzung von Shadern auf alter Grafikhardware]]&lt;br /&gt;
* OpenGL-Extensions&lt;br /&gt;
** [[GL_EXT_gpu_shader4]]&lt;br /&gt;
** [[GL_ARB_geometry_shader4]]&lt;br /&gt;
** [[GL_EXT_geometry_shader4]]&lt;br /&gt;
** [[GL_EXT_transform_feedback]]&lt;br /&gt;
** [[GL_NV_transform_feedback]]&lt;br /&gt;
&lt;br /&gt;
Sollten die Artikel hier im Wiki nicht ausreichen, kann ein Blick in die offizielle Dokumentation hilfreich sein:&lt;br /&gt;
* [http://opengl.org/documentation/specs/version2.0/glspec20.pdf OpenGL 2.0 Specification] (Englisch)&lt;br /&gt;
* [http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf OpenGL Shading Language Specification v1.20.8] (Englisch)&lt;br /&gt;
* [http://opengl.org/registry/specs/EXT/gpu_shader4.txt EXT_gpu_shader4] (Englisch)&lt;br /&gt;
* [http://opengl.org/registry/specs/ARB/geometry_shader4.txt ARB_geometry_shader4] (Englisch)&lt;br /&gt;
* [http://opengl.org/registry/specs/EXT/geometry_shader4.txt EXT_geometry_shader4] (Englisch)&lt;br /&gt;
* [http://opengl.org/registry/specs/EXT/transform_feedback.txt EXT_transform_feedback] (Englisch)&lt;br /&gt;
* [http://opengl.org/registry/specs/NV/transform_feedback.txt NV_transform_feedback] (Englisch)&lt;br /&gt;
* ([http://opengl.org/documentation/specs/ weitere Dokumentation], sowie die [http://opengl.org/registry/ Extension Registry])&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
[1] [http://www.nvidia.com/object/product_geforce_gtx_295_us.html NVIDIA GeForce GTX 295]&amp;lt;br /&amp;gt;&lt;br /&gt;
[2] [http://developer.nvidia.com/object/gpu_programming_guide.html NVIDIA GeForce 8 and 9 Series GPU Programming Guide], insbesondere Abschnitt 4.6&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

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

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:AudorraLogo.png&amp;diff=24537</id>
		<title>Datei:AudorraLogo.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:AudorraLogo.png&amp;diff=24537"/>
				<updated>2010-01-10T10:01:34Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: Audorra Logo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Audorra Logo&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=DGL_Projekte&amp;diff=24536</id>
		<title>DGL Projekte</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=DGL_Projekte&amp;diff=24536"/>
				<updated>2010-01-10T10:01:04Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Bibliotheken */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=DGL Projects Corner=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Willkommen in der '''[[DelphiGL|DGL]] Projekte Ecke'''!&lt;br /&gt;
[[Bild:ProjekteEcke.jpg|center]]&lt;br /&gt;
Auf dieser Seite findet ihr Projekte von '''Mitgliedern von [http://DelphiGL.com DelphiGL.com]''',  welche als '''&amp;quot;für die Benutzung freigegeben&amp;quot;''' gewertet wurden.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|'''Rechtliches:''' Die Software wurde von Mitgliedern von DelphiGL.com in ihrer Freizeit geschrieben. Es kann deshalb für die angebotene Software keinerlei Garantie gegeben werden. Unsere Mitglieder geben allerdings ihr Bestes damit die hier angebotene Software euch Spass ohne Reue beschehrt. Aus rechtlichen Gründen gilt wie bei allen Angeboten von DelphiGL.com: Download und Nutzung auf eigene Gefahr.}}&lt;br /&gt;
&lt;br /&gt;
Falls ihr selbst Mitglied von DelphiGL.com seid und ein Projekt habt welches ihr als &amp;quot;benutzbar&amp;quot; bezeichnet (und idealerweise schon bei DelphiGL.com in der Projekte-Sektion vorgestellt habt), dann könnt ihr es hier veröffentlichen.&lt;br /&gt;
&lt;br /&gt;
==Auszeichnungen==&lt;br /&gt;
Einige Projekte wurden mit einem oder mehreren [[DGL_Award]]s ausgezeichnet. Mit dem DGL Award ehrt die DelphiGL Community vorbildliche Projekte und Engagement in der Community.&lt;br /&gt;
&lt;br /&gt;
==Spiele==&lt;br /&gt;
Viele, um nicht zu sagen die meisten, DGL-Mitglieder widmen sich dem Thema Spiele. Was dabei an respektablen Ergebnissen entstanden ist könnt ihr in dieser Rubrik sehen.&lt;br /&gt;
&lt;br /&gt;
===3D Shooter und Labyrinth Spiele===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|''Noch keine Programme''&lt;br /&gt;
|Hast du ein fertiges Projekt, was du bei DGL vorgestellt hast? Dann nichts wie her damit!&lt;br /&gt;
|''Hier könnte dein Name stehen''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Action===&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Thumb_asteroids.jpg|framed|center|Link: '''[[Projekt_Asteroids|Asteroids]]''']]&lt;br /&gt;
&lt;br /&gt;
|Asteroids ist ein Remake des alten Klassikers &amp;quot;Comet&amp;quot;. Ziel des Spiels ist es so viel Asteroiden wie möglich zu zerstören um dadurch möglichst viele Punkte zusammeln, ohne dabei von den herum fliegenden Trümmern getroffen zu werden. &lt;br /&gt;
&lt;br /&gt;
An einem Spiel können bis zu 4 Spieler gleichzeitig teilnehmen.&lt;br /&gt;
&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Magellan|Magellan]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:PE2.jpg|thumb|center|168px|Link: '''[http://ziz.delphigl.com/downloads.php Perniciei Effector]''']]&lt;br /&gt;
|Ein typischer Weltraum Shooter mit 2D Steuerung aber 3D Grafik. Ziel des Spiels ist es in der Highscore möglichst hoch zu klettern. Dies erreicht man durch die passende Auswahl des Raumschiffes zu beginn und die vielen Items, die die Gegner verlieren.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Ziz|Ziz]]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Thumb_napalmbomber.jpg|framed|center|Link: '''[http://www.saschawillems.de/?page_id=90 Napalmbomber3D Projektseite]''']]&lt;br /&gt;
&lt;br /&gt;
|NapalmBomber3D ist wie der Titel schon vermuten lässt ein 3D-Klon des bekannten Bombermanspielprinzips.Dieses hochbrisante und fesselnde Spiel besticht durch seine tolle Grafik die natürlich mittels OpenGL realisiert wurde.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zum Spiel gibt es natürlich auch noch einen Karteneditor mit dem sich in Windeseile eigenen Maps erstellen lassen.&lt;br /&gt;
&lt;br /&gt;
Neben inzwischen über 50.000 Downloads (im Schnitt sind es immernoch &amp;gt; 400 pro Monat) und diversen sehr guten Reviews hat es das Spiel sogar auf die PC-Action Ausgabe 07/2004 geschafft.&lt;br /&gt;
&lt;br /&gt;
''([[Tutorial#Spieletutorials_und_Softwareentwicklung|Hier]] findet ihr 2 Tutorials mit denen ihr dieses tolle Spielchen nachbauen könnt.)''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Sascha Willems|Sascha Willems]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Brett-, Denk- und Kartenspiele===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Projekt_Hex_Change_Screenshot.jpg|thumb|center|168px|Link: '''[[Projekt_Hex-Change|Hex-Change]]''']]&lt;br /&gt;
|2 Spieler konkurrieren um die Felder auf einer Hexagon Fläche. Das Spiel enthält einen Einzelspieler- (gegen KI) und einen &amp;quot;Hot-Seat&amp;quot;-Mehrspielermodus.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:H.A.S.E.|H.A.S.E.]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Balance.jpg|thumb|center|168px|Link: '''[[Projekt_Balance|Balance]]''']]&lt;br /&gt;
|Durch geschicktes erhöhen von Ladungen werden Kettenreaktionen ausgelöst mithilfe derer man das gesammte Spielfeld erobert. Das Spiel ist Mehrsprachig (Deutsch/Englisch) und enthält einen Einzelspieler und zwei Multiplayer-Modi (HotSeat u. LAN).&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Flash|Kevin Fleischer aka Flash]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Reaktions- und Geschicklichkeitsspiele===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Thumb_confusingball.jpg|framed|center|Link: '''[[Projekt_ConfusingBall|Confusing Ball]]''']]&lt;br /&gt;
&lt;br /&gt;
|In &amp;quot;Confusing Ball&amp;quot; steuert man einen Ball durch ein 3D Labyrinth, in dem die Gesetze der Physik neu definiert werden müssen. Um ins Ziel eines Levels zu gelangen benötigt man einen gewissen Orientierungssinn und ein gutes räumliches Vorstellungsvermögen.&lt;br /&gt;
Nebenher muss man ja auch noch die Münzen einsammeln, und den Bomben aus dem Weg gehen. Frei verschiebbare Steine erhöhen den Schwierigkeitsgrad.  &lt;br /&gt;
&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:MatReno|MatReno]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Thumb_beanmachine.jpg|framed|center|Link: '''[http://www.saschawillems.de/?page_id=86 Bean Machine Projektseite]''']]&lt;br /&gt;
&lt;br /&gt;
|&amp;quot;Bean Machine&amp;quot; basiert auf dem Sega MegaDrive-Klassiker &amp;quot;Dr.Robotnik's Mean Bean Machine&amp;quot; (ausserhalb Europas auch als &amp;quot;Puyo Puyo&amp;quot; bekannt) und spielt sich somit ähnlich wie Tetris.&lt;br /&gt;
Auch dieses Klassikerremake spielt sich fast genauso wie die Vorlage, allerdings gibt es dank OpenGL recht aufwendige Grafiken, natürlich gewohnt komplett in 3D.&lt;br /&gt;
&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Sascha Willems|Sascha Willems]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Heiliger Damm.jpg|thumb|center|168px|Link: '''[[Projekt Heiliger_Damm|Heiliger Damm]]''']]&lt;br /&gt;
&lt;br /&gt;
|&amp;quot;Heiliger Damm&amp;quot; ist ein Geschicklichkeitsspiel passend zum G8-Treffen 2007 in Heiligendamm. Der Spieler übernimmt die Aufgabe, den &amp;quot;heiligen Damm&amp;quot; (eine Oase in der Wüste) vor den Globalisierungsgegner zu schützen. Dies erreicht er, indem er mit der Maus Linien (Zäune) zieht.&lt;br /&gt;
&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:GTA-Place|Fabian Gärtner / GTA-Place]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Simulationen===&lt;br /&gt;
====Wirtschaftssimulationen/Manager====&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:PBM2_Kdr.jpg|thumb|center|168px|Link: '''[[Projekt_PBM2|PBall Manager 2]]''']]&lt;br /&gt;
&lt;br /&gt;
|Der PBall Manager 2 ist ein Sportmanager in welchem man in die Rolle des Trainers/Managers eines von 96 PBall Teams aus ganz Europa schlüpft. PBall selbst ist eine fiktive Sportart welche ähnlich Fußball ist.&lt;br /&gt;
&lt;br /&gt;
Im Spiel hat man die Kontrolle über alle Abläufe: Von der Aufstellung über Spielerkäufe bis hin zum Stadionausbau liegt alles in der Hand des Spielers. Doch auch die eigene Karriere kann voran getrieben werden indem man zu anderen Clubs wechselt.&lt;br /&gt;
&lt;br /&gt;
Das Ziel aller PBaller ist der Liga-Meister-Pokal indem die besten Clubs der 4 Europäischen Ligen um den Titel spielen.&lt;br /&gt;
&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Flash|Kevin Fleischer alias Flash]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Flugsimulationen====&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|''Noch keine Programme''&lt;br /&gt;
|Hast du ein fertiges Projekt, was du bei DGL vorgestellt hast? Dann nichts wie her damit!&lt;br /&gt;
|''Hier könnte dein Name stehen''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Rennsimulationen====&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|''Noch keine Programme''&lt;br /&gt;
|Hast du ein fertiges Projekt, was du bei DGL vorgestellt hast? Dann nichts wie her damit!&lt;br /&gt;
|''Hier könnte dein Name stehen''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:planeto7.jpg|thumb|center|168px|Link: '''[http://nilsbeckmann.de/ Planeto]''']]&lt;br /&gt;
&lt;br /&gt;
|Planeto ist ein rundenbasiertes Science-Fiction Strategiespiel. Du landest auf einem unbekannten Planeten. Deine Aufgabe ist es, diesen zu erkunden, Rohstoffe zu sichern und die militärische Vorherrschaft zu behaupten. Spieler können gegen Computerspieler antreten oder untereinander simultan übers Netzwerk und Internet. Zur Auswahl stehen mehr als 400 Einheiten, Forschungen und Aufwertungen.&lt;br /&gt;
&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Nils Beckmann|Nils Beckmann]]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:projektw_wiki_projektecke.jpg|thumb|center|168px|Link: '''[http://www.saschawillems.de/?page_id=114 Projekt &amp;quot;W&amp;quot;]''']]&lt;br /&gt;
&lt;br /&gt;
|Projekt &amp;quot;W&amp;quot; ist ein runden-basierendes Strategiespiel, dessen Ziel die Erlangung der Weltherrschaft ist. Der Spieler kann sich für eine der fünf neuen großen Nationen entscheiden, und muss diese dann zum Sieg über alle anderen Nationen führen.&lt;br /&gt;
&lt;br /&gt;
Dazu muss man seine Regionen verwalten, dort Gebäude bauen und auf wichtige Faktoren achten. Man baut zudem militärische Einheiten und gliedert diese in Divisionen um damit das eigene Territorium zu verteidigen, bzw. gegnerische Regionen einzunehmen. Zusätzlich kann man Technologien erforschen, die u.A. neue Gebäude und Militäreinheiten freischalten. Auch Spionage und Sabotage spielen eine wichtige Rolle, so kann man z.B. mit Hilfe eines eingeschleusten Spions an wichtige Informationen gelangen oder die Stromversorgung einer Region lahmlegen.&lt;br /&gt;
&lt;br /&gt;
Neben dem Einzelspielermodus, in dem man gegen die KI bestehen muss, gibt es auch einen Hotseatmodus, bei dem mehrere Spieler an einem Rechner gegeneinander antreten können. Präsentiert wirds wie gewohnt in schicker 3D-Grafik, und auf passender Hardware wird das Ganze noch mit Shadern garniert.&lt;br /&gt;
&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Sascha Willems|Sascha Willems]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Effekte==&lt;br /&gt;
Für den optischen Anspruch eines Spiels haben Spezialeffekte große Bedeutung. Was beim einfachen Feuer beim Abschießen einer virtuellen Kugel anfängt, kann sich über plastischen Nebel bis zu imposanten, realistischen Blitzen ziehen.&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Pic6.jpg|thumb|center|168px|Link: '''[http://sourceforge.net/projects/fireblade/ FireBlade]''']]&lt;br /&gt;
&amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Project_OTY08.png|center&lt;br /&gt;
rect 0 0 100 40 [[DGL_Award#Best_Project_Award]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt;&lt;br /&gt;
|FireBlade ist ein flexibles und leistungsstarkes Partikelsystem auf OpenGL-Basis. Sie ist sehr effizient im Bezug auf Tiefensortierung, Speichermanagement, Ansprechbarkeit und Erweiterbarkeit, und lässt sich durch die Art und Weise, wie Effekte beschrieben werden, sehr gut vor allem in größere Projekte einbringen. Dabei eignet sie sich sowohl für 2D als auch für 3D-Anwendungen. Highlights sind zum Beispiel die integrierte, problemlos erweiterbare Kollisionsabfrage, ein breites, ebenfalls erweiterbares Emitter-Set und ein einfacher, aber sehr effizienter Manager, der die Performance gerade für viele Effekte enorm steigern kann. Alle Eigenschaften, selbst die Textur- und Raumkoordinaten der einzelnen Billboard-Vertices sind manipulierbar.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Kyro|Sebastian Wagner alias Kyro]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Bibliotheken==&lt;br /&gt;
Diese Rubrik enthält Bibliotheken, die die Grafikprogrammierung vereinfachen und dem Spiele-/Anwendungsentwickler helfend unter die Arme greifen.&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:AndorraLogo.png|thumb|center|168px|Link: '''[http://andorra.sourceforge.net/ Andorra 2D]''']]&lt;br /&gt;
&amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Useful_OTY08.png|center&lt;br /&gt;
rect 0 0 100 40 [[DGL_Award#Most_Useful_Project_Award]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt;&lt;br /&gt;
|Andorra 2D ist eine flexible Lösung um 2D-Spiele oder Anwendungen zu entwickeln. Durch den durchdachten Aufbau des Engine-Kerns ist Andorra 2D komplett von der Grafikschnittstelle und dem Betriebssystem getrennt. Eine Anbindung an OpenGL und Direct3D, sowie Unterstützung für Windows und Linux 32/64 Bit sind gegeben. Andorra 2D ist einfach zu verwenden und erlaubt es auch Einsteigern schnell erste Ergebnisse auf den Bildschirm auszugeben. Andererseits wendet es sich mit Features wie Shadern auch an fortgeschrittene Benutzer.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Igel457|Andreas Stöckel alias Igel457]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:AudorraLogo.png|thumb|center|168px|Link: '''[http://audorra.sourceforge.net/ Audorra]''']]&lt;br /&gt;
|Audorra ist eine Bibliothek zur Wiedergabe von 3D-Positionalem Audio und vor allem für den Einsatz in Spielen gedacht. Durch den modularen Aufbau kann es - die richtigen Audio-Backends (&amp;quot;Driver&amp;quot;) und Decoder vorrausgesetzt - auf fast jeder Plattform eingesetzt werden. Der verwendete 3D-Audio-Softwarerenderer garantiert gleiche Ergbnisse und unterstützt Effekte wie Phasenverschiebung und Dopplereffekt. Mehr über das Projekt gibt es auch im [http://www.delphigl.com/forum/viewtopic.php?f=13&amp;amp;t=8819 Forumsthread] zu erfahren.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Benutzer:Igel457|Andreas Stöckel alias Igel457]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Diese Rubrik enthält Werkzeuge, die man benutzt um Inhalte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;|Name&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Macher&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:Beei.png|thumb|center|168px|Link: '''[http://projects.blender.org/projects/beei/ Blender External Engine Interface]''']]&lt;br /&gt;
|BEEI steht für Blender External Engine Interface und dient als Schnittstelle für externe Renderer und Gameengines.&lt;br /&gt;
Der externe Renderer oder Gameengine muss in Form einer .dll oder .so Datei vorliegen und die von der Schnittstelle erwarteten Funktionen bieten. Das Plugin wird dann von Blender geladen und befindet sich dann im Speicher von Blender.&lt;br /&gt;
Nun kann man z.B. mit OpenGL Renderbefehle ausführen und diese werden dann im Space von Blender dargestellt.&lt;br /&gt;
Man hat zugriff auf die Blender Daten und kann sie lesen oder schreiben, wobei das Lesen die sichere Art ist und zum schreiben Python und BEEI Boardmittel verwendet werden sollten. Das Testplugin ist ein frühes Framework von Karmarama.&lt;br /&gt;
Es zeigt die Blenderdaten wie der interne Blenderrenderer mit der ausnahme, dass ein Entity mit dem Namen Glow als Pfeil dargestellt wird. BEEI bietet neben der schnittstelle noch zugriff auf die Blender UI elemente, um eigene Toolfenster zu erstellen. Der tiefere Sinn liegt im WYSIWYG und erlaubt ein wesentlich leichteres erstellen von Content aller Art.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|Thomas Kunze&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=alSource&amp;diff=24333</id>
		<title>alSource</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=alSource&amp;diff=24333"/>
				<updated>2009-11-24T14:48:36Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* AL_REFERENCE_DISTANCE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig|Die Beschreibung zu den Auswirkungen des Funktionsparameters ''param'' muss noch ergänzt werden. Als Grundlage kann die [http://www.openal.org/documentation.html Open AL-Dokumentation] dienen.}}&lt;br /&gt;
= alSource =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''alSource''' - Setzt Eigenschaften eines Source-Objektes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''alSourcef'''(''source'': TALuint; ''param'': TALenum; ''value'': TALfloat);&lt;br /&gt;
 procedure '''alSource3f'''(''source'': TALuint; ''param'': TALenum; ''v1'': TALfloat; ''v2'': TALfloat; ''v3'': TALfloat);&lt;br /&gt;
 procedure '''alSourcefv'''(''source'': TALuint; ''param'': TALenum; ''values'': PALfloat);&lt;br /&gt;
 procedure '''alSourcei'''(''source'': TALuint; ''param'': TALenum; ''value'': TALint);&lt;br /&gt;
 procedure '''alSource3i'''(''source'': TALuint; ''param'': TALenum; ''v1'': TALint; ''v2'': TALint; ''v3'': TALint);&lt;br /&gt;
 procedure '''alSourceiv'''(''source'': TALuint; ''param'': TALenum; ''values'': PALint);&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;
! ''source'' &lt;br /&gt;
| Name des Source-Objektes, dessen Eigenschaft geändert werden soll&lt;br /&gt;
|-&lt;br /&gt;
! ''param'' &lt;br /&gt;
| Symbolische Konstante, welche die zu setzende Eigenschaft angibt&lt;br /&gt;
|-&lt;br /&gt;
! ''value'' &lt;br /&gt;
|  TALfloat-/ TALint-Wert, der gesetzt werden soll (nur bei '''alSourcef''' bzw. '''alSourcei''')&lt;br /&gt;
|-&lt;br /&gt;
! ''values'' &lt;br /&gt;
|  Zeiger auf einen TALfloat-/ TALint-Vektor, welcher die zu setzenden Werte enthält (nur bei '''alSourcefv''' und '''alSourceiv''')&lt;br /&gt;
|-&lt;br /&gt;
! ''v1, v2, v3'' &lt;br /&gt;
|  TALfloat-/ TALint-Werte, welche die zu setzenden Werte angeben (nur bei '''alSource3f''' und '''alSource3i''')&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
Die Funktion '''alSource''' bzw. ihre Varianten für verschiedene Wertargumente setzen Eigenschaften eines Source-Objektes der [[OpenAL]]. Welche Eigenschaft gesetzt wird, hängt vom Wert des Parameters ''param'' ab.&lt;br /&gt;
&lt;br /&gt;
Folgende Werte sind für ''param'' zulässig:&lt;br /&gt;
=== AL_BUFFER ===&lt;br /&gt;
: Legt den aktuellen Puffer fest und macht ihn zum ersten Eintrag in der Pufferwarteschlange des Source-Objektes. Der Vorgabewert ist '''AL_NONE''', zulässige Werte sind alle gültigen Puffernamen (siehe dazu auch [[alIsBuffer]]). Wird '''alSource''' mit dem Parameter '''AL_BUFFER''' auf ein Source-Objekt im Zustand '''AL_INITIAL''' oder '''AL_STOPPED''' angewendet, so wird die gesamte Pufferwarteschlange geleert und der angegebene Puffer an das Source-Objekt angehangen.&lt;br /&gt;
&lt;br /&gt;
: Für ein Source-Objekt im Zustand '''AL_PLAYING''' oder '''AL_PAUSED''' wird der Versuch, mit '''AL_BUFFER''' einen Wert zu setzen, den Fehlerstatus '''AL_INVALID_OPERATION''' setzen. '''AL_BUFFER''' kann nur auf Source-Objekte im Zustand '''AL_STOPPED''' oder '''AL_INITIAL''' angewendet werden. Die Angabe eines ungültigen Puffernamens, sei es weil dieser Puffer nicht existiert oder nicht an das Source-Objekt angehängt werden kann, setzt den Fehlerstatus '''AL_INVALID_VALUE''', während die Angabe eines ungültigen Source-Objektes den Fehlerstatus '''AL_INVALID_NAME''' zur Folge hat.&lt;br /&gt;
&lt;br /&gt;
: '''AL_NONE''' ('''nil''' oder 0) ist ein gültiger Puffername. Der Aufruf alSourcei(sourceName, AL_BUFFER, AL_NONE) ist eine zulässige Möglichkeit, die aktuelle Pufferwarteschlange eines Source-Objektes freizugeben, egal ob die Pufferwarteschlange nur einen Eintrag (den aktuellen Puffer) oder mehrer hat. Jedoch verursacht der Funktionsaufruf alSourcei(sourceName, AL_BUFFER, AL_NONE) immer noch einen '''AL_INVALID_OPERATION'''-Fehlerstatus für ein im Zustand '''AL_PLAYING''' oder '''AL_PAUSED''' befindliches Source-Objekt und kann folgerichtig nicht genutzt werden, um ein Source-Objekt anzuhalten (siehe dazu [[alSourceStop]]) oder stummzuschalten. Der Paramater '''AL_BUFFER''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_BYTE_OFFEST ===&lt;br /&gt;
: Legt die Abpspielposition, ausgedrückt in Bytes, fest. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Im Falle eines komprimierten Audioformates kann es sein, dass dieser Wert nur einen genäherten Wert innerhalb der komprimierten Daten angibt. Wird das Offset für ein Source-Objekt gesetzt, welches gerade Audiodaten abspielt, springt die Wiedergabe zur neuen Position, es sei denn der angegebene Wert ist außerhalb des zulässigen Bereichs, wodurch ein '''AL_INVALID_VALUE'''-Fehler generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Ein Aufruf von [[alSourceStop]], [[alSourceRewind]] oder ein zweiter Aufruf von [[alSourcePlay]] setzt das Offset zurück auf den Anfang des Puffers. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Zulässige Werte sind Werte größer oder gleich null, ein Vorgabewert ist nicht festgelegt. '''AL_BYTE_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_INNER_ANGLE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_OUTER_ANGLE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_OUTER_GAIN ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_DIRECTION ===&lt;br /&gt;
: Legt die Ausrichtung eines Source-Objektes fest. Falls der '''AL_DIRECTION'''-Wert ungleich dem Nullvektor ist, so handelt es sich um ein gerichtetes Source-Objekt. Die Geräuschemission wird als symmetrisch um den Richtungsvektor herum angenommen (Zylindersymmetrie). Der Nullvektor ist der Vorgabewert, wodurch angegeben wird, dass das Source-Objekt nicht gerichtet ist. Das Setzen eines vom Nullvektor verschiedenen, dreidimensionalen Vektors macht aus dem Source-Objekt ein gerichtetes Objekt; das Setzen des Nullvektors für ein gerichtetes Source-Objekt macht es zu einem ungerichteten Source-Objekt. Zulässig sind alle Werte außer [[NaN]]. Der Parameter '''AL_DIRECTION''' ist nur für die Funktionsvarianten '''alSourcefv''', '''alSource3f''', '''alSourceiv''' und '''alSource3i''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_GAIN ===&lt;br /&gt;
: Legt den skalaren Amplitudenmultiplikator für das Source-Objekt fest. Der Vorgabewert 1.0 bedeutet, dass die Geräusche ungedämpft sind. Ein Wert von 0.5 ist äquivalent zu einer Abschwächung von 6 dB. Der Wert null entspricht Stille. Die Implementierung ist dafür verantwortlich, artefaktfreie (d.h. klickgeräuschfreie) Änderungen des Wertes zu ermöglichen und kann daher die tatsächliche Änderung des Wertes innerhalb gewisser, akzeptabler Grenzen verzögern. Werte größer als eins sind zwar zulässig, jedoch steht es der Implementierung frei, Werte größer als 1,0 auf 1,0 herunterzuregeln, um einen möglichen Überlauf zu vermeiden. '''AL_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_LOOPING ===&lt;br /&gt;
: Legt fest, ob das Source-Objekt nicht in den Zustand '''AL_STOPPED''' wechselt, sobald es das Ende des letzten Puffers in der Pufferwarteschlange erreicht hat. In diesem Fall ist der Wert '''AL_TRUE''' zu setzen, andernfalls '''AL_FALSE'''. Der Vorgabewert für '''AL_LOOPING''' ist '''AL_FALSE'''. Ist das '''AL_LOOPING'''-Flag auf '''AL_TRUE''' gesetzt, so wechselt das Source-Objekt beim Erreichen des Endes der Pufferwarteschlange sofort wieder in den Zustand '''AL_INITIAL''' und danach in den Zustand '''AL_PLAYING''', um die Audiodaten in den zugehörigen Puffern erneut abzuspielen. Das '''AL_LOOPING'''-Flag für ein Source-Objekt kann in jedem Ausführungszustand, besonders auch im Zustand '''AL_PLAYING''', geändert werden. Zulässige Werte sind '''AL_TRUE''' und '''AL_FALSE'''. Der Paramater '''AL_LOOPING''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' als Paramater zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_MAX_DISTANCE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_MAX_GAIN ===&lt;br /&gt;
: Setzt den maximalen, erlaubten '''AL_GAIN'''-Wert für das Source-Objekt. Der Vorgabewert ist 1.0, zulässig sind alle Gleitkommawerte aus dem Intervall von 0,0 bis 1,0. Am Ende der Varabrebitung verschiedener Abschwächungs- oder Verstärkungsfaktoren wie der entfernungsbasierten Abschwächung und dem '''AL_GAIN'''-Wert des Source-Objektes wird der berechnete Effektivwert mit dem '''AL_MAX_GAIN'''-Wert verglichen. Falls der berechnete Wert größer ist als der '''AL_MAX_GAIN'''-Wert, dann wird der '''AL_MAX_GAIN'''-Wert angewendet. Dies geschieht jedoch, bevor der '''AL_GAIN'''-Wert des Listener-Objektes in Betracht gezogen wird. Wenn das Produkt aus '''AL_MAX_GAIN''' und dem '''AL_GAIN'''-Wert des Listener-Objektes immer noch den maximalen Wert, welchen die Implementierung handhaben kann, überschreitet, so steht es der Implementierung frei, den Wert zu reduzieren. Falls für '''AL_MAX_GAIN''' der Wert null gesetzt wird, so ist das Source-Objekt quasi stummgeschalten. Die vorgesehene Art, ein Source-Objekt stummzuschalten, ist jedoch, den '''AL_GAIN'''-Wert auf null zu setzen. Der Parameter '''AL_MAX_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_MIN_GAIN ===&lt;br /&gt;
: Legt den minimalen '''AL_GAIN'''-Wert fest, welcher für das Source-Objekt immer gewährleistet sein soll. Der Vorgabewert ist 0.0, zulässig sind alle Werte aus dem Intervall von 0,0 bis 1,0. Am Ende der Verarbeitung verschiedener Abschwächungsfaktoren wie der entfernungsbasierten Abschwächung und dem '''AL_GAIN'''-Wertes des Source-Objektes wird der berechnete Effektivwert mit dem '''AL_MIN_GAIN'''-Wert verglichen. Falls der berechnete Wert kleiner ist als '''AL_MIN_GAIN''', so wird der Wert von '''AL_MIN_GAIN''' angewendet. Dies passiert jedoch, bevor der '''AL_GAIN'''-Wert des Listener-Objektes angewendet wird. Wenn der für '''AL_MIN_GAIN''' gesetzte Wert null ist, so wird keine Korrektur vorgenommen. Der Parameter '''AL_MIN_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_PITCH ===&lt;br /&gt;
: Setzt die Verschiebung der Tonhöhe/ Frequenz des Source-Objektes. Ein Wert von 1,0 entspricht der Identität (d.h. keine Verschiebung), dies ist auch der Vorgabewert. Jede Reduzierung des Wertes um 50% entspricht einer Verschiebung um 12 Halbtöne bzw. eine Oktave nach unten. Jede Verdopplung des Wertes entspricht einer Verschiebung von 12 Halbtönen bzw. einer Oktave nach oben. Null ist kein zulässiger Wert, alle Gleitkommawerte größer als null sind erlaubt. Jede Implementierung kann die '''AL_PITCH'''-Werte aber entsprechend ihrer eigenen Limitationen beschränken. '''AL_PITCH''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' als Parameter zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_POSITION ===&lt;br /&gt;
: Setzt die aktuelle Position des Source-Objektes im Weltkoordinatensystem. Der Standardwert ist (0.0, 0.0, 0.0). '''AL_POSITION''' darf ''nicht'' in '''alSourcei''' oder '''alSourcef''' benutzt werden sondern nur in den Funktionsvarianten für mehrere Wertargumente, also '''alSource3f''', '''alSource3i''', '''alSourcefv''' oder '''alSourceiv'''. Erlaubt ist jedes Tripel von Fließkommawerten mit Ausnahme von [[NaN]]. Es ist nicht definiert, wie sich die Implementation verhält, falls [[NaN]] oder ein unendlicher Wert gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== AL_REFERENCE_DISTANCE ===&lt;br /&gt;
: '''AL_REFERENCE_DISTANCE''' beschreibt den Abstand, bei dem der Verstärkungsfaktor der Audioquelle genau 1 beträgt.&lt;br /&gt;
&lt;br /&gt;
=== AL_ROLLOFF_FACTOR ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_SAMPLE_OFFSET ===&lt;br /&gt;
: Legt die Abspielposition fest, wobei diese Position in Samples ausgedrückt wird. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Bei Verwendung eines komprimierten Formates gibt dieser Wert das exakte Offset innerhalb der unkomprimierten Daten an. Wenn '''AL_SAMPLE_OFFSET''' für ein Source-Objekt, welches gerade Audiodaten abspielt, gesetzt wird, so springt die Wiedergabe zur angegebenen Position, es sei denn das neue Offset ist außerhalb des zulässigen Bereiches, wodurch ein '''AL_INVALID_VALUE'''-Fehlerstatus generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Ein Aufruf von [[alSourceStop]], [[alSourceRewind]] oder ein zweiter Aufruf von [[alSourcePlay]] setzt das Offset zurück auf den Anfang des Puffers. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Zulässige Werte sind alle Werte größer oder gleich null, ein Vorgabewert ist nicht festgelegt. '''AL_SAMPLE_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SEC_OFFSET ===&lt;br /&gt;
: Legt die Abspielposition fest, wobei diese Position in Sekunden ausgedrückt wird. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Wenn '''AL_SEC_OFFSET''' für ein Source-Objekt, welches gerade Audiodaten abspielt, gesetzt wird, so springt die Wiedergabe zur angegebenen Position, es sei denn das neue Offset ist außerhalb des zulässigen Bereiches, wodurch ein '''AL_INVALID_VALUE'''-Fehlerstatus generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Der Wert basiert auf der Byteposition, sodass ein mit '''AL_PITCH''' verändertes Source-Objekt eine überspitzte Abspielgeschwindigkeit hat. Zum Beispiel kann ein Puffer ein Offset von 0,50 Sekunden haben, jedoch dauert es nur 0,25 Sekunden, dahin zu gelangen, wenn der '''AL_PITCH'''-Wert auf 2,0 gesetzt ist. Für das Setzen des Offsets ist jeder Wert größer gleich 0,0 zulässig, ein Vorgabewert ist nicht definiert. Der Parameter '''AL_SEC_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SOURCE_RELATIVE ===&lt;br /&gt;
: Legt fest, ob die Position, Geschwindigkeit, Richtung und der Schallkegel relativ zum Listener-Objekt interpretiert werden oder nicht. Bei einem Wert von '''AL_TRUE''' sind die Angaben relativ zu sehen, bei '''AL_FALSE''' nicht. Vorgabewert ist '''AL_FALSE'''. '''AL_SOURCE_RELATIVE''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' als Parameterwert zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SOURCE_STATE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_VELOCITY ===&lt;br /&gt;
: Setzt die Geschwindigkeit (Schnelligkeit und Richtung) des Source-Objektes im Koordinatensystem. Jedes Tripel aus gültigen Gleitkommawerten ist erlaubt, abgesehen von [[NaN]]. Der Vorgabewert ist (0.0, 0.0, 0.0). Die Geschwindigkeit beeinflußt jedoch nicht die Position des Objektes. [[OpenAL]] berechnet die Geschwindigkeit nicht aus aufeinanderfolgenden Änderungen mit '''AL_POSITION''', ebenso wenig wird die Position des Objektes über die Zeit anhand der angegebenen Geschwindigkeit angepasst. Jede derartige Berechnung bleibt der Anwendung überlassen. Für die Belange der Soundverarbeitung sind Position und Geschwindigkeit unabhängige Parameter, die sich auf verschiedene Aspekte des Klangs auswirken. '''AL_VELOCITY''' wird von Treiber berücksichtigt, um den vom Hörer wahrgenommenen Dopplereffekt zu berechnen, was auf Grundlage der Geschwindigkeit des Source-Objektes, des Listener-Objektes und der dopplereffektbezogenen Paramater geschieht. '''AL_VELOCITY''' ist nur für die Funktionsvarianten '''alSourcefv''', '''alSource3f''', '''alSourceiv''' und '''alSource3i''' als Paramater zulässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Falls bei der Ausführung ein Fehler auftritt, kann dieser mit [[alGetError]] erfragt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
Folgende Erweiterungen hat die Funktion erfahren:&lt;br /&gt;
=== Ab OpenAL-Version 1.1 ===&lt;br /&gt;
&lt;br /&gt;
Seit OpenAL-Version 1.1 existieren auch die Funktionen für mehrere Ganzzahlwerte, '''alSource3i''' und '''alSourceiv'''.&lt;br /&gt;
&lt;br /&gt;
Ebenso sind die Token '''AL_BYTE_OFFSET''', '''AL_SAMPLE_OFFSET''' und '''AL_SEC_OFFSET''' erst ab Version 1.1 verfügbar. Jedoch gibt es dafür auch die OpenAL-Erweiterung '''AL_EXT_OFFSET''', welche von jeder Implementation der Open AL 1.1 unterstützt wird und es einer für die Spezifikation von OpenAL 1.0 geschriebenen aber auf eine Implementation der Version 1.1 zugreifenden Anwendung erlaubt, die drei genannten Tokenwerte auch zum Setzen (und Abfragen) der entsprechenden Werte zu nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''AL_INVALID_ENUM''' wird generiert, wenn der Wert für ''param'' unzulässig ist.&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_NAME''' wird generiert, sofern ''source'' kein gültiges Source-Objekt ist. (Siehe auch [[alIsSource]].)&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_OPERATION''' wird generiert, falls es keinen aktuellen Kontext gibt. (Siehe dazu auch [[alcMakeContextCurrent]].)&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_VALUE''' wird generiert, wenn der zu setzenden Wert den zulässigen Bereich überschreitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zugehörige Wertrückgaben ==&lt;br /&gt;
[[alGetSource]] mit den oben genannten Tokenwerten liefert die gesetzten Werte zurück.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[alGetSource]], [[alListener]] (analoge Funktion für Listener-Objekte)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AL|Source]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=alSource&amp;diff=24332</id>
		<title>alSource</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=alSource&amp;diff=24332"/>
				<updated>2009-11-24T14:47:37Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* AL_REFERENCE_DISTANCE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig|Die Beschreibung zu den Auswirkungen des Funktionsparameters ''param'' muss noch ergänzt werden. Als Grundlage kann die [http://www.openal.org/documentation.html Open AL-Dokumentation] dienen.}}&lt;br /&gt;
= alSource =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''alSource''' - Setzt Eigenschaften eines Source-Objektes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''alSourcef'''(''source'': TALuint; ''param'': TALenum; ''value'': TALfloat);&lt;br /&gt;
 procedure '''alSource3f'''(''source'': TALuint; ''param'': TALenum; ''v1'': TALfloat; ''v2'': TALfloat; ''v3'': TALfloat);&lt;br /&gt;
 procedure '''alSourcefv'''(''source'': TALuint; ''param'': TALenum; ''values'': PALfloat);&lt;br /&gt;
 procedure '''alSourcei'''(''source'': TALuint; ''param'': TALenum; ''value'': TALint);&lt;br /&gt;
 procedure '''alSource3i'''(''source'': TALuint; ''param'': TALenum; ''v1'': TALint; ''v2'': TALint; ''v3'': TALint);&lt;br /&gt;
 procedure '''alSourceiv'''(''source'': TALuint; ''param'': TALenum; ''values'': PALint);&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;
! ''source'' &lt;br /&gt;
| Name des Source-Objektes, dessen Eigenschaft geändert werden soll&lt;br /&gt;
|-&lt;br /&gt;
! ''param'' &lt;br /&gt;
| Symbolische Konstante, welche die zu setzende Eigenschaft angibt&lt;br /&gt;
|-&lt;br /&gt;
! ''value'' &lt;br /&gt;
|  TALfloat-/ TALint-Wert, der gesetzt werden soll (nur bei '''alSourcef''' bzw. '''alSourcei''')&lt;br /&gt;
|-&lt;br /&gt;
! ''values'' &lt;br /&gt;
|  Zeiger auf einen TALfloat-/ TALint-Vektor, welcher die zu setzenden Werte enthält (nur bei '''alSourcefv''' und '''alSourceiv''')&lt;br /&gt;
|-&lt;br /&gt;
! ''v1, v2, v3'' &lt;br /&gt;
|  TALfloat-/ TALint-Werte, welche die zu setzenden Werte angeben (nur bei '''alSource3f''' und '''alSource3i''')&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
Die Funktion '''alSource''' bzw. ihre Varianten für verschiedene Wertargumente setzen Eigenschaften eines Source-Objektes der [[OpenAL]]. Welche Eigenschaft gesetzt wird, hängt vom Wert des Parameters ''param'' ab.&lt;br /&gt;
&lt;br /&gt;
Folgende Werte sind für ''param'' zulässig:&lt;br /&gt;
=== AL_BUFFER ===&lt;br /&gt;
: Legt den aktuellen Puffer fest und macht ihn zum ersten Eintrag in der Pufferwarteschlange des Source-Objektes. Der Vorgabewert ist '''AL_NONE''', zulässige Werte sind alle gültigen Puffernamen (siehe dazu auch [[alIsBuffer]]). Wird '''alSource''' mit dem Parameter '''AL_BUFFER''' auf ein Source-Objekt im Zustand '''AL_INITIAL''' oder '''AL_STOPPED''' angewendet, so wird die gesamte Pufferwarteschlange geleert und der angegebene Puffer an das Source-Objekt angehangen.&lt;br /&gt;
&lt;br /&gt;
: Für ein Source-Objekt im Zustand '''AL_PLAYING''' oder '''AL_PAUSED''' wird der Versuch, mit '''AL_BUFFER''' einen Wert zu setzen, den Fehlerstatus '''AL_INVALID_OPERATION''' setzen. '''AL_BUFFER''' kann nur auf Source-Objekte im Zustand '''AL_STOPPED''' oder '''AL_INITIAL''' angewendet werden. Die Angabe eines ungültigen Puffernamens, sei es weil dieser Puffer nicht existiert oder nicht an das Source-Objekt angehängt werden kann, setzt den Fehlerstatus '''AL_INVALID_VALUE''', während die Angabe eines ungültigen Source-Objektes den Fehlerstatus '''AL_INVALID_NAME''' zur Folge hat.&lt;br /&gt;
&lt;br /&gt;
: '''AL_NONE''' ('''nil''' oder 0) ist ein gültiger Puffername. Der Aufruf alSourcei(sourceName, AL_BUFFER, AL_NONE) ist eine zulässige Möglichkeit, die aktuelle Pufferwarteschlange eines Source-Objektes freizugeben, egal ob die Pufferwarteschlange nur einen Eintrag (den aktuellen Puffer) oder mehrer hat. Jedoch verursacht der Funktionsaufruf alSourcei(sourceName, AL_BUFFER, AL_NONE) immer noch einen '''AL_INVALID_OPERATION'''-Fehlerstatus für ein im Zustand '''AL_PLAYING''' oder '''AL_PAUSED''' befindliches Source-Objekt und kann folgerichtig nicht genutzt werden, um ein Source-Objekt anzuhalten (siehe dazu [[alSourceStop]]) oder stummzuschalten. Der Paramater '''AL_BUFFER''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_BYTE_OFFEST ===&lt;br /&gt;
: Legt die Abpspielposition, ausgedrückt in Bytes, fest. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Im Falle eines komprimierten Audioformates kann es sein, dass dieser Wert nur einen genäherten Wert innerhalb der komprimierten Daten angibt. Wird das Offset für ein Source-Objekt gesetzt, welches gerade Audiodaten abspielt, springt die Wiedergabe zur neuen Position, es sei denn der angegebene Wert ist außerhalb des zulässigen Bereichs, wodurch ein '''AL_INVALID_VALUE'''-Fehler generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Ein Aufruf von [[alSourceStop]], [[alSourceRewind]] oder ein zweiter Aufruf von [[alSourcePlay]] setzt das Offset zurück auf den Anfang des Puffers. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Zulässige Werte sind Werte größer oder gleich null, ein Vorgabewert ist nicht festgelegt. '''AL_BYTE_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_INNER_ANGLE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_OUTER_ANGLE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_OUTER_GAIN ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_DIRECTION ===&lt;br /&gt;
: Legt die Ausrichtung eines Source-Objektes fest. Falls der '''AL_DIRECTION'''-Wert ungleich dem Nullvektor ist, so handelt es sich um ein gerichtetes Source-Objekt. Die Geräuschemission wird als symmetrisch um den Richtungsvektor herum angenommen (Zylindersymmetrie). Der Nullvektor ist der Vorgabewert, wodurch angegeben wird, dass das Source-Objekt nicht gerichtet ist. Das Setzen eines vom Nullvektor verschiedenen, dreidimensionalen Vektors macht aus dem Source-Objekt ein gerichtetes Objekt; das Setzen des Nullvektors für ein gerichtetes Source-Objekt macht es zu einem ungerichteten Source-Objekt. Zulässig sind alle Werte außer [[NaN]]. Der Parameter '''AL_DIRECTION''' ist nur für die Funktionsvarianten '''alSourcefv''', '''alSource3f''', '''alSourceiv''' und '''alSource3i''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_GAIN ===&lt;br /&gt;
: Legt den skalaren Amplitudenmultiplikator für das Source-Objekt fest. Der Vorgabewert 1.0 bedeutet, dass die Geräusche ungedämpft sind. Ein Wert von 0.5 ist äquivalent zu einer Abschwächung von 6 dB. Der Wert null entspricht Stille. Die Implementierung ist dafür verantwortlich, artefaktfreie (d.h. klickgeräuschfreie) Änderungen des Wertes zu ermöglichen und kann daher die tatsächliche Änderung des Wertes innerhalb gewisser, akzeptabler Grenzen verzögern. Werte größer als eins sind zwar zulässig, jedoch steht es der Implementierung frei, Werte größer als 1,0 auf 1,0 herunterzuregeln, um einen möglichen Überlauf zu vermeiden. '''AL_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_LOOPING ===&lt;br /&gt;
: Legt fest, ob das Source-Objekt nicht in den Zustand '''AL_STOPPED''' wechselt, sobald es das Ende des letzten Puffers in der Pufferwarteschlange erreicht hat. In diesem Fall ist der Wert '''AL_TRUE''' zu setzen, andernfalls '''AL_FALSE'''. Der Vorgabewert für '''AL_LOOPING''' ist '''AL_FALSE'''. Ist das '''AL_LOOPING'''-Flag auf '''AL_TRUE''' gesetzt, so wechselt das Source-Objekt beim Erreichen des Endes der Pufferwarteschlange sofort wieder in den Zustand '''AL_INITIAL''' und danach in den Zustand '''AL_PLAYING''', um die Audiodaten in den zugehörigen Puffern erneut abzuspielen. Das '''AL_LOOPING'''-Flag für ein Source-Objekt kann in jedem Ausführungszustand, besonders auch im Zustand '''AL_PLAYING''', geändert werden. Zulässige Werte sind '''AL_TRUE''' und '''AL_FALSE'''. Der Paramater '''AL_LOOPING''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' als Paramater zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_MAX_DISTANCE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_MAX_GAIN ===&lt;br /&gt;
: Setzt den maximalen, erlaubten '''AL_GAIN'''-Wert für das Source-Objekt. Der Vorgabewert ist 1.0, zulässig sind alle Gleitkommawerte aus dem Intervall von 0,0 bis 1,0. Am Ende der Varabrebitung verschiedener Abschwächungs- oder Verstärkungsfaktoren wie der entfernungsbasierten Abschwächung und dem '''AL_GAIN'''-Wert des Source-Objektes wird der berechnete Effektivwert mit dem '''AL_MAX_GAIN'''-Wert verglichen. Falls der berechnete Wert größer ist als der '''AL_MAX_GAIN'''-Wert, dann wird der '''AL_MAX_GAIN'''-Wert angewendet. Dies geschieht jedoch, bevor der '''AL_GAIN'''-Wert des Listener-Objektes in Betracht gezogen wird. Wenn das Produkt aus '''AL_MAX_GAIN''' und dem '''AL_GAIN'''-Wert des Listener-Objektes immer noch den maximalen Wert, welchen die Implementierung handhaben kann, überschreitet, so steht es der Implementierung frei, den Wert zu reduzieren. Falls für '''AL_MAX_GAIN''' der Wert null gesetzt wird, so ist das Source-Objekt quasi stummgeschalten. Die vorgesehene Art, ein Source-Objekt stummzuschalten, ist jedoch, den '''AL_GAIN'''-Wert auf null zu setzen. Der Parameter '''AL_MAX_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_MIN_GAIN ===&lt;br /&gt;
: Legt den minimalen '''AL_GAIN'''-Wert fest, welcher für das Source-Objekt immer gewährleistet sein soll. Der Vorgabewert ist 0.0, zulässig sind alle Werte aus dem Intervall von 0,0 bis 1,0. Am Ende der Verarbeitung verschiedener Abschwächungsfaktoren wie der entfernungsbasierten Abschwächung und dem '''AL_GAIN'''-Wertes des Source-Objektes wird der berechnete Effektivwert mit dem '''AL_MIN_GAIN'''-Wert verglichen. Falls der berechnete Wert kleiner ist als '''AL_MIN_GAIN''', so wird der Wert von '''AL_MIN_GAIN''' angewendet. Dies passiert jedoch, bevor der '''AL_GAIN'''-Wert des Listener-Objektes angewendet wird. Wenn der für '''AL_MIN_GAIN''' gesetzte Wert null ist, so wird keine Korrektur vorgenommen. Der Parameter '''AL_MIN_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_PITCH ===&lt;br /&gt;
: Setzt die Verschiebung der Tonhöhe/ Frequenz des Source-Objektes. Ein Wert von 1,0 entspricht der Identität (d.h. keine Verschiebung), dies ist auch der Vorgabewert. Jede Reduzierung des Wertes um 50% entspricht einer Verschiebung um 12 Halbtöne bzw. eine Oktave nach unten. Jede Verdopplung des Wertes entspricht einer Verschiebung von 12 Halbtönen bzw. einer Oktave nach oben. Null ist kein zulässiger Wert, alle Gleitkommawerte größer als null sind erlaubt. Jede Implementierung kann die '''AL_PITCH'''-Werte aber entsprechend ihrer eigenen Limitationen beschränken. '''AL_PITCH''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' als Parameter zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_POSITION ===&lt;br /&gt;
: Setzt die aktuelle Position des Source-Objektes im Weltkoordinatensystem. Der Standardwert ist (0.0, 0.0, 0.0). '''AL_POSITION''' darf ''nicht'' in '''alSourcei''' oder '''alSourcef''' benutzt werden sondern nur in den Funktionsvarianten für mehrere Wertargumente, also '''alSource3f''', '''alSource3i''', '''alSourcefv''' oder '''alSourceiv'''. Erlaubt ist jedes Tripel von Fließkommawerten mit Ausnahme von [[NaN]]. Es ist nicht definiert, wie sich die Implementation verhält, falls [[NaN]] oder ein unendlicher Wert gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== AL_REFERENCE_DISTANCE ===&lt;br /&gt;
   '''AL_REFERENCE_DISTANCE''' beschreibt den Abstand, bei dem der Verstärkungsfaktor der Audioquelle genau 1 beträgt.&lt;br /&gt;
&lt;br /&gt;
=== AL_ROLLOFF_FACTOR ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_SAMPLE_OFFSET ===&lt;br /&gt;
: Legt die Abspielposition fest, wobei diese Position in Samples ausgedrückt wird. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Bei Verwendung eines komprimierten Formates gibt dieser Wert das exakte Offset innerhalb der unkomprimierten Daten an. Wenn '''AL_SAMPLE_OFFSET''' für ein Source-Objekt, welches gerade Audiodaten abspielt, gesetzt wird, so springt die Wiedergabe zur angegebenen Position, es sei denn das neue Offset ist außerhalb des zulässigen Bereiches, wodurch ein '''AL_INVALID_VALUE'''-Fehlerstatus generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Ein Aufruf von [[alSourceStop]], [[alSourceRewind]] oder ein zweiter Aufruf von [[alSourcePlay]] setzt das Offset zurück auf den Anfang des Puffers. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Zulässige Werte sind alle Werte größer oder gleich null, ein Vorgabewert ist nicht festgelegt. '''AL_SAMPLE_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SEC_OFFSET ===&lt;br /&gt;
: Legt die Abspielposition fest, wobei diese Position in Sekunden ausgedrückt wird. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Wenn '''AL_SEC_OFFSET''' für ein Source-Objekt, welches gerade Audiodaten abspielt, gesetzt wird, so springt die Wiedergabe zur angegebenen Position, es sei denn das neue Offset ist außerhalb des zulässigen Bereiches, wodurch ein '''AL_INVALID_VALUE'''-Fehlerstatus generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Der Wert basiert auf der Byteposition, sodass ein mit '''AL_PITCH''' verändertes Source-Objekt eine überspitzte Abspielgeschwindigkeit hat. Zum Beispiel kann ein Puffer ein Offset von 0,50 Sekunden haben, jedoch dauert es nur 0,25 Sekunden, dahin zu gelangen, wenn der '''AL_PITCH'''-Wert auf 2,0 gesetzt ist. Für das Setzen des Offsets ist jeder Wert größer gleich 0,0 zulässig, ein Vorgabewert ist nicht definiert. Der Parameter '''AL_SEC_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SOURCE_RELATIVE ===&lt;br /&gt;
: Legt fest, ob die Position, Geschwindigkeit, Richtung und der Schallkegel relativ zum Listener-Objekt interpretiert werden oder nicht. Bei einem Wert von '''AL_TRUE''' sind die Angaben relativ zu sehen, bei '''AL_FALSE''' nicht. Vorgabewert ist '''AL_FALSE'''. '''AL_SOURCE_RELATIVE''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' als Parameterwert zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SOURCE_STATE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_VELOCITY ===&lt;br /&gt;
: Setzt die Geschwindigkeit (Schnelligkeit und Richtung) des Source-Objektes im Koordinatensystem. Jedes Tripel aus gültigen Gleitkommawerten ist erlaubt, abgesehen von [[NaN]]. Der Vorgabewert ist (0.0, 0.0, 0.0). Die Geschwindigkeit beeinflußt jedoch nicht die Position des Objektes. [[OpenAL]] berechnet die Geschwindigkeit nicht aus aufeinanderfolgenden Änderungen mit '''AL_POSITION''', ebenso wenig wird die Position des Objektes über die Zeit anhand der angegebenen Geschwindigkeit angepasst. Jede derartige Berechnung bleibt der Anwendung überlassen. Für die Belange der Soundverarbeitung sind Position und Geschwindigkeit unabhängige Parameter, die sich auf verschiedene Aspekte des Klangs auswirken. '''AL_VELOCITY''' wird von Treiber berücksichtigt, um den vom Hörer wahrgenommenen Dopplereffekt zu berechnen, was auf Grundlage der Geschwindigkeit des Source-Objektes, des Listener-Objektes und der dopplereffektbezogenen Paramater geschieht. '''AL_VELOCITY''' ist nur für die Funktionsvarianten '''alSourcefv''', '''alSource3f''', '''alSourceiv''' und '''alSource3i''' als Paramater zulässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Falls bei der Ausführung ein Fehler auftritt, kann dieser mit [[alGetError]] erfragt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
Folgende Erweiterungen hat die Funktion erfahren:&lt;br /&gt;
=== Ab OpenAL-Version 1.1 ===&lt;br /&gt;
&lt;br /&gt;
Seit OpenAL-Version 1.1 existieren auch die Funktionen für mehrere Ganzzahlwerte, '''alSource3i''' und '''alSourceiv'''.&lt;br /&gt;
&lt;br /&gt;
Ebenso sind die Token '''AL_BYTE_OFFSET''', '''AL_SAMPLE_OFFSET''' und '''AL_SEC_OFFSET''' erst ab Version 1.1 verfügbar. Jedoch gibt es dafür auch die OpenAL-Erweiterung '''AL_EXT_OFFSET''', welche von jeder Implementation der Open AL 1.1 unterstützt wird und es einer für die Spezifikation von OpenAL 1.0 geschriebenen aber auf eine Implementation der Version 1.1 zugreifenden Anwendung erlaubt, die drei genannten Tokenwerte auch zum Setzen (und Abfragen) der entsprechenden Werte zu nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''AL_INVALID_ENUM''' wird generiert, wenn der Wert für ''param'' unzulässig ist.&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_NAME''' wird generiert, sofern ''source'' kein gültiges Source-Objekt ist. (Siehe auch [[alIsSource]].)&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_OPERATION''' wird generiert, falls es keinen aktuellen Kontext gibt. (Siehe dazu auch [[alcMakeContextCurrent]].)&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_VALUE''' wird generiert, wenn der zu setzenden Wert den zulässigen Bereich überschreitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zugehörige Wertrückgaben ==&lt;br /&gt;
[[alGetSource]] mit den oben genannten Tokenwerten liefert die gesetzten Werte zurück.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[alGetSource]], [[alListener]] (analoge Funktion für Listener-Objekte)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AL|Source]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=alSource&amp;diff=24331</id>
		<title>alSource</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=alSource&amp;diff=24331"/>
				<updated>2009-11-24T14:47:24Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* AL_REFERENCE_DISTANCE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig|Die Beschreibung zu den Auswirkungen des Funktionsparameters ''param'' muss noch ergänzt werden. Als Grundlage kann die [http://www.openal.org/documentation.html Open AL-Dokumentation] dienen.}}&lt;br /&gt;
= alSource =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''alSource''' - Setzt Eigenschaften eines Source-Objektes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''alSourcef'''(''source'': TALuint; ''param'': TALenum; ''value'': TALfloat);&lt;br /&gt;
 procedure '''alSource3f'''(''source'': TALuint; ''param'': TALenum; ''v1'': TALfloat; ''v2'': TALfloat; ''v3'': TALfloat);&lt;br /&gt;
 procedure '''alSourcefv'''(''source'': TALuint; ''param'': TALenum; ''values'': PALfloat);&lt;br /&gt;
 procedure '''alSourcei'''(''source'': TALuint; ''param'': TALenum; ''value'': TALint);&lt;br /&gt;
 procedure '''alSource3i'''(''source'': TALuint; ''param'': TALenum; ''v1'': TALint; ''v2'': TALint; ''v3'': TALint);&lt;br /&gt;
 procedure '''alSourceiv'''(''source'': TALuint; ''param'': TALenum; ''values'': PALint);&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;
! ''source'' &lt;br /&gt;
| Name des Source-Objektes, dessen Eigenschaft geändert werden soll&lt;br /&gt;
|-&lt;br /&gt;
! ''param'' &lt;br /&gt;
| Symbolische Konstante, welche die zu setzende Eigenschaft angibt&lt;br /&gt;
|-&lt;br /&gt;
! ''value'' &lt;br /&gt;
|  TALfloat-/ TALint-Wert, der gesetzt werden soll (nur bei '''alSourcef''' bzw. '''alSourcei''')&lt;br /&gt;
|-&lt;br /&gt;
! ''values'' &lt;br /&gt;
|  Zeiger auf einen TALfloat-/ TALint-Vektor, welcher die zu setzenden Werte enthält (nur bei '''alSourcefv''' und '''alSourceiv''')&lt;br /&gt;
|-&lt;br /&gt;
! ''v1, v2, v3'' &lt;br /&gt;
|  TALfloat-/ TALint-Werte, welche die zu setzenden Werte angeben (nur bei '''alSource3f''' und '''alSource3i''')&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
Die Funktion '''alSource''' bzw. ihre Varianten für verschiedene Wertargumente setzen Eigenschaften eines Source-Objektes der [[OpenAL]]. Welche Eigenschaft gesetzt wird, hängt vom Wert des Parameters ''param'' ab.&lt;br /&gt;
&lt;br /&gt;
Folgende Werte sind für ''param'' zulässig:&lt;br /&gt;
=== AL_BUFFER ===&lt;br /&gt;
: Legt den aktuellen Puffer fest und macht ihn zum ersten Eintrag in der Pufferwarteschlange des Source-Objektes. Der Vorgabewert ist '''AL_NONE''', zulässige Werte sind alle gültigen Puffernamen (siehe dazu auch [[alIsBuffer]]). Wird '''alSource''' mit dem Parameter '''AL_BUFFER''' auf ein Source-Objekt im Zustand '''AL_INITIAL''' oder '''AL_STOPPED''' angewendet, so wird die gesamte Pufferwarteschlange geleert und der angegebene Puffer an das Source-Objekt angehangen.&lt;br /&gt;
&lt;br /&gt;
: Für ein Source-Objekt im Zustand '''AL_PLAYING''' oder '''AL_PAUSED''' wird der Versuch, mit '''AL_BUFFER''' einen Wert zu setzen, den Fehlerstatus '''AL_INVALID_OPERATION''' setzen. '''AL_BUFFER''' kann nur auf Source-Objekte im Zustand '''AL_STOPPED''' oder '''AL_INITIAL''' angewendet werden. Die Angabe eines ungültigen Puffernamens, sei es weil dieser Puffer nicht existiert oder nicht an das Source-Objekt angehängt werden kann, setzt den Fehlerstatus '''AL_INVALID_VALUE''', während die Angabe eines ungültigen Source-Objektes den Fehlerstatus '''AL_INVALID_NAME''' zur Folge hat.&lt;br /&gt;
&lt;br /&gt;
: '''AL_NONE''' ('''nil''' oder 0) ist ein gültiger Puffername. Der Aufruf alSourcei(sourceName, AL_BUFFER, AL_NONE) ist eine zulässige Möglichkeit, die aktuelle Pufferwarteschlange eines Source-Objektes freizugeben, egal ob die Pufferwarteschlange nur einen Eintrag (den aktuellen Puffer) oder mehrer hat. Jedoch verursacht der Funktionsaufruf alSourcei(sourceName, AL_BUFFER, AL_NONE) immer noch einen '''AL_INVALID_OPERATION'''-Fehlerstatus für ein im Zustand '''AL_PLAYING''' oder '''AL_PAUSED''' befindliches Source-Objekt und kann folgerichtig nicht genutzt werden, um ein Source-Objekt anzuhalten (siehe dazu [[alSourceStop]]) oder stummzuschalten. Der Paramater '''AL_BUFFER''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_BYTE_OFFEST ===&lt;br /&gt;
: Legt die Abpspielposition, ausgedrückt in Bytes, fest. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Im Falle eines komprimierten Audioformates kann es sein, dass dieser Wert nur einen genäherten Wert innerhalb der komprimierten Daten angibt. Wird das Offset für ein Source-Objekt gesetzt, welches gerade Audiodaten abspielt, springt die Wiedergabe zur neuen Position, es sei denn der angegebene Wert ist außerhalb des zulässigen Bereichs, wodurch ein '''AL_INVALID_VALUE'''-Fehler generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Ein Aufruf von [[alSourceStop]], [[alSourceRewind]] oder ein zweiter Aufruf von [[alSourcePlay]] setzt das Offset zurück auf den Anfang des Puffers. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Zulässige Werte sind Werte größer oder gleich null, ein Vorgabewert ist nicht festgelegt. '''AL_BYTE_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_INNER_ANGLE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_OUTER_ANGLE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_OUTER_GAIN ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_DIRECTION ===&lt;br /&gt;
: Legt die Ausrichtung eines Source-Objektes fest. Falls der '''AL_DIRECTION'''-Wert ungleich dem Nullvektor ist, so handelt es sich um ein gerichtetes Source-Objekt. Die Geräuschemission wird als symmetrisch um den Richtungsvektor herum angenommen (Zylindersymmetrie). Der Nullvektor ist der Vorgabewert, wodurch angegeben wird, dass das Source-Objekt nicht gerichtet ist. Das Setzen eines vom Nullvektor verschiedenen, dreidimensionalen Vektors macht aus dem Source-Objekt ein gerichtetes Objekt; das Setzen des Nullvektors für ein gerichtetes Source-Objekt macht es zu einem ungerichteten Source-Objekt. Zulässig sind alle Werte außer [[NaN]]. Der Parameter '''AL_DIRECTION''' ist nur für die Funktionsvarianten '''alSourcefv''', '''alSource3f''', '''alSourceiv''' und '''alSource3i''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_GAIN ===&lt;br /&gt;
: Legt den skalaren Amplitudenmultiplikator für das Source-Objekt fest. Der Vorgabewert 1.0 bedeutet, dass die Geräusche ungedämpft sind. Ein Wert von 0.5 ist äquivalent zu einer Abschwächung von 6 dB. Der Wert null entspricht Stille. Die Implementierung ist dafür verantwortlich, artefaktfreie (d.h. klickgeräuschfreie) Änderungen des Wertes zu ermöglichen und kann daher die tatsächliche Änderung des Wertes innerhalb gewisser, akzeptabler Grenzen verzögern. Werte größer als eins sind zwar zulässig, jedoch steht es der Implementierung frei, Werte größer als 1,0 auf 1,0 herunterzuregeln, um einen möglichen Überlauf zu vermeiden. '''AL_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_LOOPING ===&lt;br /&gt;
: Legt fest, ob das Source-Objekt nicht in den Zustand '''AL_STOPPED''' wechselt, sobald es das Ende des letzten Puffers in der Pufferwarteschlange erreicht hat. In diesem Fall ist der Wert '''AL_TRUE''' zu setzen, andernfalls '''AL_FALSE'''. Der Vorgabewert für '''AL_LOOPING''' ist '''AL_FALSE'''. Ist das '''AL_LOOPING'''-Flag auf '''AL_TRUE''' gesetzt, so wechselt das Source-Objekt beim Erreichen des Endes der Pufferwarteschlange sofort wieder in den Zustand '''AL_INITIAL''' und danach in den Zustand '''AL_PLAYING''', um die Audiodaten in den zugehörigen Puffern erneut abzuspielen. Das '''AL_LOOPING'''-Flag für ein Source-Objekt kann in jedem Ausführungszustand, besonders auch im Zustand '''AL_PLAYING''', geändert werden. Zulässige Werte sind '''AL_TRUE''' und '''AL_FALSE'''. Der Paramater '''AL_LOOPING''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' als Paramater zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_MAX_DISTANCE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_MAX_GAIN ===&lt;br /&gt;
: Setzt den maximalen, erlaubten '''AL_GAIN'''-Wert für das Source-Objekt. Der Vorgabewert ist 1.0, zulässig sind alle Gleitkommawerte aus dem Intervall von 0,0 bis 1,0. Am Ende der Varabrebitung verschiedener Abschwächungs- oder Verstärkungsfaktoren wie der entfernungsbasierten Abschwächung und dem '''AL_GAIN'''-Wert des Source-Objektes wird der berechnete Effektivwert mit dem '''AL_MAX_GAIN'''-Wert verglichen. Falls der berechnete Wert größer ist als der '''AL_MAX_GAIN'''-Wert, dann wird der '''AL_MAX_GAIN'''-Wert angewendet. Dies geschieht jedoch, bevor der '''AL_GAIN'''-Wert des Listener-Objektes in Betracht gezogen wird. Wenn das Produkt aus '''AL_MAX_GAIN''' und dem '''AL_GAIN'''-Wert des Listener-Objektes immer noch den maximalen Wert, welchen die Implementierung handhaben kann, überschreitet, so steht es der Implementierung frei, den Wert zu reduzieren. Falls für '''AL_MAX_GAIN''' der Wert null gesetzt wird, so ist das Source-Objekt quasi stummgeschalten. Die vorgesehene Art, ein Source-Objekt stummzuschalten, ist jedoch, den '''AL_GAIN'''-Wert auf null zu setzen. Der Parameter '''AL_MAX_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_MIN_GAIN ===&lt;br /&gt;
: Legt den minimalen '''AL_GAIN'''-Wert fest, welcher für das Source-Objekt immer gewährleistet sein soll. Der Vorgabewert ist 0.0, zulässig sind alle Werte aus dem Intervall von 0,0 bis 1,0. Am Ende der Verarbeitung verschiedener Abschwächungsfaktoren wie der entfernungsbasierten Abschwächung und dem '''AL_GAIN'''-Wertes des Source-Objektes wird der berechnete Effektivwert mit dem '''AL_MIN_GAIN'''-Wert verglichen. Falls der berechnete Wert kleiner ist als '''AL_MIN_GAIN''', so wird der Wert von '''AL_MIN_GAIN''' angewendet. Dies passiert jedoch, bevor der '''AL_GAIN'''-Wert des Listener-Objektes angewendet wird. Wenn der für '''AL_MIN_GAIN''' gesetzte Wert null ist, so wird keine Korrektur vorgenommen. Der Parameter '''AL_MIN_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_PITCH ===&lt;br /&gt;
: Setzt die Verschiebung der Tonhöhe/ Frequenz des Source-Objektes. Ein Wert von 1,0 entspricht der Identität (d.h. keine Verschiebung), dies ist auch der Vorgabewert. Jede Reduzierung des Wertes um 50% entspricht einer Verschiebung um 12 Halbtöne bzw. eine Oktave nach unten. Jede Verdopplung des Wertes entspricht einer Verschiebung von 12 Halbtönen bzw. einer Oktave nach oben. Null ist kein zulässiger Wert, alle Gleitkommawerte größer als null sind erlaubt. Jede Implementierung kann die '''AL_PITCH'''-Werte aber entsprechend ihrer eigenen Limitationen beschränken. '''AL_PITCH''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' als Parameter zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_POSITION ===&lt;br /&gt;
: Setzt die aktuelle Position des Source-Objektes im Weltkoordinatensystem. Der Standardwert ist (0.0, 0.0, 0.0). '''AL_POSITION''' darf ''nicht'' in '''alSourcei''' oder '''alSourcef''' benutzt werden sondern nur in den Funktionsvarianten für mehrere Wertargumente, also '''alSource3f''', '''alSource3i''', '''alSourcefv''' oder '''alSourceiv'''. Erlaubt ist jedes Tripel von Fließkommawerten mit Ausnahme von [[NaN]]. Es ist nicht definiert, wie sich die Implementation verhält, falls [[NaN]] oder ein unendlicher Wert gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== AL_REFERENCE_DISTANCE ===&lt;br /&gt;
'''AL_REFERENCE_DISTANCE''' beschreibt den Abstand, bei dem der Verstärkungsfaktor der Audioquelle genau 1 beträgt.&lt;br /&gt;
&lt;br /&gt;
=== AL_ROLLOFF_FACTOR ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_SAMPLE_OFFSET ===&lt;br /&gt;
: Legt die Abspielposition fest, wobei diese Position in Samples ausgedrückt wird. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Bei Verwendung eines komprimierten Formates gibt dieser Wert das exakte Offset innerhalb der unkomprimierten Daten an. Wenn '''AL_SAMPLE_OFFSET''' für ein Source-Objekt, welches gerade Audiodaten abspielt, gesetzt wird, so springt die Wiedergabe zur angegebenen Position, es sei denn das neue Offset ist außerhalb des zulässigen Bereiches, wodurch ein '''AL_INVALID_VALUE'''-Fehlerstatus generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Ein Aufruf von [[alSourceStop]], [[alSourceRewind]] oder ein zweiter Aufruf von [[alSourcePlay]] setzt das Offset zurück auf den Anfang des Puffers. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Zulässige Werte sind alle Werte größer oder gleich null, ein Vorgabewert ist nicht festgelegt. '''AL_SAMPLE_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SEC_OFFSET ===&lt;br /&gt;
: Legt die Abspielposition fest, wobei diese Position in Sekunden ausgedrückt wird. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Wenn '''AL_SEC_OFFSET''' für ein Source-Objekt, welches gerade Audiodaten abspielt, gesetzt wird, so springt die Wiedergabe zur angegebenen Position, es sei denn das neue Offset ist außerhalb des zulässigen Bereiches, wodurch ein '''AL_INVALID_VALUE'''-Fehlerstatus generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Der Wert basiert auf der Byteposition, sodass ein mit '''AL_PITCH''' verändertes Source-Objekt eine überspitzte Abspielgeschwindigkeit hat. Zum Beispiel kann ein Puffer ein Offset von 0,50 Sekunden haben, jedoch dauert es nur 0,25 Sekunden, dahin zu gelangen, wenn der '''AL_PITCH'''-Wert auf 2,0 gesetzt ist. Für das Setzen des Offsets ist jeder Wert größer gleich 0,0 zulässig, ein Vorgabewert ist nicht definiert. Der Parameter '''AL_SEC_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SOURCE_RELATIVE ===&lt;br /&gt;
: Legt fest, ob die Position, Geschwindigkeit, Richtung und der Schallkegel relativ zum Listener-Objekt interpretiert werden oder nicht. Bei einem Wert von '''AL_TRUE''' sind die Angaben relativ zu sehen, bei '''AL_FALSE''' nicht. Vorgabewert ist '''AL_FALSE'''. '''AL_SOURCE_RELATIVE''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' als Parameterwert zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SOURCE_STATE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_VELOCITY ===&lt;br /&gt;
: Setzt die Geschwindigkeit (Schnelligkeit und Richtung) des Source-Objektes im Koordinatensystem. Jedes Tripel aus gültigen Gleitkommawerten ist erlaubt, abgesehen von [[NaN]]. Der Vorgabewert ist (0.0, 0.0, 0.0). Die Geschwindigkeit beeinflußt jedoch nicht die Position des Objektes. [[OpenAL]] berechnet die Geschwindigkeit nicht aus aufeinanderfolgenden Änderungen mit '''AL_POSITION''', ebenso wenig wird die Position des Objektes über die Zeit anhand der angegebenen Geschwindigkeit angepasst. Jede derartige Berechnung bleibt der Anwendung überlassen. Für die Belange der Soundverarbeitung sind Position und Geschwindigkeit unabhängige Parameter, die sich auf verschiedene Aspekte des Klangs auswirken. '''AL_VELOCITY''' wird von Treiber berücksichtigt, um den vom Hörer wahrgenommenen Dopplereffekt zu berechnen, was auf Grundlage der Geschwindigkeit des Source-Objektes, des Listener-Objektes und der dopplereffektbezogenen Paramater geschieht. '''AL_VELOCITY''' ist nur für die Funktionsvarianten '''alSourcefv''', '''alSource3f''', '''alSourceiv''' und '''alSource3i''' als Paramater zulässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Falls bei der Ausführung ein Fehler auftritt, kann dieser mit [[alGetError]] erfragt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
Folgende Erweiterungen hat die Funktion erfahren:&lt;br /&gt;
=== Ab OpenAL-Version 1.1 ===&lt;br /&gt;
&lt;br /&gt;
Seit OpenAL-Version 1.1 existieren auch die Funktionen für mehrere Ganzzahlwerte, '''alSource3i''' und '''alSourceiv'''.&lt;br /&gt;
&lt;br /&gt;
Ebenso sind die Token '''AL_BYTE_OFFSET''', '''AL_SAMPLE_OFFSET''' und '''AL_SEC_OFFSET''' erst ab Version 1.1 verfügbar. Jedoch gibt es dafür auch die OpenAL-Erweiterung '''AL_EXT_OFFSET''', welche von jeder Implementation der Open AL 1.1 unterstützt wird und es einer für die Spezifikation von OpenAL 1.0 geschriebenen aber auf eine Implementation der Version 1.1 zugreifenden Anwendung erlaubt, die drei genannten Tokenwerte auch zum Setzen (und Abfragen) der entsprechenden Werte zu nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''AL_INVALID_ENUM''' wird generiert, wenn der Wert für ''param'' unzulässig ist.&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_NAME''' wird generiert, sofern ''source'' kein gültiges Source-Objekt ist. (Siehe auch [[alIsSource]].)&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_OPERATION''' wird generiert, falls es keinen aktuellen Kontext gibt. (Siehe dazu auch [[alcMakeContextCurrent]].)&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_VALUE''' wird generiert, wenn der zu setzenden Wert den zulässigen Bereich überschreitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zugehörige Wertrückgaben ==&lt;br /&gt;
[[alGetSource]] mit den oben genannten Tokenwerten liefert die gesetzten Werte zurück.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[alGetSource]], [[alListener]] (analoge Funktion für Listener-Objekte)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AL|Source]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=alSource&amp;diff=24330</id>
		<title>alSource</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=alSource&amp;diff=24330"/>
				<updated>2009-11-24T14:47:05Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* AL_REFERENCE_DISTANCE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig|Die Beschreibung zu den Auswirkungen des Funktionsparameters ''param'' muss noch ergänzt werden. Als Grundlage kann die [http://www.openal.org/documentation.html Open AL-Dokumentation] dienen.}}&lt;br /&gt;
= alSource =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''alSource''' - Setzt Eigenschaften eines Source-Objektes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''alSourcef'''(''source'': TALuint; ''param'': TALenum; ''value'': TALfloat);&lt;br /&gt;
 procedure '''alSource3f'''(''source'': TALuint; ''param'': TALenum; ''v1'': TALfloat; ''v2'': TALfloat; ''v3'': TALfloat);&lt;br /&gt;
 procedure '''alSourcefv'''(''source'': TALuint; ''param'': TALenum; ''values'': PALfloat);&lt;br /&gt;
 procedure '''alSourcei'''(''source'': TALuint; ''param'': TALenum; ''value'': TALint);&lt;br /&gt;
 procedure '''alSource3i'''(''source'': TALuint; ''param'': TALenum; ''v1'': TALint; ''v2'': TALint; ''v3'': TALint);&lt;br /&gt;
 procedure '''alSourceiv'''(''source'': TALuint; ''param'': TALenum; ''values'': PALint);&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;
! ''source'' &lt;br /&gt;
| Name des Source-Objektes, dessen Eigenschaft geändert werden soll&lt;br /&gt;
|-&lt;br /&gt;
! ''param'' &lt;br /&gt;
| Symbolische Konstante, welche die zu setzende Eigenschaft angibt&lt;br /&gt;
|-&lt;br /&gt;
! ''value'' &lt;br /&gt;
|  TALfloat-/ TALint-Wert, der gesetzt werden soll (nur bei '''alSourcef''' bzw. '''alSourcei''')&lt;br /&gt;
|-&lt;br /&gt;
! ''values'' &lt;br /&gt;
|  Zeiger auf einen TALfloat-/ TALint-Vektor, welcher die zu setzenden Werte enthält (nur bei '''alSourcefv''' und '''alSourceiv''')&lt;br /&gt;
|-&lt;br /&gt;
! ''v1, v2, v3'' &lt;br /&gt;
|  TALfloat-/ TALint-Werte, welche die zu setzenden Werte angeben (nur bei '''alSource3f''' und '''alSource3i''')&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
Die Funktion '''alSource''' bzw. ihre Varianten für verschiedene Wertargumente setzen Eigenschaften eines Source-Objektes der [[OpenAL]]. Welche Eigenschaft gesetzt wird, hängt vom Wert des Parameters ''param'' ab.&lt;br /&gt;
&lt;br /&gt;
Folgende Werte sind für ''param'' zulässig:&lt;br /&gt;
=== AL_BUFFER ===&lt;br /&gt;
: Legt den aktuellen Puffer fest und macht ihn zum ersten Eintrag in der Pufferwarteschlange des Source-Objektes. Der Vorgabewert ist '''AL_NONE''', zulässige Werte sind alle gültigen Puffernamen (siehe dazu auch [[alIsBuffer]]). Wird '''alSource''' mit dem Parameter '''AL_BUFFER''' auf ein Source-Objekt im Zustand '''AL_INITIAL''' oder '''AL_STOPPED''' angewendet, so wird die gesamte Pufferwarteschlange geleert und der angegebene Puffer an das Source-Objekt angehangen.&lt;br /&gt;
&lt;br /&gt;
: Für ein Source-Objekt im Zustand '''AL_PLAYING''' oder '''AL_PAUSED''' wird der Versuch, mit '''AL_BUFFER''' einen Wert zu setzen, den Fehlerstatus '''AL_INVALID_OPERATION''' setzen. '''AL_BUFFER''' kann nur auf Source-Objekte im Zustand '''AL_STOPPED''' oder '''AL_INITIAL''' angewendet werden. Die Angabe eines ungültigen Puffernamens, sei es weil dieser Puffer nicht existiert oder nicht an das Source-Objekt angehängt werden kann, setzt den Fehlerstatus '''AL_INVALID_VALUE''', während die Angabe eines ungültigen Source-Objektes den Fehlerstatus '''AL_INVALID_NAME''' zur Folge hat.&lt;br /&gt;
&lt;br /&gt;
: '''AL_NONE''' ('''nil''' oder 0) ist ein gültiger Puffername. Der Aufruf alSourcei(sourceName, AL_BUFFER, AL_NONE) ist eine zulässige Möglichkeit, die aktuelle Pufferwarteschlange eines Source-Objektes freizugeben, egal ob die Pufferwarteschlange nur einen Eintrag (den aktuellen Puffer) oder mehrer hat. Jedoch verursacht der Funktionsaufruf alSourcei(sourceName, AL_BUFFER, AL_NONE) immer noch einen '''AL_INVALID_OPERATION'''-Fehlerstatus für ein im Zustand '''AL_PLAYING''' oder '''AL_PAUSED''' befindliches Source-Objekt und kann folgerichtig nicht genutzt werden, um ein Source-Objekt anzuhalten (siehe dazu [[alSourceStop]]) oder stummzuschalten. Der Paramater '''AL_BUFFER''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_BYTE_OFFEST ===&lt;br /&gt;
: Legt die Abpspielposition, ausgedrückt in Bytes, fest. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Im Falle eines komprimierten Audioformates kann es sein, dass dieser Wert nur einen genäherten Wert innerhalb der komprimierten Daten angibt. Wird das Offset für ein Source-Objekt gesetzt, welches gerade Audiodaten abspielt, springt die Wiedergabe zur neuen Position, es sei denn der angegebene Wert ist außerhalb des zulässigen Bereichs, wodurch ein '''AL_INVALID_VALUE'''-Fehler generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Ein Aufruf von [[alSourceStop]], [[alSourceRewind]] oder ein zweiter Aufruf von [[alSourcePlay]] setzt das Offset zurück auf den Anfang des Puffers. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Zulässige Werte sind Werte größer oder gleich null, ein Vorgabewert ist nicht festgelegt. '''AL_BYTE_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_INNER_ANGLE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_OUTER_ANGLE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_CONE_OUTER_GAIN ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_DIRECTION ===&lt;br /&gt;
: Legt die Ausrichtung eines Source-Objektes fest. Falls der '''AL_DIRECTION'''-Wert ungleich dem Nullvektor ist, so handelt es sich um ein gerichtetes Source-Objekt. Die Geräuschemission wird als symmetrisch um den Richtungsvektor herum angenommen (Zylindersymmetrie). Der Nullvektor ist der Vorgabewert, wodurch angegeben wird, dass das Source-Objekt nicht gerichtet ist. Das Setzen eines vom Nullvektor verschiedenen, dreidimensionalen Vektors macht aus dem Source-Objekt ein gerichtetes Objekt; das Setzen des Nullvektors für ein gerichtetes Source-Objekt macht es zu einem ungerichteten Source-Objekt. Zulässig sind alle Werte außer [[NaN]]. Der Parameter '''AL_DIRECTION''' ist nur für die Funktionsvarianten '''alSourcefv''', '''alSource3f''', '''alSourceiv''' und '''alSource3i''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_GAIN ===&lt;br /&gt;
: Legt den skalaren Amplitudenmultiplikator für das Source-Objekt fest. Der Vorgabewert 1.0 bedeutet, dass die Geräusche ungedämpft sind. Ein Wert von 0.5 ist äquivalent zu einer Abschwächung von 6 dB. Der Wert null entspricht Stille. Die Implementierung ist dafür verantwortlich, artefaktfreie (d.h. klickgeräuschfreie) Änderungen des Wertes zu ermöglichen und kann daher die tatsächliche Änderung des Wertes innerhalb gewisser, akzeptabler Grenzen verzögern. Werte größer als eins sind zwar zulässig, jedoch steht es der Implementierung frei, Werte größer als 1,0 auf 1,0 herunterzuregeln, um einen möglichen Überlauf zu vermeiden. '''AL_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_LOOPING ===&lt;br /&gt;
: Legt fest, ob das Source-Objekt nicht in den Zustand '''AL_STOPPED''' wechselt, sobald es das Ende des letzten Puffers in der Pufferwarteschlange erreicht hat. In diesem Fall ist der Wert '''AL_TRUE''' zu setzen, andernfalls '''AL_FALSE'''. Der Vorgabewert für '''AL_LOOPING''' ist '''AL_FALSE'''. Ist das '''AL_LOOPING'''-Flag auf '''AL_TRUE''' gesetzt, so wechselt das Source-Objekt beim Erreichen des Endes der Pufferwarteschlange sofort wieder in den Zustand '''AL_INITIAL''' und danach in den Zustand '''AL_PLAYING''', um die Audiodaten in den zugehörigen Puffern erneut abzuspielen. Das '''AL_LOOPING'''-Flag für ein Source-Objekt kann in jedem Ausführungszustand, besonders auch im Zustand '''AL_PLAYING''', geändert werden. Zulässige Werte sind '''AL_TRUE''' und '''AL_FALSE'''. Der Paramater '''AL_LOOPING''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' als Paramater zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_MAX_DISTANCE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_MAX_GAIN ===&lt;br /&gt;
: Setzt den maximalen, erlaubten '''AL_GAIN'''-Wert für das Source-Objekt. Der Vorgabewert ist 1.0, zulässig sind alle Gleitkommawerte aus dem Intervall von 0,0 bis 1,0. Am Ende der Varabrebitung verschiedener Abschwächungs- oder Verstärkungsfaktoren wie der entfernungsbasierten Abschwächung und dem '''AL_GAIN'''-Wert des Source-Objektes wird der berechnete Effektivwert mit dem '''AL_MAX_GAIN'''-Wert verglichen. Falls der berechnete Wert größer ist als der '''AL_MAX_GAIN'''-Wert, dann wird der '''AL_MAX_GAIN'''-Wert angewendet. Dies geschieht jedoch, bevor der '''AL_GAIN'''-Wert des Listener-Objektes in Betracht gezogen wird. Wenn das Produkt aus '''AL_MAX_GAIN''' und dem '''AL_GAIN'''-Wert des Listener-Objektes immer noch den maximalen Wert, welchen die Implementierung handhaben kann, überschreitet, so steht es der Implementierung frei, den Wert zu reduzieren. Falls für '''AL_MAX_GAIN''' der Wert null gesetzt wird, so ist das Source-Objekt quasi stummgeschalten. Die vorgesehene Art, ein Source-Objekt stummzuschalten, ist jedoch, den '''AL_GAIN'''-Wert auf null zu setzen. Der Parameter '''AL_MAX_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_MIN_GAIN ===&lt;br /&gt;
: Legt den minimalen '''AL_GAIN'''-Wert fest, welcher für das Source-Objekt immer gewährleistet sein soll. Der Vorgabewert ist 0.0, zulässig sind alle Werte aus dem Intervall von 0,0 bis 1,0. Am Ende der Verarbeitung verschiedener Abschwächungsfaktoren wie der entfernungsbasierten Abschwächung und dem '''AL_GAIN'''-Wertes des Source-Objektes wird der berechnete Effektivwert mit dem '''AL_MIN_GAIN'''-Wert verglichen. Falls der berechnete Wert kleiner ist als '''AL_MIN_GAIN''', so wird der Wert von '''AL_MIN_GAIN''' angewendet. Dies passiert jedoch, bevor der '''AL_GAIN'''-Wert des Listener-Objektes angewendet wird. Wenn der für '''AL_MIN_GAIN''' gesetzte Wert null ist, so wird keine Korrektur vorgenommen. Der Parameter '''AL_MIN_GAIN''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_PITCH ===&lt;br /&gt;
: Setzt die Verschiebung der Tonhöhe/ Frequenz des Source-Objektes. Ein Wert von 1,0 entspricht der Identität (d.h. keine Verschiebung), dies ist auch der Vorgabewert. Jede Reduzierung des Wertes um 50% entspricht einer Verschiebung um 12 Halbtöne bzw. eine Oktave nach unten. Jede Verdopplung des Wertes entspricht einer Verschiebung von 12 Halbtönen bzw. einer Oktave nach oben. Null ist kein zulässiger Wert, alle Gleitkommawerte größer als null sind erlaubt. Jede Implementierung kann die '''AL_PITCH'''-Werte aber entsprechend ihrer eigenen Limitationen beschränken. '''AL_PITCH''' ist nur für die Funktionsvarianten '''alSourcef''' und '''alSourcefv''' als Parameter zugelassen.&lt;br /&gt;
&lt;br /&gt;
=== AL_POSITION ===&lt;br /&gt;
: Setzt die aktuelle Position des Source-Objektes im Weltkoordinatensystem. Der Standardwert ist (0.0, 0.0, 0.0). '''AL_POSITION''' darf ''nicht'' in '''alSourcei''' oder '''alSourcef''' benutzt werden sondern nur in den Funktionsvarianten für mehrere Wertargumente, also '''alSource3f''', '''alSource3i''', '''alSourcefv''' oder '''alSourceiv'''. Erlaubt ist jedes Tripel von Fließkommawerten mit Ausnahme von [[NaN]]. Es ist nicht definiert, wie sich die Implementation verhält, falls [[NaN]] oder ein unendlicher Wert gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== AL_REFERENCE_DISTANCE ===&lt;br /&gt;
AL_REFERENCE_DISTANCE beschreibt den Abstand, bei dem der Verstärkungsfaktor der Audioquelle genau 1 beträgt.&lt;br /&gt;
&lt;br /&gt;
=== AL_ROLLOFF_FACTOR ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_SAMPLE_OFFSET ===&lt;br /&gt;
: Legt die Abspielposition fest, wobei diese Position in Samples ausgedrückt wird. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Bei Verwendung eines komprimierten Formates gibt dieser Wert das exakte Offset innerhalb der unkomprimierten Daten an. Wenn '''AL_SAMPLE_OFFSET''' für ein Source-Objekt, welches gerade Audiodaten abspielt, gesetzt wird, so springt die Wiedergabe zur angegebenen Position, es sei denn das neue Offset ist außerhalb des zulässigen Bereiches, wodurch ein '''AL_INVALID_VALUE'''-Fehlerstatus generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Ein Aufruf von [[alSourceStop]], [[alSourceRewind]] oder ein zweiter Aufruf von [[alSourcePlay]] setzt das Offset zurück auf den Anfang des Puffers. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Zulässige Werte sind alle Werte größer oder gleich null, ein Vorgabewert ist nicht festgelegt. '''AL_SAMPLE_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SEC_OFFSET ===&lt;br /&gt;
: Legt die Abspielposition fest, wobei diese Position in Sekunden ausgedrückt wird. Für Source-Objekte im Zustand '''AL_LOOPING''' wird dieser Wert wieder auf null zurückspringen, sobald die Wiedergabe wieder von vorn beginnt. Wenn '''AL_SEC_OFFSET''' für ein Source-Objekt, welches gerade Audiodaten abspielt, gesetzt wird, so springt die Wiedergabe zur angegebenen Position, es sei denn das neue Offset ist außerhalb des zulässigen Bereiches, wodurch ein '''AL_INVALID_VALUE'''-Fehlerstatus generiert wird. Falls das Source-Objekt gerade keine Audiodaten abspielt, wird die Offsetänderung beim nächsten zugehörigen Aufruf von [[alSourcePlay]] durchgeführt. Die Position ist relativ zum Anfang aller dem Source-Objekt angehängten Puffer, und jeder Puffer, der beim Setzen des Offsets traversiert wird, wird als verarbeitet (siehe [[alGetSource]] mit Token [[alGetSource#AL_BUFFERS_PROCESSED|AL_BUFFERS_PROCESSED]]) markiert. Der Wert basiert auf der Byteposition, sodass ein mit '''AL_PITCH''' verändertes Source-Objekt eine überspitzte Abspielgeschwindigkeit hat. Zum Beispiel kann ein Puffer ein Offset von 0,50 Sekunden haben, jedoch dauert es nur 0,25 Sekunden, dahin zu gelangen, wenn der '''AL_PITCH'''-Wert auf 2,0 gesetzt ist. Für das Setzen des Offsets ist jeder Wert größer gleich 0,0 zulässig, ein Vorgabewert ist nicht definiert. Der Parameter '''AL_SEC_OFFSET''' ist nur für die Funktionsvarianten '''alSourcef''', '''alSourcefv''', '''alSourcei''' und '''alSourceiv''' zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SOURCE_RELATIVE ===&lt;br /&gt;
: Legt fest, ob die Position, Geschwindigkeit, Richtung und der Schallkegel relativ zum Listener-Objekt interpretiert werden oder nicht. Bei einem Wert von '''AL_TRUE''' sind die Angaben relativ zu sehen, bei '''AL_FALSE''' nicht. Vorgabewert ist '''AL_FALSE'''. '''AL_SOURCE_RELATIVE''' ist nur für die Funktionsvarianten '''alSourcei''' und '''alSourceiv''' als Parameterwert zulässig.&lt;br /&gt;
&lt;br /&gt;
=== AL_SOURCE_STATE ===&lt;br /&gt;
: (unvollständig)&lt;br /&gt;
&lt;br /&gt;
=== AL_VELOCITY ===&lt;br /&gt;
: Setzt die Geschwindigkeit (Schnelligkeit und Richtung) des Source-Objektes im Koordinatensystem. Jedes Tripel aus gültigen Gleitkommawerten ist erlaubt, abgesehen von [[NaN]]. Der Vorgabewert ist (0.0, 0.0, 0.0). Die Geschwindigkeit beeinflußt jedoch nicht die Position des Objektes. [[OpenAL]] berechnet die Geschwindigkeit nicht aus aufeinanderfolgenden Änderungen mit '''AL_POSITION''', ebenso wenig wird die Position des Objektes über die Zeit anhand der angegebenen Geschwindigkeit angepasst. Jede derartige Berechnung bleibt der Anwendung überlassen. Für die Belange der Soundverarbeitung sind Position und Geschwindigkeit unabhängige Parameter, die sich auf verschiedene Aspekte des Klangs auswirken. '''AL_VELOCITY''' wird von Treiber berücksichtigt, um den vom Hörer wahrgenommenen Dopplereffekt zu berechnen, was auf Grundlage der Geschwindigkeit des Source-Objektes, des Listener-Objektes und der dopplereffektbezogenen Paramater geschieht. '''AL_VELOCITY''' ist nur für die Funktionsvarianten '''alSourcefv''', '''alSource3f''', '''alSourceiv''' und '''alSource3i''' als Paramater zulässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Falls bei der Ausführung ein Fehler auftritt, kann dieser mit [[alGetError]] erfragt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
Folgende Erweiterungen hat die Funktion erfahren:&lt;br /&gt;
=== Ab OpenAL-Version 1.1 ===&lt;br /&gt;
&lt;br /&gt;
Seit OpenAL-Version 1.1 existieren auch die Funktionen für mehrere Ganzzahlwerte, '''alSource3i''' und '''alSourceiv'''.&lt;br /&gt;
&lt;br /&gt;
Ebenso sind die Token '''AL_BYTE_OFFSET''', '''AL_SAMPLE_OFFSET''' und '''AL_SEC_OFFSET''' erst ab Version 1.1 verfügbar. Jedoch gibt es dafür auch die OpenAL-Erweiterung '''AL_EXT_OFFSET''', welche von jeder Implementation der Open AL 1.1 unterstützt wird und es einer für die Spezifikation von OpenAL 1.0 geschriebenen aber auf eine Implementation der Version 1.1 zugreifenden Anwendung erlaubt, die drei genannten Tokenwerte auch zum Setzen (und Abfragen) der entsprechenden Werte zu nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''AL_INVALID_ENUM''' wird generiert, wenn der Wert für ''param'' unzulässig ist.&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_NAME''' wird generiert, sofern ''source'' kein gültiges Source-Objekt ist. (Siehe auch [[alIsSource]].)&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_OPERATION''' wird generiert, falls es keinen aktuellen Kontext gibt. (Siehe dazu auch [[alcMakeContextCurrent]].)&lt;br /&gt;
&lt;br /&gt;
'''AL_INVALID_VALUE''' wird generiert, wenn der zu setzenden Wert den zulässigen Bereich überschreitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zugehörige Wertrückgaben ==&lt;br /&gt;
[[alGetSource]] mit den oben genannten Tokenwerten liefert die gesetzten Werte zurück.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[alGetSource]], [[alListener]] (analoge Funktion für Listener-Objekte)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AL|Source]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=OpenAL&amp;diff=24329</id>
		<title>OpenAL</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=OpenAL&amp;diff=24329"/>
				<updated>2009-11-22T11:46:14Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Alternativen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''OpenAL''' ('''Open A'''udio '''L'''ibrary) ist eine plattformunabhängige [[3D Audio|3D Audio-API]]. Sie ist das Sound-Pendant zu [[OpenGL]] und somit die offene Konkurrenz zu DirectSound.&lt;br /&gt;
&lt;br /&gt;
Dieses Wiki verfügt über eine deutschsprachige Übersetzung der OpenAL Spezifikation. Diese ist unter [[OpenAL-Funktionsübersicht]] zu finden.&lt;br /&gt;
&lt;br /&gt;
==Spezifikation==&lt;br /&gt;
Ähnlich [[OpenGL]], handelt es sich bei OpenAL lediglich um die Spezifikation einer Schnittstelle. Diese sieht unter anderem das Positionieren von Audioquellen im 3D-Raum vor. Implementierungen sind zudem in der Lage Lautstärke und Tonhöhe jeder Audioquelle zu verändern und zudem den [[Dopplereffekt]] zu simulieren.&lt;br /&gt;
&lt;br /&gt;
Die OpenAL-Spezifikation wurde von Creative herausgegeben und ist als direkter Konkurent zu Microsoft's Direct Sound zu sehen. Ähnlich OpenGL ist eine Schnittstelle zum Einfügen von Erweiterungen vorgesehen.&lt;br /&gt;
&lt;br /&gt;
Neben Hardwarebeschleunigten implementierungen der Bibliothek finden sich auch zahlreiche Softwarerenderer, zum Beispiel [http://kcat.strangesoft.net/openal.html OpenAL-Soft]. OpenAL ist leicht auf verschiedene Plattformen zu portieren und es existieren Bindings für verschiedene Programmiersprachen.&lt;br /&gt;
&lt;br /&gt;
OpenAL wird bereits in zahlreichen Spieletiteln verwendet.&lt;br /&gt;
&lt;br /&gt;
==Vor- und Nachteile==&lt;br /&gt;
Zwar bietet OpenAL meist (unter Windows &amp;gt;= Vista) die einzige Möglichkeit hardwarebeschleunigtes 3D-Audio auszugeben, jedoch ist nur für bestimmte, teure Soundkarten eine entsprechende Hardwareunterstützung vorhanden. Für die meisten (OnBoard-)Soundkarten bildet OpenAL lediglich eine weitere Abstrahierungsschicht vor weiteren Audiobibliotheken wie WaveOut, DirectSound, ALSA, PulseAudio, OSS etc. Dies ist nicht unbedingt der Latenzzeit zuträglich.&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/ee416960%28VS.85%29.aspx DirectSound] - von Microsoft entwickelte Schnittstelle für die Ausgabe von (3D-)Audio, nur unter Windows lauffähig&lt;br /&gt;
* [[SDL]] beinhaltet ebenfalls eine Bibliothek zur Audioausgabe&lt;br /&gt;
* [http://audorra.sourceforge.net/ Audorra] - eine Plattformübergreifende Audiobibliothek für Pascal (noch in der Entwicklung)&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/OpenAL Wikipedia-Artikel zu OpenAL]&lt;br /&gt;
* [http://connect.creativelabs.com/openal/default.aspx Offizielle Website zu OpenAL]&lt;br /&gt;
* [http://www.noeska.com/doal Bindings für Pascal, Windows und Linux]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=OpenAL&amp;diff=24328</id>
		<title>OpenAL</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=OpenAL&amp;diff=24328"/>
				<updated>2009-11-22T11:44:50Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''OpenAL''' ('''Open A'''udio '''L'''ibrary) ist eine plattformunabhängige [[3D Audio|3D Audio-API]]. Sie ist das Sound-Pendant zu [[OpenGL]] und somit die offene Konkurrenz zu DirectSound.&lt;br /&gt;
&lt;br /&gt;
Dieses Wiki verfügt über eine deutschsprachige Übersetzung der OpenAL Spezifikation. Diese ist unter [[OpenAL-Funktionsübersicht]] zu finden.&lt;br /&gt;
&lt;br /&gt;
==Spezifikation==&lt;br /&gt;
Ähnlich [[OpenGL]], handelt es sich bei OpenAL lediglich um die Spezifikation einer Schnittstelle. Diese sieht unter anderem das Positionieren von Audioquellen im 3D-Raum vor. Implementierungen sind zudem in der Lage Lautstärke und Tonhöhe jeder Audioquelle zu verändern und zudem den [[Dopplereffekt]] zu simulieren.&lt;br /&gt;
&lt;br /&gt;
Die OpenAL-Spezifikation wurde von Creative herausgegeben und ist als direkter Konkurent zu Microsoft's Direct Sound zu sehen. Ähnlich OpenGL ist eine Schnittstelle zum Einfügen von Erweiterungen vorgesehen.&lt;br /&gt;
&lt;br /&gt;
Neben Hardwarebeschleunigten implementierungen der Bibliothek finden sich auch zahlreiche Softwarerenderer, zum Beispiel [http://kcat.strangesoft.net/openal.html OpenAL-Soft]. OpenAL ist leicht auf verschiedene Plattformen zu portieren und es existieren Bindings für verschiedene Programmiersprachen.&lt;br /&gt;
&lt;br /&gt;
OpenAL wird bereits in zahlreichen Spieletiteln verwendet.&lt;br /&gt;
&lt;br /&gt;
==Vor- und Nachteile==&lt;br /&gt;
Zwar bietet OpenAL meist (unter Windows &amp;gt;= Vista) die einzige Möglichkeit hardwarebeschleunigtes 3D-Audio auszugeben, jedoch ist nur für bestimmte, teure Soundkarten eine entsprechende Hardwareunterstützung vorhanden. Für die meisten (OnBoard-)Soundkarten bildet OpenAL lediglich eine weitere Abstrahierungsschicht vor weiteren Audiobibliotheken wie WaveOut, DirectSound, ALSA, PulseAudio, OSS etc. Dies ist nicht unbedingt der Latenzzeit zuträglich.&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/ee416960%28VS.85%29.aspx DirectSound] - von Microsoft entwickelte Schnittstelle für die Ausgabe von (3D-)Audio, nur unter Windows lauffähig&lt;br /&gt;
* [http://audorra.sourceforge.net/ Audorra] - eine Plattformübergreifende Audiobibliothek für Pascal (noch in der Entwicklung)&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/OpenAL Wikipedia-Artikel zu OpenAL]&lt;br /&gt;
* [http://connect.creativelabs.com/openal/default.aspx Offizielle Website zu OpenAL]&lt;br /&gt;
* [http://www.noeska.com/doal Bindings für Pascal, Windows und Linux]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:surround_sound_7_1.png&amp;diff=24314</id>
		<title>Datei:surround sound 7 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:surround_sound_7_1.png&amp;diff=24314"/>
				<updated>2009-11-07T17:30:35Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: Anordnung der Lautsprecher in einem 7.1 System.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anordnung der Lautsprecher in einem 7.1 System.&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24313</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24313"/>
				<updated>2009-11-07T17:30:09Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Gängige Lautsprecheranordnungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Kanalabhängige Lautstärkeberechnung==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Soll ein Soundeffekt in einer Lautsprecherumgebung wiedergegeben werden, so muss man in der Lage sein in Abhängigkeit vom Winkel des Effektes zum Hörer den Amplitudenfaktor für jeden Lautsprecherkanal zu berechnen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden die Vektoren vx und v(x+1) als Basis für einen Vektorraum angesehen. Nun wird der Richtungsvektor s1 in diesen Vektorraum übersetzt und normalisiert. Die X-Komponente des somit entstandenen Vektors wird auf den Amplitudenfaktor (gf, &amp;quot;Gain Factor&amp;quot;) des Lautsprechers X und die Y-Komponente auf die des Lautsprechers X+1 addiert, sofern deren Wert &amp;gt; 0. Dies wird für alle Lautsprecher X wiederholt. Die entstandenen Faktoren werden durch zwei geteilt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:surround_sound_eq01.png]]&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_calc01.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''7.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwei weitere Lautsprecher vervollständigen den Raumklang bei einem 7.1 System.&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Side Left&lt;br /&gt;
| -90°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -150°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 150°&lt;br /&gt;
|-&lt;br /&gt;
|Side Right&lt;br /&gt;
| 90°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_7_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie| Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf| Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24312</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24312"/>
				<updated>2009-11-07T17:25:09Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Kanalabhängige Lautstärkeberechnung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Kanalabhängige Lautstärkeberechnung==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Soll ein Soundeffekt in einer Lautsprecherumgebung wiedergegeben werden, so muss man in der Lage sein in Abhängigkeit vom Winkel des Effektes zum Hörer den Amplitudenfaktor für jeden Lautsprecherkanal zu berechnen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden die Vektoren vx und v(x+1) als Basis für einen Vektorraum angesehen. Nun wird der Richtungsvektor s1 in diesen Vektorraum übersetzt und normalisiert. Die X-Komponente des somit entstandenen Vektors wird auf den Amplitudenfaktor (gf, &amp;quot;Gain Factor&amp;quot;) des Lautsprechers X und die Y-Komponente auf die des Lautsprechers X+1 addiert, sofern deren Wert &amp;gt; 0. Dies wird für alle Lautsprecher X wiederholt. Die entstandenen Faktoren werden durch zwei geteilt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:surround_sound_eq01.png]]&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_calc01.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie| Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf| Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24311</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24311"/>
				<updated>2009-11-07T17:20:10Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Kanalabhängige Lautstärkeberechnung==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Soll ein Soundeffekt in einer Lautsprecherumgebung wiedergegeben werden, so muss man in der Lage sein in Abhängigkeit vom Winkel des Effektes zum Hörer den Amplitudenfaktor für jeden Lautsprecherkanal zu berechnen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden die Vektoren vx und v(x+1) als Basis für einen Vektorraum angesehen. Nun wird der Richtungsvektor s1 in diesen Vektorraum übersetzt und normalisiert. Die X-Komponente des somit entstandenen Vektors wird auf den Amplitudenfaktor (gf, &amp;quot;Gain Factor&amp;quot;) des Lautsprechers X und die Y-Komponente auf die des Lautsprechers X+1 addiert, sofern deren Wert &amp;gt; 0. Dies wird für alle Lautsprecher X wiederholt. Die entstandenen Faktoren werden durch zwei geteilt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:surround_sound_eq01.png]]&lt;br /&gt;
|[[Datei:surround_sound_calc01.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie| Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf| Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24310</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24310"/>
				<updated>2009-11-07T17:19:55Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Kanalabhängige Lautstärkeberechnung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Kanalabhängige Lautstärkeberechnung==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Soll ein Soundeffekt in einer Lautsprecherumgebung wiedergegeben werden, so muss man in der Lage sein in Abhängigkeit vom Winkel des Effektes zum Hörer den Amplitudenfaktor für jeden Lautsprecherkanal zu berechnen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden die Vektoren vx und v(x+1) als Basis für einen Vektorraum angesehen. Nun wird der Richtungsvektor s1 in diesen Vektorraum übersetzt und normalisiert. Die X-Komponente des somit entstandenen Vektors wird auf den Amplitudenfaktor (gf, &amp;quot;Gain Factor&amp;quot;) des Lautsprechers X und die Y-Komponente auf die des Lautsprechers X+1 addiert, sofern deren Wert &amp;gt; 0. Dies wird für alle Lautsprecher X wiederholt. Die entstandenen Faktoren werden durch zwei geteilt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:surround_sound_eq01.png]]&lt;br /&gt;
|[[Datei:surround_sound_calc01.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie| Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf| Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24309</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24309"/>
				<updated>2009-11-07T17:18:52Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Kanalabhängige Lautstärkeberechnung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Kanalabhängige Lautstärkeberechnung==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Soll ein Soundeffekt in einer Lautsprecherumgebung wiedergegeben werden, so muss man in der Lage sein in Abhängigkeit vom Winkel des Effektes zum Hörer den Amplitudenfaktor für jeden Lautsprecherkanal zu berechnen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden die Vektoren vx und v(x+1) als Basis für einen Vektorraum angesehen. Nun wird der Richtungsvektor s1 in diesen Vektorraum übersetzt und normalisiert. Die X-Komponente des somit entstandenen Vektors wird auf den Amplitudenfaktor des Lautsprechers X und die Y-Komponente auf die des Lautsprechers X+1 addiert, sofern deren Wert &amp;gt; 0. Dies wird für alle Lautsprecher X wiederholt. Die entstandenen Faktoren werden durch zwei geteilt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:surround_sound_eq01.png]]&lt;br /&gt;
|[[Datei:surround_sound_calc01.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie| Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf| Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:surround_sound_calc01.png&amp;diff=24308</id>
		<title>Datei:surround sound calc01.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:surround_sound_calc01.png&amp;diff=24308"/>
				<updated>2009-11-07T17:18:12Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:surround_sound_eq01.png&amp;diff=24307</id>
		<title>Datei:surround sound eq01.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:surround_sound_eq01.png&amp;diff=24307"/>
				<updated>2009-11-07T17:17:51Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24306</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24306"/>
				<updated>2009-11-07T17:17:39Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Kanalabhängige Lautstärkeberechnung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Kanalabhängige Lautstärkeberechnung==&lt;br /&gt;
Soll ein Soundeffekt in einer Lautsprecherumgebung wiedergegeben werden, so muss man in der Lage sein in Abhängigkeit vom Winkel des Effektes zum Hörer den Amplitudenfaktor für jeden Lautsprecherkanal zu berechnen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden die Vektoren vx und v(x+1) als Basis für einen Vektorraum angesehen. Nun wird der Richtungsvektor s1 in diesen Vektorraum übersetzt und normalisiert. Die X-Komponente des somit entstandenen Vektors wird auf den Amplitudenfaktor des Lautsprechers X und die Y-Komponente auf die des Lautsprechers X+1 addiert, sofern deren Wert &amp;gt; 0. Dies wird für alle Lautsprecher X wiederholt. Die entstandenen Faktoren werden durch zwei geteilt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:surround_sound_eq01.png]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:surround_sound_calc01.png]]&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie| Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf| Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24305</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24305"/>
				<updated>2009-11-07T17:09:18Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Kanalabhängige Lautstärkeberechnung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Kanalabhängige Lautstärkeberechnung==&lt;br /&gt;
Soll ein Soundeffekt in einer Lautsprecherumgebung wiedergegeben werden, so muss man in der Lage sein in Abhängigkeit vom Winkel des Effektes zum Hörer den Amplitudenfaktor für jeden Lautsprecherkanal zu berechnen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden die Vektoren vx und v(x+1) als Basis für einen Vektorraum angesehen. Nun wird der Richtungsvektor s1 in diesen Vektorraum übersetzt und normalisiert. Die X-Komponente des somit entstandenen Vektors wird auf den Amplitudenfaktor des Lautsprechers X und die Y-Komponente auf die des Lautsprechers X+1 addiert, sofern deren Wert &amp;gt; 0. Dies wird für alle Lautsprecher X wiederholt. Die entstandenen Faktoren werden durch zwei geteilt.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie| Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf| Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24304</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24304"/>
				<updated>2009-11-07T16:55:42Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Kanalabhängige Lautstärkeberechnung==&lt;br /&gt;
Soll ein Soundeffekt in einer Lautsprecherumgebung wiedergegeben werden, so muss man in der Lage sein in Abhängigkeit vom Winkel des Effektes zum Hörer den Amplitudenfaktor für jeden Lautsprecherkanal zu berechnen.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie| Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf| Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24303</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24303"/>
				<updated>2009-11-07T16:50:44Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Gängige Lautsprecheranordnungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden. Der Kanal für den Subwoofer wird als LFE-Channel (Low Frequency Effects) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie|Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf|Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:surround_sound_5_1.png&amp;diff=24302</id>
		<title>Datei:surround sound 5 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:surround_sound_5_1.png&amp;diff=24302"/>
				<updated>2009-11-07T16:49:38Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: Anordnung der Lautsprecher in einem 5.1 Surround System.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anordnung der Lautsprecher in einem 5.1 Surround System.&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24301</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24301"/>
				<updated>2009-11-07T16:49:08Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Gängige Lautsprecheranordnungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''5.1 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim 5.1 Surround System existieren - im Gegensatz zur Quadrophonie - zwei weitere Lautsprecher. Ein zusätzlicher &amp;quot;Center&amp;quot; Lautsprecher sorgt für die notwendige Auflösung im Frontalbereich des Hörers. Dabei sind die &amp;quot;Front-Left&amp;quot; und &amp;quot;Front-Right&amp;quot; Lautsprecher nicht mehr im 45° sondern im 30° Winkel angeordnet.&lt;br /&gt;
&lt;br /&gt;
Ein so genannter Subwoofer ist für die wiedergabe niedriger Frequenzen verantwortlich. Da Töne einer Frequenz unterhalb einer gewissen Schwelle nicht mehr lokalisiert werden können, ist die Position des Subwoofers unerheblich für den Raumklang. Gleichzeitig müssen die Satelitenlautsprecher keine niedrigen Frequenzen mehr wiedergeben und können somit kompakter gebaut werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -110°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 110°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 30°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_5_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie|Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf|Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:surround_sound_3_0.png&amp;diff=24300</id>
		<title>Datei:surround sound 3 0.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:surround_sound_3_0.png&amp;diff=24300"/>
				<updated>2009-11-07T16:39:58Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: Anordnung der Lautsprecher in einem 3.0 Lautsprecher System.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anordnung der Lautsprecher in einem 3.0 Lautsprecher System.&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24299</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24299"/>
				<updated>2009-11-07T16:39:36Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Gängige Lautsprecheranordnungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Stereo (2.0)'''&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Lautsprecher, die im Optimalfall im 45° vom Hörer weg angeordnet sind, bilden das Stereo System. Töne, die hinter dem Betrachter ausgestrahlt werden können nicht wahrgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_2_0.png]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''3.0 Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Drei Lautsprecher bilden eine &amp;quot;Linie&amp;quot;. Somit können Soundeffekte, die sich im vorderen Bereich des Hörers befinden recht gut aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -30°&lt;br /&gt;
|-&lt;br /&gt;
|Center&lt;br /&gt;
| 0°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 35°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_3_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie|Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf|Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:surround_sound_2_0.png&amp;diff=24298</id>
		<title>Datei:surround sound 2 0.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:surround_sound_2_0.png&amp;diff=24298"/>
				<updated>2009-11-07T16:39:13Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: Anordnung der Lautsprecher in einem 2.0 Stereo System.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anordnung der Lautsprecher in einem 2.0 Stereo System.&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24297</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24297"/>
				<updated>2009-11-07T16:32:09Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie|Wikipedia: Quadrofonie]&lt;br /&gt;
* [http://lib.tkk.fi/Diss/2001/isbn9512255324/article1.pdf|Paper &amp;quot;Virtual Sound Source Positioning&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24296</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24296"/>
				<updated>2009-11-07T16:03:18Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Gängige Lautsprecheranordnungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie|Wikipedia: Quadrofonie]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24295</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24295"/>
				<updated>2009-11-07T15:24:55Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet. Hierzu werden Bibliotheken wie [[OpenAL]] oder [[DirectSound]] eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie|Wikipedia: Quadrofonie]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24294</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24294"/>
				<updated>2009-11-07T15:23:58Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter '''3D Audio''' versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Während z.B. bei Filmen die &amp;quot;Surround&amp;quot;-Toninformationen nebst Effekten für alle Lautsprecher vorberechnet sind, werden diese bei Computerspielen in Echtzeit für jeden Lautsprecher berechnet.&lt;br /&gt;
&lt;br /&gt;
==Gängige Lautsprecheranordnungen==&lt;br /&gt;
&lt;br /&gt;
In der nachfolgenen Tabelle werden die heute gängigen Lautsprecheranordnungen für Surroundsound Systeme &lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Quadrofonie|Wikipedia: Quadrofonie]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24293</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24293"/>
				<updated>2009-11-07T15:19:26Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter 3D Audio versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''System'''&lt;br /&gt;
|'''Beispielanordnung'''&lt;br /&gt;
|-&lt;br /&gt;
|'''4.0 Surround Sound'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bei 4.0 Surround Sound sind vier Lautsprecher im Winkel von je 90° um den Hörer angeordnet. Diese Technik, auch als &amp;quot;Quadrophonie&amp;quot; bezeichnet, fand schon in den 1970er Jahren Anwendung, als ein Nachfolgeformat zu Stereo etabliert werden sollte. Die naheliegende Vermutung, mit 4x90° das gesammte Hörfeld abdecken zu können und somit einen echten räumlichen Klang zu erzeugen, erwies sich jedoch als falsch. Heutzutage findet man seltener Anlagen mit 4 Lautsprechern - eher werden 6 (5.1) oder 8 (7.1) Lautsprecher verwendet.&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable_B1}}&lt;br /&gt;
|-&lt;br /&gt;
|'''Lautsprecher'''&lt;br /&gt;
|'''Winkel'''&lt;br /&gt;
|-&lt;br /&gt;
|Front Left&lt;br /&gt;
| -45°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Left&lt;br /&gt;
| -135°&lt;br /&gt;
|-&lt;br /&gt;
|Rear Right&lt;br /&gt;
| 135°&lt;br /&gt;
|-&lt;br /&gt;
|Front Right&lt;br /&gt;
| 45°&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:surround_sound_4_0.png&amp;diff=24292</id>
		<title>Datei:surround sound 4 0.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:surround_sound_4_0.png&amp;diff=24292"/>
				<updated>2009-11-07T15:03:29Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: Anordnung der Lautsprecher in einem 4.0 Surround System.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anordnung der Lautsprecher in einem 4.0 Surround System.&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24291</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24291"/>
				<updated>2009-11-07T14:58:24Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter 3D Audio versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:surround_sound_4_0.png]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24290</id>
		<title>3D Audio</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=3D_Audio&amp;diff=24290"/>
				<updated>2009-11-07T14:37:28Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: Die Seite wurde neu angelegt: „{{Unvollständig}}  Unter 3D Audio versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an eine…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
&lt;br /&gt;
Unter 3D Audio versteht man allgemein die Wiedergabe von Soundeffekten über mehr als zwei Lautsprecher. Die Soundeffekte werden dabei an einen virtuellen Emitter gekoppelt und je nach Winkel und Entfernung zu einem virtuellen Hörer mit unterschiedlicher Lautstärke auf den Lautsprechern ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Durch die Kopplung mit verschiedensten Audioeffekten (Reverb, High-/Lowpass Filter) soll somit ein möglichst realistischer Raumklangeindruck erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[OpenAL]]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=OpenAL&amp;diff=24289</id>
		<title>OpenAL</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=OpenAL&amp;diff=24289"/>
				<updated>2009-11-07T14:35:09Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''OpenAL''' ('''Open A'''udio '''L'''ibrary) ist eine plattformunabhängige [[3D Audio|3D Audio-API]]. Sie ist das Sound-Pendant zu [[OpenGL]] und somit die offene Konkurrenz zu DirectSound.&lt;br /&gt;
&lt;br /&gt;
Dieses Wiki verfügt über eine deutschsprachige Übersetzung der OpenAL Spezifikation. Diese ist unter [[OpenAL-Funktionsübersicht]] zu finden.&lt;br /&gt;
&lt;br /&gt;
==Laut Wikipedia==&lt;br /&gt;
Wikipedia liefert dazu folgende Informationen:&lt;br /&gt;
&lt;br /&gt;
Mit OpenAL lassen sich Soundeffekte wie Raumklang und Dopplereffekt erstellen und einbinden, auch Hardwarebeschleunigung wird unterstützt.&lt;br /&gt;
&lt;br /&gt;
OpenAL unterliegt in weiten Teilen der LGPL und liegt aktuell in der Version 1.1 vor.&lt;br /&gt;
&lt;br /&gt;
Die OpenAL-API kann und soll als Ergänzung zur Grafik-API OpenGL gesehen werden, daher wurde bei der Entwicklung besonders auf Angleichung von Aufbau, Programmierstil und Namenskonventionen geachtet. Zudem ist OpenAL ebenfalls in der Sprache C geschrieben.&lt;br /&gt;
&lt;br /&gt;
Durch die kombinierte Nutzung der beiden Bibliotheken ist eine hohe Portierbarkeit gewährleistet. Ebenso wie bei OpenGL gibt es OpenAL-Implementierungen für zahlreiche Plattformen und Programmiersprachen.&lt;br /&gt;
&lt;br /&gt;
OpenAL ist als direkter Konkurrent zu Microsofts DirectSound (Bestandteil von DirectX) anzusehen. Dank der guten Portierbarkeit hat OpenAL dennoch bis heute eine recht weite Verbreitung gefunden, so gibt es bereits zahlreiche Programme, Spiele und Engines, die OpenAL nutzen.&lt;br /&gt;
&lt;br /&gt;
Für weitere Details verweisen wir hier auf den [http://de.wikipedia.org/wiki/OpenAL Wikipedia-Artikel zu OpenAL]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=OpenAL&amp;diff=24288</id>
		<title>OpenAL</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=OpenAL&amp;diff=24288"/>
				<updated>2009-11-07T14:26:54Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''OpenAL''' ('''Open A'''udio '''L'''ibrary) ist eine plattformunabhängige [[3D Audio-API|3D Audio]]. Sie ist das Sound-Pendant zu [[OpenGL]] und somit die offene Konkurrenz zu DirectSound.&lt;br /&gt;
&lt;br /&gt;
Dieses Wiki verfügt über eine deutschsprachige Übersetzung der OpenAL Spezifikation. Diese ist unter [[OpenAL-Funktionsübersicht]] zu finden.&lt;br /&gt;
&lt;br /&gt;
==Laut Wikipedia==&lt;br /&gt;
Wikipedia liefert dazu folgende Informationen:&lt;br /&gt;
&lt;br /&gt;
Mit OpenAL lassen sich Soundeffekte wie Raumklang und Dopplereffekt erstellen und einbinden, auch Hardwarebeschleunigung wird unterstützt.&lt;br /&gt;
&lt;br /&gt;
OpenAL unterliegt in weiten Teilen der LGPL und liegt aktuell in der Version 1.1 vor.&lt;br /&gt;
&lt;br /&gt;
Die OpenAL-API kann und soll als Ergänzung zur Grafik-API OpenGL gesehen werden, daher wurde bei der Entwicklung besonders auf Angleichung von Aufbau, Programmierstil und Namenskonventionen geachtet. Zudem ist OpenAL ebenfalls in der Sprache C geschrieben.&lt;br /&gt;
&lt;br /&gt;
Durch die kombinierte Nutzung der beiden Bibliotheken ist eine hohe Portierbarkeit gewährleistet. Ebenso wie bei OpenGL gibt es OpenAL-Implementierungen für zahlreiche Plattformen und Programmiersprachen.&lt;br /&gt;
&lt;br /&gt;
OpenAL ist als direkter Konkurrent zu Microsofts DirectSound (Bestandteil von DirectX) anzusehen. Dank der guten Portierbarkeit hat OpenAL dennoch bis heute eine recht weite Verbreitung gefunden, so gibt es bereits zahlreiche Programme, Spiele und Engines, die OpenAL nutzen.&lt;br /&gt;
&lt;br /&gt;
Für weitere Details verweisen wir hier auf den [http://de.wikipedia.org/wiki/OpenAL Wikipedia-Artikel zu OpenAL]&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_OpenGL3_Scissor_Clipping_DepthTest&amp;diff=24286</id>
		<title>Tutorial OpenGL3 Scissor Clipping DepthTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_OpenGL3_Scissor_Clipping_DepthTest&amp;diff=24286"/>
				<updated>2009-11-04T15:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Tiefen-Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Clipping, Scissor und Tiefen-Test=&lt;br /&gt;
Clipping, Scissor und Tiefen-Test sind Optimierungsprozesse welche dafür sorgen, dass der Datenpool minimiert wird. Dabei ist die Clipping Funktion dafür zuständig Vertice und damit verbundene Daten aus der Renderpipeline zu werfen. Die Scissor Funktion soll den Shading-Prozess beschleunigen, also das errechnen der Pixelfarben für ein Dreieck reduzieren.&lt;br /&gt;
Der Tiefen-Test hat die gleiche Aufgabe wie der Scissor-Test aber reduziert die Datenmenge auf Basis anderer Informationen und soll zugleich das korrekte Zeichnen von sich überschneidender Geometry ermöglichen.&lt;br /&gt;
&lt;br /&gt;
==Clipping==&lt;br /&gt;
Der Clipping-Prozess wird nach dem errechnen der Vertexpositionen auf dem Monitor durch geführt. Diese erhält man durch das Multiplizieren der Projektionsmatrix mit der Modelviewmatrix und dem anschliessenden multiplizieren mit der Vertexposition. Die neue Vertexposition hat zwar noch 4 Komponenten aber beim Clipping werden nur X und Y betrachtet.&lt;br /&gt;
Man muss in allen OpenGL Versionen den Viewport einstellen, indem man [[glViewport]] verwendet.&lt;br /&gt;
Als Parameter übergibt man X,Y,Width und Height, welche zusammen ein Rechteck ergeben.&lt;br /&gt;
Dieses Rechteck ist nun der gültige Sichtebereich und alles ausserhalb von diesen ist nicht sichtbar und wird damit nicht in der Renderpipeline benötigt. Wenn nun also ein Dreieck nicht das Rechteck schneidet, dann wird es aus der Renderpipeline entfernt. Dies reduziert die zu behandelnden Dreiecke in den Anschliessenden Prozessschritten und spart Zeit ein.&lt;br /&gt;
&lt;br /&gt;
==Scissor==&lt;br /&gt;
Der Scissor-Prozess wird vor dem Fragmentshader durch geführt, dieser Schritt muss nicht durchgeführt werden. Der Scissor-Test kann über [[glEnable#GL_SCISSOR_TEST]] aktiviert werden und mit Hilfe von [[glScissor]] konfiguriert werden. Genau wie beim Clipping wird die X und Y Koordinate des Bildschirmpixels als Eingabe genommen aber im gegensatz zum Clipping-Test wird im Scissor-Test nur ein X/Y Wertepaar benötigt und nicht 3. Der Test ist daher recht einfach und kann bei komplexeren Shadern immense Summen an Zeit herraus holen. Folgender Code zeigt ein einfachen InBound check.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;bool InBoundCheck(const int X, const int Y, const int RectX, const int RectY, const unsigned int RectWidth, const unsigned int RectHeight)&lt;br /&gt;
{&lt;br /&gt;
  if ((X&amp;lt;=RectX+RectWidth) &amp;amp;&amp;amp; (X&amp;gt;=RectX))&lt;br /&gt;
    if ((Y&amp;lt;=RectY+RectHeight) &amp;amp;&amp;amp; (Y&amp;gt;=RectY))&lt;br /&gt;
      return true;&lt;br /&gt;
  return false;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Alle Pixel, die den Test bestehen, werden dann an den Fragmentshader weiter gereicht und der rest wird einfach verworfen.&lt;br /&gt;
Wenn ein Shader sehr komplex ist und z.B. mehrere Texelzugriffe macht, AntiAliasing aktiviert ist und/oder komplexe Berechnungen im Fragmentshader getan werden, dann kann durch das Verwerfen von Pixeln viel Zeit eingespart werden.&lt;br /&gt;
&lt;br /&gt;
==Tiefen-Test==&lt;br /&gt;
Der Tiefen-Test wird nach dem Scissor-Test ausgeführt und soll die Anzahl der zu verarbeitenden Pixel reduzieren und Dreiecksüberschneidungen korrekt darstellen. &lt;br /&gt;
Wenn man in einen Artikel, Blog oder Forum von Overdraw redet, dann hat dies mit dem Tiefen-Test zu tun. Overdraw ist der Zustand, wenn ein Bildschirmpixel mehrfach gezeichnet wird, also mehrere Dreiecke die gleiche X-,Y-Koordinate auf dem Bildschirm haben.&lt;br /&gt;
Der Tiefen-Test betrachtet die Z-Koordinate von dem Bildschirmpixel und schaut in einen Tiefenpuffer nach, ob das Fragment(aktueller Pixel vom Dreieck) sichtbar wäre. Jedes Fragment, welches durch ein Dreieck in der Pipeline verarbeitet wird, besitzt einen Tiefenwert Z und dieser wird in dem Tiefenpuffer Hinterlegt. Wenn man mit [[glEnable#GL_DEPTH_TEST]] den Tiefen-Test aktiviert, dann wird jedes Fragment mit einer definierten Funktion verarbeitet. Diese Funktion kann über [[glDepthFunc]] fest gelegt werden. Wenn die Funktion erfolgreich ist und true zurück gibt, dann wird der Z Wert in den Tiefenpuffer eingetragen und wird anschliessend vom Fragmentshader verarbeitet. Sollte der Test negativ ausfallen, dann wird der Tiefenwert nicht geschrieben und das Fragment verworfen.&lt;br /&gt;
Es ist sinnvoll, die Tiefen-Test Funktion nur auf kleinere oder gleiche Z Werte, als im Tiefenpuffer, fest zu legen. Wenn man nun seine Dreiecke von vorne nach hinten sortiert und rendert, dann werden nur die vordersten Fragmente, der Dreiecke gezeichnet. Sollten man die Dreiecke von hinten nach vorne zeichnen, dann wird jedes Fragment in der Szene durch den Fragmentshader geschliffen und die Framerate bricht stark ein. &lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nvidia und ATI empfehlen das Rendern in 2 Schritten zu vollziehen. Im ersten Schritt wird mit Hilfe von [[glColorMask]] alle Kanälle ab geschalten, mit [[glDepthMask]] der Tiefenpuffer schreibar gemacht, der Tiefen-Test aktiviert, der Tiefen- und Farbpuffer geleert, die Texturen deaktivert([[glDisable#GL_TEXTURE_2D]]) und die nicht Transparente Geometry gezeichnet. Dieser Schritt ist zum erfassen der Z-Koordinaten. Anschliessend aktiviert man wieder alle Farbkanälle, deaktiviert das schreiben im Tiefenpuffer, Texturen und zeichnet nun ganz normal seine nicht Transparente Geometry und dann die Transparente. Dieses 2 Schritt verfahren ist um ein vielfaches schneller und wird umso schneller, je komplexer Geometry und Shader werden.}}&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&amp;diff=24273</id>
		<title>Kategorie Diskussion:Exzellent</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&amp;diff=24273"/>
				<updated>2009-11-02T21:14:41Z</updated>
		
		<summary type="html">&lt;p&gt;Igel457: /* Kandidatenliste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Voraussetzungen für Exzellente Artikel=&lt;br /&gt;
Hier könnt ihr Artikel vorschlagen welche ihr als &amp;quot;exzellenten Artikel&amp;quot; einstufen würdet.&lt;br /&gt;
&lt;br /&gt;
Folgende Punkte '''müssen''' erfüllt sein:&lt;br /&gt;
* Kein Sackgassenartikel - Artikel muss auf andere Artikel direkt (nicht über Code) verlinken&lt;br /&gt;
* Kein Plain Text - Artikel muss eine einheitliche Formatierung aufweisen&lt;br /&gt;
* Bilder - Artikel muss mindestens ein Bild/Grafik besitzen&lt;br /&gt;
* Umfassend - Der Artikel muss das Thema umfassend behandeln.&lt;br /&gt;
* Kein Tutorial - Der Artikel darf nicht der [[:Kategorie:Tutorial|Kategorie Tutorial]] angehören.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit ein Artikel als '''exzellent''' eingestuft wird müssen:&lt;br /&gt;
* 3 Wiki-User der Wahl zustimmen darunter mindestens ein Moderator,&lt;br /&gt;
* keine Gegenstimmen bestehen,&lt;br /&gt;
* die Voraussetzungen von oben gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kandidatenliste=&lt;br /&gt;
Um einen Artikel zur Kandidatenliste hinzuzufügen bitte den Nachfolgenden Code vor dem Ende (&amp;quot;&amp;lt;nowiki&amp;gt;|}&amp;lt;/nowiki&amp;gt;&amp;quot;) der Tabelle einfügen:&lt;br /&gt;
&lt;br /&gt;
 |&amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
Um eine Stimme abzugeben, kopiert ihr bitte den Wiki-Code &amp;quot;&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&amp;quot; in die entsprechende Spalte. Das Wiki generiert daraus eure Unterschrift (Signatur).&lt;br /&gt;
&lt;br /&gt;
Falls ihr eine Gegenstimme abgebt, muss eine Begründung dazu gegeben werden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Vorgeschlagener Artikel&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Beführworter&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Gegner&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Begründung für Gegenstimme / Diskussion&lt;br /&gt;
|-&lt;br /&gt;
| [[glTexParameter]]&lt;br /&gt;
| &lt;br /&gt;
| --[[Benutzer:Flash|Flash]] 09:56, 11. Jan 2007 (CET)&lt;br /&gt;
|Wenn jemand noch die restlichen Wrapmodes einbaut sicher ein guter kandidat  (GL_CLAMP_TO_EDGE,  GL_CLAMP_TO_BORDER,GL_MIRRORED_REPEAT laut glitmap.pas) (Winner)&lt;br /&gt;
&lt;br /&gt;
Stimme Winner zu. Ohne die ergänzungen kommt der Artikel nicht in Frage.&lt;br /&gt;
|-&lt;br /&gt;
|[[gluCylinder]]&lt;br /&gt;
| --[[Benutzer:Flash|Flash]] 09:09, 10. Apr. 2008 (UTC)&lt;br /&gt;
--[[Benutzer:Igel457|Igel457]] 22:14, 2. Nov. 2009 (CET)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
Guter und anschaulicher Artikel, wenn auch GLU-Funktionen im Allgemeinen vermieden werden sollten --[[Benutzer:Igel457|Igel457]] 22:14, 2. Nov. 2009 (CET)&lt;br /&gt;
|-&lt;br /&gt;
|[[Raytracing]]&lt;br /&gt;
| &lt;br /&gt;
| --[[Benutzer:I0n0s|I0n0s]] 13:25, 10. Dez. 2008 (UTC)&lt;br /&gt;
--[[Benutzer:Delphic|Delphic]] 17:14, 10. Dez. 2008 (UTC)&lt;br /&gt;
|&lt;br /&gt;
# Es existieren 2 Tutorials zu dem Thema.&lt;br /&gt;
# Ist nur als Oberflächliche Information konzipiert und enthält keine Information, wie die Techniken tatsächlich zu verwenden sind.&lt;br /&gt;
&lt;br /&gt;
Ok. Bis der Artikel das Thema etwas besser &amp;quot;ausleuchtet&amp;quot; ;) bleibt das Veto stehen. Die Tutorials sprechen nicht dagegen. --[[Benutzer:Flash|Flash]] 17:58, 10. Dez. 2008 (UTC)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswahlkriterien ==&lt;br /&gt;
&lt;br /&gt;
Ich finde die Asuwahlkriterien etwas strange. Schließlich sind Tutorials auch Artikel und in den meisten Fällen noch dazu ziemlich gute. Warum sollten diese also ausgeschlossen werden? Vermitteln ja schließlich meist recht anschaulich viel Information. Also exakt das, was nen guten Artikel ausmacht.&lt;br /&gt;
--[[Benutzer:Frase|Frase]] 18:48, 18. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tutorials sind einzelarbeiten die von einer Person gemacht wurden und die eigentlich auch nur von dieser zu Verantworten/Verbessern sind. Die Auszeichnung soll gerade dafür sorgen die &amp;quot;graue Maus&amp;quot; Artikel aufzuwerten. Das unsere Tutorials alle Exzellent sind steht außer Frage. Die Auszeichnung heißt aber nicht um sonst &amp;quot;Exzellente Artikel&amp;quot; und nicht &amp;quot;Exzellente Tutorials&amp;quot;. Außerdem soll die Auzeichnung erreichen, dass die Nutzer einfach mal ins Wiki reinlesen. Tutorials sind in sich geschlossen und verlinken kaum auf andere Artikel. Sie behandeln ein Thema, und das ist gut so.&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 01:11, 19. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und es kann die Leute animieren die Artikel den Kritierie anzupassen bzw. eigene Artikel einzustellen.&lt;br /&gt;
So hat es zumindest bei mir funktioniert. Ich habe jetzt sogar Bilder! :lol:&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 04:35, 19. Mär 2006 (CET)&lt;/div&gt;</summary>
		<author><name>Igel457</name></author>	</entry>

	</feed>