From cf1cb5e0a9a9b842ac46e4ceeba4b869816aa520 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Wed, 1 Sep 2021 15:02:07 -0700 Subject: [PATCH] renderer: move ocio code to separate file --- app/render/renderer.cpp | 61 +++--------------------------------- app/shaders/colormanage.frag | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 56 deletions(-) create mode 100644 app/shaders/colormanage.frag diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp index a27553fae..a3701c2ff 100644 --- a/app/render/renderer.cpp +++ b/app/render/renderer.cpp @@ -123,62 +123,11 @@ bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::Colo // Generate shader color_processor->GetProcessor()->getDefaultGPUProcessor()->extractGpuShaderInfo(shader_desc); - QString shader_frag; - shader_frag.append(QStringLiteral("// Main texture input\n" - "uniform sampler2D ove_maintex;\n" - "uniform int ove_maintex_alpha;\n" - "uniform mat4 ove_cropmatrix;\n" - "\n" - "// Macros defining `ove_maintex_alpha` state\n" - "// Matches `AlphaAssociated` C++ enum\n" - "#define ALPHA_NONE 0\n" - "#define ALPHA_UNASSOC 1\n" - "#define ALPHA_ASSOC 2\n" - "\n" - "// Main texture coordinate\n" - "varying vec2 ove_texcoord;\n" - "\n")); - shader_frag.append(shader_desc->getShaderText()); - shader_frag.append(QStringLiteral("\n" - "// Alpha association functions\n" - "vec4 assoc(vec4 c) {\n" - " return vec4(c.rgb * c.a, c.a);\n" - "}\n" - "\n" - "vec4 reassoc(vec4 c) {\n" - " return (c.a == 0.0) ? c : assoc(c);\n" - "}\n" - "\n" - "vec4 deassoc(vec4 c) {\n" - " return (c.a == 0.0) ? c : vec4(c.rgb / c.a, c.a);\n" - "}\n" - "\n" - "void main() {\n" - " vec2 cropped_coord = (vec4(ove_texcoord-vec2(0.5, 0.5), 0.0, 1.0)*ove_cropmatrix).xy + vec2(0.5, 0.5);\n" - " if (cropped_coord.x < 0.0 || cropped_coord.x >= 1.0 || cropped_coord.y < 0.0 || cropped_coord.y >= 1.0) {\n" - " gl_FragColor = vec4(0.0);\n" - " return;\n" - " }\n" - " \n" - " vec4 col = texture2D(ove_maintex, cropped_coord);\n" - "\n" - " // If alpha is associated, de-associate now\n" - " if (ove_maintex_alpha == ALPHA_ASSOC) {\n" - " col = deassoc(col);\n" - " }\n" - "\n" - " // Perform color conversion\n" - " col = %1(col);\n" - "\n" - " // Associate or re-associate here\n" - " if (ove_maintex_alpha == ALPHA_ASSOC) {\n" - " col = reassoc(col);\n" - " } else if (ove_maintex_alpha == ALPHA_UNASSOC) {\n" - " col = assoc(col);\n" - " }\n" - "\n" - " gl_FragColor = col;\n" - "}\n").arg(ocio_func_name)); + // Generate shader code using OCIO stub and our auto-generated name + QString shader_frag = FileFunctions::ReadFileAsString(QStringLiteral(":shaders/colormanage.frag")).arg( + shader_desc->getShaderText(), + ocio_func_name + ); // Try to compile shader color_ctx.compiled_shader = CreateNativeShader(ShaderCode(shader_frag, diff --git a/app/shaders/colormanage.frag b/app/shaders/colormanage.frag new file mode 100644 index 000000000..55b394eed --- /dev/null +++ b/app/shaders/colormanage.frag @@ -0,0 +1,56 @@ +// Main texture input +uniform sampler2D ove_maintex; +uniform int ove_maintex_alpha; +uniform mat4 ove_cropmatrix; + +// Macros defining `ove_maintex_alpha` state +// Matches `AlphaAssociated` C++ enum +#define ALPHA_NONE 0 +#define ALPHA_UNASSOC 1 +#define ALPHA_ASSOC 2 + +// Main texture coordinate +varying vec2 ove_texcoord; + +// Program will replace this with OCIO's auto-generated shader code +%1 + +// Alpha association functions +vec4 assoc(vec4 c) { + return vec4(c.rgb * c.a, c.a); +} + +vec4 reassoc(vec4 c) { + return (c.a == 0.0) ? c : assoc(c); +} + +vec4 deassoc(vec4 c) { + return (c.a == 0.0) ? c : vec4(c.rgb / c.a, c.a); +} + +void main() { + vec2 cropped_coord = (vec4(ove_texcoord-vec2(0.5, 0.5), 0.0, 1.0)*ove_cropmatrix).xy + vec2(0.5, 0.5); + if (cropped_coord.x < 0.0 || cropped_coord.x >= 1.0 || cropped_coord.y < 0.0 || cropped_coord.y >= 1.0) { + gl_FragColor = vec4(0.0); + return; + } + + vec4 col = texture2D(ove_maintex, cropped_coord); + + // If alpha is associated, de-associate now + if (ove_maintex_alpha == ALPHA_ASSOC) { + col = deassoc(col); + } + + // Perform color conversion + col = %2(col); + + // Associate or re-associate here + if (ove_maintex_alpha == ALPHA_ASSOC) { + col = reassoc(col); + } else if (ove_maintex_alpha == ALPHA_UNASSOC) { + col = assoc(col); + } + + gl_FragColor = col; +}