// LFS Pixel Shader : Anaglyph // Vertex shader output struct VS_OUTPUT { float4 Position : POSITION; float4 Color : COLOR0; float2 Texture : TEXCOORD0; }; // Global variables sampler2D Tex0; // Main function float4 ps_main( in VS_OUTPUT In ) : COLOR { float4 ret; // look up colour from left eye view (top half of source texture) float4 L = tex2D(Tex0, In.Texture); // look up colour from right eye view (bottom half of source texture) float4 R = tex2D(Tex0, float2(In.Texture.x, In.Texture.y + 0.5f)); // combine to output pixel... // colour anaglyph // simply shows red channel in left eye, cyan in right eye // produces bad retinal rivalry (brightness conflicts) // ret.r = L.r; // r = red from left eye // ret.g = R.g; // g = green from right eye // ret.b = R.b; // b = blue from right eye // ret.a = 1.0f; // half-colour anaglyph // greyscale in left eye, cyan in right eye // less retinal rivalry // ret.r = L.r * 0.299f + L.g * 0.587f + L.b * 0.114f; // r = greyscale of left eye view // ret.g = R.g; // g = green from right eye // ret.b = R.b; // b = blue from right eye // ret.a = 1.0f; // monochrome anaglyph // greyscale in both eyes // ret.r = L.r * 0.299f + L.g * 0.587f + L.b * 0.114f; // r = greyscale of left eye view // ret.g = R.r * 0.299f + R.g * 0.587f + R.b * 0.114f; // g = greyscale of right eye view // ret.b = ret.g; // b = g // ret.a = 1.0f; // Dubois methods aim to reduce ghosting and retinal rivalry // while providing contributions from all colour channels // Dubois Anaglyph website: http://www.site.uottawa.ca/~edubois/anaglyph/ // Dubois for CRT: http://www.site.uottawa.ca/~edubois/anaglyph/LeastSquaresHowToPhotoshop.pdf // ret.r = L.r * 0.437f + L.g * 0.449f + L.b * 0.164f + R.r * -0.011f + R.g * -0.032f + R.b * -0.007f; // ret.g = L.r * -0.062f + L.g * -0.062f + L.b * -0.024f + R.r * 0.377f + R.g * 0.761f + R.b * 0.009f; // ret.b = L.r * -0.048f + L.g * -0.050f + L.b * -0.017f + R.r * -0.026f + R.g * -0.093f + R.b * 1.234f; // ret.a = 1.0f; // Dubois that seems to work better on a LCD: http://stereo.jpn.org/eng/stphmkr/help/stereo_13.htm // ret.r = L.r * 0.456f + L.g * 0.500f + L.b * 0.176f + R.r * -0.043f + R.g * -0.088f + R.b * -0.002f; // ret.g = L.r * -0.040f + L.g * -0.038f + L.b * -0.016f + R.r * 0.378f + R.g * 0.734f + R.b * -0.018f; // ret.b = L.r * -0.015f + L.g * -0.021f + L.b * -0.005f + R.r * -0.072f + R.g * -0.113f + R.b * 1.226f; // ret.a = 1.0f; // Optimised version of the above ret.r = dot(L.rgb, float3( 0.456f, 0.500f, 0.176f)) + dot(R.rgb, float3(-0.043f, -0.088f, -0.002f)); ret.g = dot(L.rgb, float3(-0.040f, -0.038f, -0.016f)) + dot(R.rgb, float3( 0.378f, 0.734f, -0.018f)); ret.b = dot(L.rgb, float3(-0.015f, -0.021f, -0.005f)) + dot(R.rgb, float3(-0.072f, -0.113f, 1.226f)); ret.a = 1.0f; return ret; }