summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/PostProcessing.cpp
diff options
context:
space:
mode:
authorDolphin Bot <dolphin-emu-bot@users.noreply.github.com>2015-01-02 20:04:04 +0100
committerDolphin Bot <dolphin-emu-bot@users.noreply.github.com>2015-01-02 20:04:04 +0100
commit7dc6484fe79d0b8bdf6a88e2bf38dbe20c4cde87 (patch)
treedc20cdf6af3fffd90fa6c3d3d06443731dbafbf4 /Source/Core/VideoBackends/OGL/PostProcessing.cpp
parent9c6795c7b74c8aa6c852a2855ab54315d34f8613 (diff)
parent582a15deb38a0510eded144be843f737ed51cca8 (diff)
Merge pull request #1805 from Armada651/dubois
PostProcessing: Use Dubois algorithm for anaglyph shader.
Diffstat (limited to 'Source/Core/VideoBackends/OGL/PostProcessing.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/PostProcessing.cpp32
1 files changed, 25 insertions, 7 deletions
diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp
index 74fd93147b..3c1bb386bf 100644
--- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp
+++ b/Source/Core/VideoBackends/OGL/PostProcessing.cpp
@@ -18,7 +18,7 @@
namespace OGL
{
-static char s_vertex_workaround_shader[] =
+static const char s_vertex_workaround_shader[] =
"in vec4 rawpos;\n"
"out vec2 uv0;\n"
"uniform vec4 src_rect;\n"
@@ -27,7 +27,7 @@ static char s_vertex_workaround_shader[] =
" uv0 = rawpos.zw * src_rect.zw + src_rect.xy;\n"
"}\n";
-static char s_vertex_shader[] =
+static const char s_vertex_shader[] =
"out vec2 uv0;\n"
"uniform vec4 src_rect;\n"
"void main(void) {\n"
@@ -36,6 +36,26 @@ static char s_vertex_shader[] =
" uv0 = rawpos * src_rect.zw + src_rect.xy;\n"
"}\n";
+// Anaglyph Red-Cyan shader based on Dubois algorithm
+// Constants taken from the paper:
+// "Conversion of a Stereo Pair to Anaglyph with
+// the Least-Squares Projection Method"
+// Eric Dubois, March 2009
+static const char s_anaglyph_shader[] =
+ "void main() {\n"
+ " vec4 c0 = SampleLayer(0);\n"
+ " vec4 c1 = SampleLayer(1);\n"
+ " mat3 l = mat3( 0.437, 0.449, 0.164,\n"
+ " -0.062,-0.062,-0.024,\n"
+ " -0.048,-0.050,-0.017);\n"
+ " mat3 r = mat3(-0.011,-0.032,-0.007,\n"
+ " 0.377, 0.761, 0.009,\n"
+ " -0.026,-0.093, 1.234);\n"
+ " SetOutput(vec4(c0.rgb * l + c1.rgb * r, c0.a));\n"
+ "}\n";
+
+static const char s_default_shader[] = "void main() { SetOutput(Sample()); }\n";
+
OpenGLPostProcessing::OpenGLPostProcessing()
: m_initialized(false)
, m_anaglyph(false)
@@ -172,15 +192,13 @@ void OpenGLPostProcessing::ApplyShader()
// load shader code
std::string code = "";
- std::string default_shader = "void main() { SetOutput(Sample()); }\n";
-
if (g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH)
- code = "void main() { SetOutput(float4(pow(0.7 * SampleLayer(0).g + 0.3 * SampleLayer(0).b, 1.5), SampleLayer(1).gba)); }\n";
+ code = s_anaglyph_shader;
else if (g_ActiveConfig.sPostProcessingShader != "")
code = m_config.LoadShader();
if (code == "")
- code = default_shader;
+ code = s_default_shader;
code = LoadShaderOptions(code);
@@ -194,7 +212,7 @@ void OpenGLPostProcessing::ApplyShader()
{
ERROR_LOG(VIDEO, "Failed to compile post-processing shader %s", m_config.GetShader().c_str());
- code = LoadShaderOptions(default_shader);
+ code = LoadShaderOptions(s_default_shader);
ProgramShaderCache::CompileShader(m_shader, vertex_shader, code.c_str());
}