diff --git a/src/core/renderer_gl/renderer_gl.cpp b/src/core/renderer_gl/renderer_gl.cpp index fa4d5ded..c50dcd74 100644 --- a/src/core/renderer_gl/renderer_gl.cpp +++ b/src/core/renderer_gl/renderer_gl.cpp @@ -103,29 +103,30 @@ const char* fragmentShader = R"( vec4 final; + // TODO: figure out what the undocumented values do switch (rgb_operand) { - case 0u: final.rgb = rgb_source.rgb; break; // Source color - case 1u: final.rgb = 1.0 - rgb_source.rgb; break; // One minus source color - case 2u: final.rgb = vec3(rgb_source.a); break; // Source alpha - case 3u: final.rgb = vec3(1.0 - rgb_source.a); break; // One minus source alpha - case 4u: final.rgb = vec3(rgb_source.r); break; // Source red - case 5u: final.rgb = vec3(1.0 - rgb_source.r); break; // One minus source red - case 8u: final.rgb = vec3(rgb_source.g); break; // Source green - case 9u: final.rgb = vec3(1.0 - rgb_source.g); break; // One minus source green - case 12u: final.rgb = vec3(rgb_source.b); break; // Source blue - case 13u: final.rgb = vec3(1.0 - rgb_source.b); break; // One minus source blue - default: break; // TODO: figure out what the undocumented values do + case 0u: final.rgb = rgb_source.rgb; break; // Source color + case 1u: final.rgb = 1.0 - rgb_source.rgb; break; // One minus source color + case 2u: final.rgb = vec3(rgb_source.a); break; // Source alpha + case 3u: final.rgb = vec3(1.0 - rgb_source.a); break; // One minus source alpha + case 4u: final.rgb = vec3(rgb_source.r); break; // Source red + case 5u: final.rgb = vec3(1.0 - rgb_source.r); break; // One minus source red + case 8u: final.rgb = vec3(rgb_source.g); break; // Source green + case 9u: final.rgb = vec3(1.0 - rgb_source.g); break; // One minus source green + case 12u: final.rgb = vec3(rgb_source.b); break; // Source blue + case 13u: final.rgb = vec3(1.0 - rgb_source.b); break; // One minus source blue + default: break; } switch (alpha_operand) { - case 0u: final.a = alpha_source.a; break; // Source alpha - case 1u: final.a = 1.0 - alpha_source.a; break; // One minus source alpha - case 2u: final.a = alpha_source.r; break; // Source red - case 3u: final.a = 1.0 - alpha_source.r; break; // One minus source red - case 4u: final.a = alpha_source.g; break; // Source green - case 5u: final.a = 1.0 - alpha_source.g; break; // One minus source green - case 6u: final.a = alpha_source.b; break; // Source blue - case 7u: final.a = 1.0 - alpha_source.b; break; // One minus source blue + case 0u: final.a = alpha_source.a; break; // Source alpha + case 1u: final.a = 1.0 - alpha_source.a; break; // One minus source alpha + case 2u: final.a = alpha_source.r; break; // Source red + case 3u: final.a = 1.0 - alpha_source.r; break; // One minus source red + case 4u: final.a = alpha_source.g; break; // Source green + case 5u: final.a = 1.0 - alpha_source.g; break; // One minus source green + case 6u: final.a = alpha_source.b; break; // Source blue + case 7u: final.a = 1.0 - alpha_source.b; break; // One minus source blue } return final; @@ -141,33 +142,34 @@ const char* fragmentShader = R"( vec4 result = vec4(1.0); - // TODO: test if the alpha combiner supports all the same modes as the color combiner. - + // TODO: figure out what the undocumented values do switch (rgb_combine) { - case 0u: result.rgb = source0.rgb; break; // Replace - case 1u: result.rgb = source0.rgb * source1.rgb; break; // Modulate - case 2u: result.rgb = min(vec3(1.0), source0.rgb + source1.rgb); break; // Add - case 3u: result.rgb = clamp(source0.rgb + source1.rgb - 0.5, vec3(0.0), vec3(1.0)); break; // Add signed - case 4u: result.rgb = mix(source1.rgb, source0.rgb, source2.rgb); break; // Interpolate - case 5u: result.rgb = max(vec3(0.0), source0.rgb - source1.rgb); break; // Subtract - case 6u: result.rgb = vec3(4.0 * dot(source0.rgb - 0.5 , source1.rgb - 0.5)); break; // Dot3 RGB - case 7u: result = vec4(4.0 * dot(source0.rgb - 0.5 , source1.rgb - 0.5)); break; // Dot3 RGBA - case 8u: result.rgb = min(vec3(1.0), source0.rgb * source1.rgb + source2.rgb); break; // Multiply then add - case 9u: result.rgb = min(vec3(1.0), (source0.rgb + source1.rgb) * source2.rgb); break; // Add then multiply - default: break; // TODO: figure out what the undocumented values do + case 0u: result.rgb = source0.rgb; break; // Replace + case 1u: result.rgb = source0.rgb * source1.rgb; break; // Modulate + case 2u: result.rgb = min(vec3(1.0), source0.rgb + source1.rgb); break; // Add + case 3u: result.rgb = clamp(source0.rgb + source1.rgb - 0.5, 0.0, 1.0); break; // Add signed + case 4u: result.rgb = mix(source1.rgb, source0.rgb, source2.rgb); break; // Interpolate + case 5u: result.rgb = max(source0.rgb - source1.rgb, 0.0); break; // Subtract + case 6u: result.rgb = vec3(4.0 * dot(source0.rgb - 0.5 , source1.rgb - 0.5)); break; // Dot3 RGB + case 7u: result = vec4(4.0 * dot(source0.rgb - 0.5 , source1.rgb - 0.5)); break; // Dot3 RGBA + case 8u: result.rgb = min(source0.rgb * source1.rgb + source2.rgb, 1.0); break; // Multiply then add + case 9u: result.rgb = min((source0.rgb + source1.rgb) * source2.rgb, 1.0); break; // Add then multiply + default: break; } if (rgb_combine != 7u) { // The color combiner also writes the alpha channel in the "Dot3 RGBA" mode. + // TODO: figure out what the undocumented values do + // TODO: test if the alpha combiner supports all the same modes as the color combiner. switch (alpha_combine) { - case 0u: result.a = source0.a; break; // Replace - case 1u: result.a = source0.a * source1.a; break; // Modulate - case 2u: result.a = min(1.0, source0.a + source1.a); break; // Add - case 3u: result.a = clamp(source0.a + source1.a - 0.5, 0.0, 1.0); break; // Add signed - case 4u: result.a = mix(source1.a, source0.a, source2.a); break; // Interpolate - case 5u: result.a = max(0.0, source0.a - source1.a); break; // Subtract - case 8u: result.a = min(1.0, source0.a * source1.a + source2.a); break; // Multiply then add - case 9u: result.a = min(1.0, (source0.a + source1.a) * source2.a); break; // Add then multiply - default: break; // TODO: figure out what the undocumented values do + case 0u: result.a = source0.a; break; // Replace + case 1u: result.a = source0.a * source1.a; break; // Modulate + case 2u: result.a = min(1.0, source0.a + source1.a); break; // Add + case 3u: result.a = clamp(source0.a + source1.a - 0.5, 0.0, 1.0); break; // Add signed + case 4u: result.a = mix(source1.a, source0.a, source2.a); break; // Interpolate + case 5u: result.a = max(0.0, source0.a - source1.a); break; // Subtract + case 8u: result.a = min(1.0, source0.a * source1.a + source2.a); break; // Multiply then add + case 9u: result.a = min(1.0, (source0.a + source1.a) * source2.a); break; // Add then multiply + default: break; } }