circle_radius(2.0f),
gaussian_radius(0.0f),
correlation(0.95f),
- noise(0.01f)
+ noise(0.01f),
+ last_R(-1),
+ last_circle_radius(-1.0f),
+ last_gaussian_radius(-1.0f),
+ last_correlation(-1.0f),
+ last_noise(-1.0f)
{
register_int("matrix_size", &R);
register_float("circle_radius", &circle_radius);
{
char buf[256];
sprintf(buf, "#define R %u\n", R);
+
+ assert(R >= 1);
+ assert(R <= 25); // Same limit as Refocus.
+
+ last_R = R;
return buf + read_file("deconvolution_sharpen_effect.frag");
}
} // namespace
-void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num)
+void DeconvolutionSharpenEffect::update_deconvolution_kernel()
{
- Effect::set_gl_state(glsl_program_num, prefix, sampler_num);
-
- assert(R >= 1);
- assert(R <= 25); // Same limit as Refocus.
-
printf("circular blur radius: %5.3f\n", circle_radius);
printf("gaussian blur radius: %5.3f\n", gaussian_radius);
printf("correlation: %5.3f\n", correlation);
assert(g_flattened.cols() == 1);
// Normalize and de-flatten the deconvolution matrix.
- MatrixXf g(R + 1, R + 1);
+ g = MatrixXf(R + 1, R + 1);
sum = 0.0f;
for (int i = 0; i < g_flattened.rows(); ++i) {
int y = i / (R + 1);
g(y, x) = g_flattened(i) / sum;
}
+ last_circle_radius = circle_radius;
+ last_gaussian_radius = gaussian_radius;
+ last_correlation = correlation;
+ last_noise = noise;
+}
+
+void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num)
+{
+ Effect::set_gl_state(glsl_program_num, prefix, sampler_num);
+
+ assert(R == last_R);
+
+ if (fabs(circle_radius - last_circle_radius) > 1e-3 ||
+ fabs(gaussian_radius - last_gaussian_radius) > 1e-3 ||
+ fabs(correlation - last_correlation) > 1e-3 ||
+ fabs(noise - last_noise) > 1e-3) {
+ update_deconvolution_kernel();
+ }
// Now encode it as uniforms, and pass it on to the shader.
// (Actually the shader only uses about half of the elements.)
float samples[4 * (R + 1) * (R + 1)];
#include "effect.h"
+#include <Eigen/Dense>
+
class DeconvolutionSharpenEffect : public Effect {
public:
DeconvolutionSharpenEffect();
// (ie., blur is assumed to be a 2px circle), correlation = 0.95, and noise = 0.01.
// Note that once the radius starts going too far past R, you will get nonsensical results.
float circle_radius, gaussian_radius, correlation, noise;
+
+ // The deconvolution kernel, and the parameters last time we did an update.
+ Eigen::MatrixXf g;
+ int last_R;
+ float last_circle_radius, last_gaussian_radius, last_correlation, last_noise;
+
+ void update_deconvolution_kernel();
};
#endif // !defined(_DECONVOLUTION_SHARPEN_EFFECT_H)