<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://wiki.delphigl.com/index.php?action=history&amp;feed=atom&amp;title=shader_Stereoscopy</id>
		<title>shader Stereoscopy - Versionsgeschichte</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.delphigl.com/index.php?action=history&amp;feed=atom&amp;title=shader_Stereoscopy"/>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=shader_Stereoscopy&amp;action=history"/>
		<updated>2026-04-20T19:35:48Z</updated>
		<subtitle>Versionsgeschichte dieser Seite in DGL Wiki</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=shader_Stereoscopy&amp;diff=24735&amp;oldid=prev</id>
		<title>Joni: Die Seite wurde neu angelegt: „=Stereoskopischer Post-Processing-Shader= Zurück zur Shadersammlung {|{{Prettytable_B1}} width=100% !width=60%|Beschreibung !width=20%|Autor !width=20%|Versi…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=shader_Stereoscopy&amp;diff=24735&amp;oldid=prev"/>
				<updated>2010-03-11T14:16:00Z</updated>
		
		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „=Stereoskopischer Post-Processing-Shader= Zurück zur &lt;a href=&quot;/index.php/Shadersammlung&quot; title=&quot;Shadersammlung&quot;&gt;Shadersammlung&lt;/a&gt; {|{{Prettytable_B1}} width=100% !width=60%|Beschreibung !width=20%|Autor !width=20%|Versi…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Stereoskopischer Post-Processing-Shader=&lt;br /&gt;
Zurück zur [[Shadersammlung]]&lt;br /&gt;
{|{{Prettytable_B1}} width=100%&lt;br /&gt;
!width=60%|Beschreibung&lt;br /&gt;
!width=20%|Autor&lt;br /&gt;
!width=20%|Version&lt;br /&gt;
|-&lt;br /&gt;
|Post-Processing-Shader für Stereoskopie&lt;br /&gt;
|Joni&lt;br /&gt;
|1.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Bilder==&lt;br /&gt;
{|&lt;br /&gt;
|[[Bild:stereo_shader1.png|600px|verschiedene Stereoskopie-Verfahren]]&lt;br /&gt;
|}&lt;br /&gt;
''Oben: Half-Color Anaglyph; mitte: Horizontal Interlaced (funktioniert nur bei maximaler Bildauflösung); unten: Full-Color Anaglyph''&lt;br /&gt;
&lt;br /&gt;
==Beschreibung==&lt;br /&gt;
Die hier vorgestellten Shader konvertieren mit verschiedenen Verfahren ein linkes und ein rechtes Eingabebild in ein stereoskopisches Bild. In dem folgenden Abschnitt werden die einzelnen Verfahren näher erläutert.&lt;br /&gt;
===Horizontal Interlaced===&lt;br /&gt;
Bei der zeilenverschachtelten Stereoskopie sind alle ungeraden Pixelzeilen für das linke Auge und alle geraden Pixelzeilen für das rechte Auge bestimmt. Verwendet wird dieses Verfahren u. A. von den Zalman- und den Hyundai-3D-Bildschirmen.&lt;br /&gt;
===Vertical Interlaced===&lt;br /&gt;
Analog zur zeilenverschachtelten Stereoskopie wird hier nach ungeraden und geraden Spalten sortiert. Verwendet wird dieses Verfahren u. A. für den Druck auf Linsenrasterkarten.&lt;br /&gt;
===Checkerboard===&lt;br /&gt;
Hier gehören jeweils die Pixel, die diagonal zueinander liegen, zu einem Auge. Die Aufteilung erinnert an ein Schachbrett, daher der Name. Verwendet wird das Verfahren u. A. von einigen Fernsehen von Samsung in Kombination mit einer Shutterbrille.&lt;br /&gt;
===Half-Color Anaglyphen===&lt;br /&gt;
Das Half-Color-Verfahren ist ein Anaglyphen-Verfahren für rot/cyan-Brillen, das im gegenüber dem True-Color-Anaglyphen-Verfahren, was auch im [[Tutorial_StereoSehen|Stereoskopie-Tutorial]] verwendet wird, einen nennenswerten Vorteil bei farbiger Szene hat. Bei dem True-Color-Verfahren wird für den roten Kanal des finalen Bildes der rote Kanal des linken Bildes genommen, was zu Konflikten bei roten Objekten in der Szene führt. Diese erscheinen dann auf dem linken Auge mit voller Helligkeit und auf dem rechten Auge schwarz. Das Half-Color-Verfahren verwendet daher für den roten Farbkanal des finalen Bildes nicht den roten Kanal des linken Bildes, sondern dessen Helligkeit, die wie bei Graustufen mit der folgenden Formel berechnet wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;luminance = 0.299*red + 0.587*green + 0.114*blue&amp;lt;/source&amp;gt;&lt;br /&gt;
Der Nachteil dieses Verfahrens ist, dass die Farben etwas verfälscht werden.&lt;br /&gt;
===Optimized Anaglyphen===&lt;br /&gt;
Dieses Verfahren ähnelt dem Half-Color-Verfahren, ignoriert aber bei dem linken Bild den Rotanteil vollständig und berechnet den finalen roten Kanal folgendermaßen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;red = 0.7*green + 0.3*blue&amp;lt;/source&amp;gt;&lt;br /&gt;
Dieses Verfahren erstellt noch etwas ruhigere Bilder als das Half-Color-Verfahren, verfälscht die Farben aber auch stärker. Zusätzlich kann bei dem Verfahren noch Gammakorrektur auf den roten Kanal angewandt werden. &lt;br /&gt;
{|&lt;br /&gt;
[[Bild:anaglyph_problem.png|center|Die oben beschriebenen Verfahren angewandt auf ein rotes Objekt]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Besondere Vorraussetzungen==&lt;br /&gt;
Um den Code sinnvoll zu benutzen, ist eine Anaglyphen-Brille oder ein stereoskopisches Gerät, das eins der o.g. Verfahren verwendet, nötig.&lt;br /&gt;
&lt;br /&gt;
==Anmerkungen==&lt;br /&gt;
Für die Verwendung von Anaglyphen mit grün/magenta kann man die o.g. Verfahren entsprechend anpassen. Welches Verfahren sich dafür anbietet, ist zu testen, da der Autor keine solche Brille besitzt.&lt;br /&gt;
&lt;br /&gt;
Das neu aufgekommene, patentierte ColorCode-Verfahren sieht zwar gelb/blauen Anaglyphen ähnlich, ist jedoch anders und nicht zu gelb/blau-Anaglyphen kompatibel. Da das Color-Code-Verfahren patentiert und nicht öffentlich bekannt ist, besteht leider keine Möglichkeit, es hier zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Für Shutterbrillen, Doppelprojektoren etc. ist man in OpenGL auf eine Treiberlösung angewiesen. Details dazu gibt es im [[Tutorial_StereoSehen|Tutorial StereoSehen]].&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
Hier wird OpenGL 3.2 und GLSL-Version 1.5 verwendet, die Shader sollten jedoch problemlos mit jeder GLSL-Version funktionieren.&lt;br /&gt;
===Vertex Shader===&lt;br /&gt;
Da es sich um einen Post-Processing-Shader handelt, tut der Vertexshader nur das Nötigste: Er leitet Vertex- und Texturkoordinaten weiter.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 150&lt;br /&gt;
&lt;br /&gt;
in  vec3 in_Position;&lt;br /&gt;
in  vec2 in_TexCoord;&lt;br /&gt;
out vec2 ex_TexCoord;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
	gl_Position = vec4(in_Position, 1.0);&lt;br /&gt;
	ex_TexCoord = in_TexCoord;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
===Horizontal Interlaced===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 150&lt;br /&gt;
&lt;br /&gt;
precision highp float;&lt;br /&gt;
&lt;br /&gt;
in  vec3 ex_Color;&lt;br /&gt;
in  vec2 ex_TexCoord;&lt;br /&gt;
out vec4 out_Color;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D left;  //Linkes Bild&lt;br /&gt;
uniform sampler2D right; //Rechtes Bild&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  //Horizontal Interlaced&lt;br /&gt;
  if (mod(trunc(gl_FragCoord.y), 2.0) &amp;lt; 0.5)&lt;br /&gt;
    out_Color = texture2D(left, vec2(ex_TexCoord));&lt;br /&gt;
  else&lt;br /&gt;
    out_Color = texture2D(right, vec2(ex_TexCoord));&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vertical Interlaced===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 150&lt;br /&gt;
&lt;br /&gt;
precision highp float;&lt;br /&gt;
&lt;br /&gt;
in  vec3 ex_Color;&lt;br /&gt;
in  vec2 ex_TexCoord;&lt;br /&gt;
out vec4 out_Color;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D left;&lt;br /&gt;
uniform sampler2D right;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{ &lt;br /&gt;
  //Vertical Interlaced&lt;br /&gt;
  if (mod(trunc(gl_FragCoord.x), 2.0) &amp;lt; 0.5)&lt;br /&gt;
    out_Color = texture2D(left, vec2(ex_TexCoord));&lt;br /&gt;
  else&lt;br /&gt;
    out_Color = texture2D(right, vec2(ex_TexCoord));&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
===Checkerboard===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 150&lt;br /&gt;
&lt;br /&gt;
precision highp float;&lt;br /&gt;
&lt;br /&gt;
in  vec3 ex_Color;&lt;br /&gt;
in  vec2 ex_TexCoord;&lt;br /&gt;
out vec4 out_Color;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D left;&lt;br /&gt;
uniform sampler2D right;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
//Checkerboard&lt;br /&gt;
  bool d1 = (mod(trunc(gl_FragCoord.x), 2.0) &amp;lt; 0.5);&lt;br /&gt;
  bool d2 = (mod(trunc(gl_FragCoord.y), 2.0) &amp;lt; 0.5);&lt;br /&gt;
  if (d1==d2)&lt;br /&gt;
    out_Color = texture2D(left, vec2(ex_TexCoord));&lt;br /&gt;
  else&lt;br /&gt;
    out_Color = texture2D(right, vec2(ex_TexCoord));&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
===Half-Color-Anaglyph===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 150&lt;br /&gt;
&lt;br /&gt;
precision highp float;&lt;br /&gt;
&lt;br /&gt;
in  vec3 ex_Color;&lt;br /&gt;
in  vec2 ex_TexCoord;&lt;br /&gt;
out vec4 out_Color;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D left;&lt;br /&gt;
uniform sampler2D right;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  //Half-Color Anaglyphen&lt;br /&gt;
  vec3 cleft = texture2D(left, vec2(ex_TexCoord)).xyz;&lt;br /&gt;
  vec3 cright = texture2D(right, vec2(ex_TexCoord)).xyz;&lt;br /&gt;
  out_Color.r = 0.299*cleft.r + 0.587*cleft.g + 0.114*cleft.b;  //Half-Color&lt;br /&gt;
  out_Color.g = cright.g;&lt;br /&gt;
  out_Color.b = cright.b;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Optimized-Anaglyph===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 150&lt;br /&gt;
&lt;br /&gt;
precision highp float;&lt;br /&gt;
&lt;br /&gt;
in  vec3 ex_Color;&lt;br /&gt;
in  vec2 ex_TexCoord;&lt;br /&gt;
out vec4 out_Color;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D left;&lt;br /&gt;
uniform sampler2D right;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  //Half-Color Anaglyphen&lt;br /&gt;
  vec3 cleft = texture2D(left, vec2(ex_TexCoord)).xyz;&lt;br /&gt;
  vec3 cright = texture2D(right, vec2(ex_TexCoord)).xyz;&lt;br /&gt;
  out_Color.r = 0.7*cleft.g + 0.3*cleft.b;            //ohne Gammakorrektur&lt;br /&gt;
  out_Color.r = pow(0.7*cleft.g + 0.3*cleft.b, 1.5);  //mit Gammakorrektur&lt;br /&gt;
  out_Color.g = cright.g;&lt;br /&gt;
  out_Color.b = cright.b;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
http://www.3dtv.at/knowhow/AnaglyphComparison_en.aspx&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
[[Tutorial_StereoSehen]]&lt;/div&gt;</summary>
		<author><name>Joni</name></author>	</entry>

	</feed>