From c64486075d728b3682b77ed06d5c154fd4a5c88d Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 22 Oct 2014 13:02:28 +0200 Subject: PostProcessing: Add layered stereoscopy support. --- Source/Core/VideoBackends/OGL/PostProcessing.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/PostProcessing.cpp') diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp index 434a1d94a3..2681fcd345 100644 --- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp +++ b/Source/Core/VideoBackends/OGL/PostProcessing.cpp @@ -36,7 +36,7 @@ static char s_vertex_shader[] = " uv0 = rawpos * src_rect.zw + src_rect.xy;\n" "}\n"; -OpenGLPostProcessing::OpenGLPostProcessing() +OpenGLPostProcessing::OpenGLPostProcessing() : m_initialized(false) { CreateHeader(); @@ -46,8 +46,6 @@ OpenGLPostProcessing::OpenGLPostProcessing() glGenBuffers(1, &m_attribute_vbo); glGenVertexArrays(1, &m_attribute_vao); } - - m_initialized = false; } OpenGLPostProcessing::~OpenGLPostProcessing() @@ -62,7 +60,7 @@ OpenGLPostProcessing::~OpenGLPostProcessing() } void OpenGLPostProcessing::BlitFromTexture(TargetRectangle src, TargetRectangle dst, - int src_texture, int src_width, int src_height) + int src_texture, int src_width, int src_height, int layer) { ApplyShader(); @@ -79,6 +77,7 @@ void OpenGLPostProcessing::BlitFromTexture(TargetRectangle src, TargetRectangle glUniform4f(m_uniform_src_rect, src.left / (float) src_width, src.bottom / (float) src_height, src.GetWidth() / (float) src_width, src.GetHeight() / (float) src_height); glUniform1ui(m_uniform_time, (GLuint)m_timer.GetTimeElapsed()); + glUniform1i(m_uniform_layer, layer); if (m_config.IsDirty()) { @@ -151,9 +150,9 @@ void OpenGLPostProcessing::BlitFromTexture(TargetRectangle src, TargetRectangle } glActiveTexture(GL_TEXTURE0+9); - glBindTexture(GL_TEXTURE_2D, src_texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glBindTexture(GL_TEXTURE_2D_ARRAY, src_texture); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -167,7 +166,7 @@ void OpenGLPostProcessing::ApplyShader() m_uniform_bindings.clear(); // load shader from disk - std::string default_shader = "void main() { SetOutput(Sample()); }"; + std::string default_shader = "void main() { SetOutput(Sample()); }\n"; std::string code = ""; if (g_ActiveConfig.sPostProcessingShader != "") code = m_config.LoadShader(); @@ -195,6 +194,7 @@ void OpenGLPostProcessing::ApplyShader() m_uniform_resolution = glGetUniformLocation(m_shader.glprogid, "resolution"); m_uniform_time = glGetUniformLocation(m_shader.glprogid, "time"); m_uniform_src_rect = glGetUniformLocation(m_shader.glprogid, "src_rect"); + m_uniform_layer = glGetUniformLocation(m_shader.glprogid, "layer"); if (m_attribute_workaround) { @@ -228,7 +228,7 @@ void OpenGLPostProcessing::CreateHeader() // Shouldn't be accessed directly by the PP shader // Texture sampler "SAMPLER_BINDING(8) uniform sampler2D samp8;\n" - "SAMPLER_BINDING(9) uniform sampler2D samp9;\n" + "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" // Output variable "out float4 ocol0;\n" @@ -238,16 +238,18 @@ void OpenGLPostProcessing::CreateHeader() "uniform float4 resolution;\n" // Time "uniform uint time;\n" + // Layer + "uniform int layer;\n" // Interfacing functions "float4 Sample()\n" "{\n" - "\treturn texture(samp9, uv0);\n" + "\treturn texture(samp9, float3(uv0, layer));\n" "}\n" "float4 SampleLocation(float2 location)\n" "{\n" - "\treturn texture(samp9, location);\n" + "\treturn texture(samp9, float3(location, layer));\n" "}\n" "#define SampleOffset(offset) textureOffset(samp9, uv0, offset)\n" -- cgit v1.2.3 From 4d9589b35f2629c558a9a7efdee3d66497fc0fc6 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Thu, 30 Oct 2014 15:13:31 +0100 Subject: Cosmetics. --- Source/Core/VideoBackends/OGL/PostProcessing.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/PostProcessing.cpp') diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp index 2681fcd345..7cd99a05d7 100644 --- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp +++ b/Source/Core/VideoBackends/OGL/PostProcessing.cpp @@ -36,7 +36,8 @@ static char s_vertex_shader[] = " uv0 = rawpos * src_rect.zw + src_rect.xy;\n" "}\n"; -OpenGLPostProcessing::OpenGLPostProcessing() : m_initialized(false) +OpenGLPostProcessing::OpenGLPostProcessing() + : m_initialized(false) { CreateHeader(); -- cgit v1.2.3 From c3ad6e78207bc0f64a9687fd8f27fbe0f7606bc7 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 31 Oct 2014 15:53:08 +0100 Subject: PostProcessing: Add support for anaglyph stereoscopy mode. --- Source/Core/VideoBackends/OGL/PostProcessing.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/PostProcessing.cpp') diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp index 7cd99a05d7..905531226c 100644 --- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp +++ b/Source/Core/VideoBackends/OGL/PostProcessing.cpp @@ -166,10 +166,13 @@ void OpenGLPostProcessing::ApplyShader() m_shader.Destroy(); m_uniform_bindings.clear(); - // load shader from disk - std::string default_shader = "void main() { SetOutput(Sample()); }\n"; + // load shader code std::string code = ""; - if (g_ActiveConfig.sPostProcessingShader != "") + std::string default_shader = "void main() { SetOutput(Sample()); }\n"; + + if (g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH) + code = "void main() { SetOutput(float4(SampleLayer(1).r, SampleLayer(0).gba)); }\n"; + else if (g_ActiveConfig.sPostProcessingShader != "") code = m_config.LoadShader(); if (code == "") @@ -253,7 +256,12 @@ void OpenGLPostProcessing::CreateHeader() "\treturn texture(samp9, float3(location, layer));\n" "}\n" - "#define SampleOffset(offset) textureOffset(samp9, uv0, offset)\n" + "float4 SampleLayer(int layer)\n" + "{\n" + "\treturn texture(samp9, float3(uv0, layer));\n" + "}\n" + + "#define SampleOffset(offset) textureOffset(samp9, float3(uv0, layer), offset)\n" "float4 SampleFontLocation(float2 location)\n" "{\n" -- cgit v1.2.3 From ab76cf8b5e27eee916107e3f6ddf209407ce169d Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sat, 1 Nov 2014 23:01:22 +0100 Subject: PostProcessing: Apply color correction to the anaglyph shader. The eyes were accidentally swapped, the left filter only allows red to pass so the left eye texture should be used in the red channel. --- Source/Core/VideoBackends/OGL/PostProcessing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/PostProcessing.cpp') diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp index 905531226c..84088459ed 100644 --- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp +++ b/Source/Core/VideoBackends/OGL/PostProcessing.cpp @@ -171,7 +171,7 @@ void OpenGLPostProcessing::ApplyShader() std::string default_shader = "void main() { SetOutput(Sample()); }\n"; if (g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH) - code = "void main() { SetOutput(float4(SampleLayer(1).r, SampleLayer(0).gba)); }\n"; + code = "void main() { SetOutput(float4(pow(0.7 * SampleLayer(0).g + 0.3 * SampleLayer(0).b, 1.5), SampleLayer(1).gba)); }\n"; else if (g_ActiveConfig.sPostProcessingShader != "") code = m_config.LoadShader(); -- cgit v1.2.3 From 9994ccb3422b88649eb160bf373d4d29b08a4768 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sat, 8 Nov 2014 15:08:41 +0100 Subject: PostProcessing: Invalidate shader when anaglyph stereoscopy is toggled. --- Source/Core/VideoBackends/OGL/PostProcessing.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/PostProcessing.cpp') diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp index 84088459ed..80bdf8eef4 100644 --- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp +++ b/Source/Core/VideoBackends/OGL/PostProcessing.cpp @@ -38,6 +38,7 @@ static char s_vertex_shader[] = OpenGLPostProcessing::OpenGLPostProcessing() : m_initialized(false) + , m_anaglyph(false) { CreateHeader(); @@ -160,7 +161,8 @@ void OpenGLPostProcessing::BlitFromTexture(TargetRectangle src, TargetRectangle void OpenGLPostProcessing::ApplyShader() { // shader didn't changed - if (m_initialized && m_config.GetShader() == g_ActiveConfig.sPostProcessingShader) + if (m_initialized && m_config.GetShader() == g_ActiveConfig.sPostProcessingShader && + ((g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH) == m_anaglyph)) return; m_shader.Destroy(); @@ -222,6 +224,7 @@ void OpenGLPostProcessing::ApplyShader() std::string glsl_name = "option_" + it.first; m_uniform_bindings[it.first] = glGetUniformLocation(m_shader.glprogid, glsl_name.c_str()); } + m_anaglyph = g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH; m_initialized = true; } -- cgit v1.2.3