diff options
Diffstat (limited to 'Source/Core/VideoBackends/OGL/PostProcessing.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/PostProcessing.cpp | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp index 434a1d94a3..80bdf8eef4 100644 --- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp +++ b/Source/Core/VideoBackends/OGL/PostProcessing.cpp @@ -37,6 +37,8 @@ static char s_vertex_shader[] = "}\n"; OpenGLPostProcessing::OpenGLPostProcessing() + : m_initialized(false) + , m_anaglyph(false) { CreateHeader(); @@ -46,8 +48,6 @@ OpenGLPostProcessing::OpenGLPostProcessing() glGenBuffers(1, &m_attribute_vbo); glGenVertexArrays(1, &m_attribute_vao); } - - m_initialized = false; } OpenGLPostProcessing::~OpenGLPostProcessing() @@ -62,7 +62,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 +79,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,25 +152,29 @@ 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); } 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(); m_uniform_bindings.clear(); - // load shader from disk - std::string default_shader = "void main() { SetOutput(Sample()); }"; + // 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(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(); if (code == "") @@ -195,6 +200,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) { @@ -218,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; } @@ -228,7 +235,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,19 +245,26 @@ 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" + + "float4 SampleLayer(int layer)\n" + "{\n" + "\treturn texture(samp9, float3(uv0, layer));\n" "}\n" - "#define SampleOffset(offset) textureOffset(samp9, uv0, offset)\n" + "#define SampleOffset(offset) textureOffset(samp9, float3(uv0, layer), offset)\n" "float4 SampleFontLocation(float2 location)\n" "{\n" |
