diff --git a/ImGuiVisitor.cpp b/ImGuiVisitor.cpp index 60b7230..04e5d0a 100644 --- a/ImGuiVisitor.cpp +++ b/ImGuiVisitor.cpp @@ -398,15 +398,6 @@ void ImGuiVisitor::visit(ImageProcessingShader &n) if (ImGui::Combo("Invert", &n.invert, "None\0Color RGB\0Luminance\0")) Action::manager().store("Invert " + std::string(n.invert<1 ? "None": (n.invert>1 ? "Luminance" : "Color"))); -// if (ImGuiToolkit::IconButton(1, 7)) { -// n.filterid = 0; -// Action::manager().store("Filter None"); -// } -// ImGui::SameLine(0, IMGUI_SAME_LINE); -// ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN); -// if (ImGui::Combo("Filter", &n.filterid, ImageProcessingShader::filter_names, IM_ARRAYSIZE(ImageProcessingShader::filter_names) ) ) -// Action::manager().store("Filter " + std::string(ImageProcessingShader::filter_names[n.filterid])); - ImGui::PopID(); ImGui::Spacing(); diff --git a/ImageProcessingShader.cpp b/ImageProcessingShader.cpp index 8d25eb2..2933e72 100644 --- a/ImageProcessingShader.cpp +++ b/ImageProcessingShader.cpp @@ -25,9 +25,6 @@ ShadingProgram imageProcessingShadingProgram("shaders/image.vs", "shaders/imageprocessing.fs"); -const char* ImageProcessingShader::filter_names[12] = { "None", "Blur", "Sharpen", "Edge", "Emboss", "Denoising", - "Erosion 3x3", "Erosion 5x5", "Erosion 7x7", "Dilation 3x3", "Dilation 5x5", "Dilation 7x7" }; - ImageProcessingShader::ImageProcessingShader(): Shader() { @@ -48,7 +45,6 @@ void ImageProcessingShader::use() program_->setUniform("lumakey", lumakey); program_->setUniform("nbColors", nbColors); program_->setUniform("invert", invert); - program_->setUniform("filterid", filterid); program_->setUniform("gamma", gamma); program_->setUniform("levels", levels); @@ -70,7 +66,6 @@ void ImageProcessingShader::reset() lumakey = 0.f; nbColors = 0; invert = 0; - filterid = 0; gamma = glm::vec4(1.f, 1.f, 1.f, 1.f); levels = glm::vec4(0.f, 1.f, 0.f, 1.f); chromakey = glm::vec4(0.f, 0.8f, 0.f, 0.f); @@ -88,7 +83,6 @@ void ImageProcessingShader::copy(ImageProcessingShader const& S) lumakey = S.lumakey; nbColors = S.nbColors; invert = S.invert; - filterid = S.filterid; gamma = S.gamma; levels = S.levels; chromakey = S.chromakey; diff --git a/ImageProcessingShader.h b/ImageProcessingShader.h index 30979ef..71c128c 100644 --- a/ImageProcessingShader.h +++ b/ImageProcessingShader.h @@ -31,13 +31,6 @@ public: // chroma key glm::vec4 chromakey; float chromadelta; - // filter identifyer - // [0] No filter - // [1 4] 4 x kernel operations; Blur, Sharpen, Edge, Emboss - // [5] 1 x convolution opening (denoising) - // [6 11] 6 x convolutions: erosion 3x3, 5x5, 7x7, dilation 3x3, 5x5, 7x7 - int filterid; - static const char* filter_names[12]; }; diff --git a/SessionCreator.cpp b/SessionCreator.cpp index 4a965a7..d59b746 100644 --- a/SessionCreator.cpp +++ b/SessionCreator.cpp @@ -917,7 +917,6 @@ void SessionLoader::visit(ImageProcessingShader &n) uniforms->QueryIntAttribute("nbColors", &n.nbColors); uniforms->QueryIntAttribute("invert", &n.invert); uniforms->QueryFloatAttribute("chromadelta", &n.chromadelta); - uniforms->QueryIntAttribute("filter", &n.filterid); } XMLElement* gamma = xmlCurrent_->FirstChildElement("gamma"); diff --git a/SessionVisitor.cpp b/SessionVisitor.cpp index d05298e..7c4f7a5 100644 --- a/SessionVisitor.cpp +++ b/SessionVisitor.cpp @@ -495,7 +495,6 @@ void SessionVisitor::visit(ImageProcessingShader &n) filter->SetAttribute("nbColors", n.nbColors); filter->SetAttribute("invert", n.invert); filter->SetAttribute("chromadelta", n.chromadelta); - filter->SetAttribute("filter", n.filterid); xmlCurrent_->InsertEndChild(filter); XMLElement *gamma = xmlDoc_->NewElement("gamma"); diff --git a/rsc/shaders/imageprocessing.fs b/rsc/shaders/imageprocessing.fs index 283f24a..1fd9f62 100644 --- a/rsc/shaders/imageprocessing.fs +++ b/rsc/shaders/imageprocessing.fs @@ -49,7 +49,6 @@ uniform float threshold; uniform float lumakey; uniform int nbColors; uniform int invert; -uniform int filterid; // conversion between rgb and YUV const mat4 RGBtoYUV = mat4(0.257, 0.439, -0.148, 0.0, @@ -57,188 +56,6 @@ const mat4 RGBtoYUV = mat4(0.257, 0.439, -0.148, 0.0, 0.098, -0.071, 0.439, 0.0, 0.0625, 0.500, 0.500, 1.0 ); -const mat3 KERNEL[5] = mat3[5]( mat3( 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0), - mat3( 0.0625, 0.125, 0.0625, - 0.125, 0.25, 0.125, - 0.0625, 0.125, 0.0625), - mat3( -1.0, -1.0, -1.0, - -1.0, 9.0, -1.0, - -1.0, -1.0, -1.0), - mat3( -2.0, 1.0, -2.0, - 1.0, 4.0, 1.0, - -2.0, 1.0, -2.0), - mat3( -2.0, -1.0, 0.0, - -1.0, 1.0, 1.0, - 0.0, 1.0, 2.0) - ); - -vec3 erosion(int N, vec2 filter_step) -{ - vec3 minValue = vec3(1.0); - - minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, minValue); - if (N < 1) - return minValue; - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0,-2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0,2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 1.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 1.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 0.0) * filter_step ).rgb, minValue); - if (N < 2) - return minValue; - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0,-3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0,3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, -2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (3.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, 0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 0.0) * filter_step ).rgb, minValue); - - return minValue; -} - -vec3 dilation(int N, vec2 filter_step) -{ - vec3 maxValue = vec3(0.0); - - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, maxValue); - if (N < 1) - return maxValue; - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0,-2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0,2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 1.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 1.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 0.0) * filter_step ).rgb, maxValue); - if (N < 2) - return maxValue; - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0,-3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0,3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, -2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (3.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 0.0) * filter_step ).rgb, maxValue); - - return maxValue; -} - - -vec3 opening(vec2 filter_step) -{ - // 1) erosion - vec3 minValue1 = vec3(1.0); - minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue1); - minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, minValue1); - minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, minValue1); - minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 1.0) * filter_step ).rgb, minValue1); - minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, -1.0) * filter_step ).rgb, minValue1); - vec3 minValue2 = vec3(1.0); - minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue2); - minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue2); - minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue2); - minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, -1.0) * filter_step ).rgb, minValue2); - minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue2); - vec3 minValue3 = vec3(1.0); - minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue3); - minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, -1.0) * filter_step ).rgb, minValue3); - minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, -2.0) * filter_step ).rgb, minValue3); - minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue3); - minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue3); - vec3 minValue4 = vec3(1.0); - minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue4); - minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, minValue4); - minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (2.0, 0.0) * filter_step ).rgb, minValue4); - minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 1.0) * filter_step ).rgb, minValue4); - minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue4); - - // 2) dilation - vec3 maxValue = vec3(0.0); - maxValue = max(minValue1, maxValue); - maxValue = max(minValue2, maxValue); - maxValue = max(minValue3, maxValue); - maxValue = max(minValue4, maxValue); - - return maxValue; -} - -vec3 convolution(mat3 kernel, vec2 filter_step) -{ - int i = 0, j = 0; - vec3 sum = vec3(0.0); - - for (i = 0; i<3; ++i) - for (j = 0; j<3; ++j) - sum += texture(iChannel0, texcoord.xy + filter_step * vec2 (i-1, j-1) ).rgb * kernel[i][j]; - - return sum; -} - -vec3 apply_filter() { - - vec2 filter_step = 1.f / textureSize(iChannel0, 0); - - if (filterid < 1 || filterid > 11) - return texture(iChannel0, texcoord.xy).rgb; - else if (filterid < 5) - return convolution( KERNEL[filterid], filter_step); - else if (filterid < 6) - return opening(filter_step); - else if (filterid < 9) - return erosion( filterid - 6 , filter_step); - else - return dilation( filterid - 9, filter_step); -} - /* ** Hue, saturation, luminance <=> Red Green Blue */ @@ -320,13 +137,13 @@ void main(void) // adjust UV texcoord = iTransform * vec4(vertexUV.x, vertexUV.y, 0.0, 1.0); - // deal with alpha separately - float ma = texture(iChannel0, texcoord.xy).a; -// float ma = texture(maskTexture, texcoord.xy).a * texture(iChannel0, texcoord.xy).a; - float alpha = clamp(ma * color.a, 0.0, 1.0); + vec4 texcolor = texture(iChannel0, texcoord.xy); - // read color & apply basic filterid - vec3 transformedRGB = apply_filter(); + // deal with alpha separately + float alpha = clamp(texcolor.a * color.a, 0.0, 1.0); + + // read color + vec3 transformedRGB = texcolor.rgb; // chromakey alpha -= mix( 0.0, 1.0 - alphachromakey( transformedRGB, chromakey.rgb, chromadelta), float(chromadelta > 0.0001) );