From 1171c37f8839eb0f15c56b4c26718003b57d5c70 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 24 Apr 2017 17:25:26 +0000 Subject: [PATCH] Fix compare shader(s) --- compare.glsl | 14 +++++++------- compare_med.glsl | 20 ++++++++++++++++++++ src/main.cpp | 22 ++++++++++++++++++++-- 3 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 compare_med.glsl diff --git a/compare.glsl b/compare.glsl index 90c7bf6..5467416 100644 --- a/compare.glsl +++ b/compare.glsl @@ -4,16 +4,16 @@ // try isampler2D, ivec4 etc.? Probably not uniform vec2 size; +uniform vec2 offs; uniform sampler2D base; uniform sampler2D curr; void main(void) { - vec2 pos = gl_FragCoord.xy/size; -// vec4 color = texture(curr, pos); // fails for some reason!? -// vec4 basecolor = texture(base, pos); // fails too... -// color.xyz = abs(color.xyz - basecolor.xyz); -// gl_FragColor = color; -// gl_FragColor = basecolor; - gl_FragColor = vec4(1.0); + vec2 pos = (gl_FragCoord.xy-offs)/size; + pos.y = 1.0 - pos.y; + vec4 color = texture2D(curr, pos); + vec4 basecolor = texture2D(base, pos); + color.xyz = abs(color.xyz - basecolor.xyz); + gl_FragColor = color; } diff --git a/compare_med.glsl b/compare_med.glsl new file mode 100644 index 0000000..2ab82d5 --- /dev/null +++ b/compare_med.glsl @@ -0,0 +1,20 @@ +// Compute the pixelwise diff between two textures. +// Computes the diff for each color chanel separately (r, g, b). +// Assumes both images are not transparent. + +// try isampler2D, ivec4 etc.? Probably not +uniform vec2 size; +uniform vec2 offs; +uniform sampler2D base; +uniform sampler2D curr; + +void main(void) +{ + vec2 pos = (gl_FragCoord.xy-offs)/size; + pos.y = 1.0 - pos.y; + vec4 color = texture2D(curr, pos); + vec4 basecolor = texture2D(base, pos); + color.xyz = color.xyz - basecolor.xyz; + color.xyz = (vec3(1.0, 1.0, 1.0) + color.xyz)/2.0; + gl_FragColor = color; +} diff --git a/src/main.cpp b/src/main.cpp index c8a4d32..6c07acd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,6 +14,9 @@ * - show fitness for individuals? * - show stats for generation? * + * 1.5) mating screen + * - + * * 2) fitness screen * - show original image * - show currently evaluated image @@ -67,7 +70,19 @@ int main() { compshdr.setUniform("base", base); compshdr.setUniform("curr", comp); - compshdr.setUniform("size", 240, 240); + compshdr.setUniform("size", sf::Vector2f(240, 240)); + compshdr.setUniform("offs", sf::Vector2f(0, 0)); + + sf::Shader medcompshdr; + medcompshdr.loadFromFile("compare_med.glsl", sf::Shader::Fragment); + if (!medcompshdr.isAvailable()) { + std::cout << "The medshader is not available\n"; + return 1; + } + medcompshdr.setUniform("base", comp); + medcompshdr.setUniform("curr", base); + medcompshdr.setUniform("size", sf::Vector2f(240, 240)); + medcompshdr.setUniform("offs", sf::Vector2f(240, 0)); // Set the resolution parameter (the resoltion is divided to make the fire smaller) // shader.setParameter("resolution", sf::Vector2f(winW / 2, winH / 2)); @@ -92,7 +107,7 @@ int main() { // sf::Vector2i mousePos = sf::Mouse::getPosition(window); // shader.setParameter("mouse", sf::Vector2f(mousePos.x, mousePos.y - winH)); - // Draw the sprites, one with the shader on it + // Draw the sprites window.clear(); window.draw(sprbase); @@ -103,6 +118,9 @@ int main() { sprcomp.setPosition(0, 240); window.draw(sprcomp, &compshdr); + sprcomp.setPosition(240, 240); + window.draw(sprcomp, &medcompshdr); + window.display(); }