18 #ifndef PIC_GL_FILTERING_FILTER_BILATERAL_1D_HPP 19 #define PIC_GL_FILTERING_FILTER_BILATERAL_1D_HPP 21 #include "../../base.hpp" 23 #include "../../gl/filtering/filter_1d.hpp" 65 int direction, GLenum target):
FilterGL1D(direction, target)
84 uniform sampler2D u_tex;
85 uniform
float sigma_s2;
86 uniform
float sigma_r2;
89 uniform
int halfKernelSize;
93 vec3 color = vec3(0.0);
94 ivec2 coordsFrag = ivec2(gl_FragCoord.xy);
97 vec3 colRef = texelFetch(u_tex, coordsFrag.xy, 0).xyz;
99 for(
int i = -halfKernelSize; i <= halfKernelSize; i++) {
101 ivec2 coords = ivec2(i * iX, i * iY);
103 tmpCol = texelFetch(u_tex, coordsFrag.xy + coords.xy, 0).xyz;
104 vec3 tmpCol2 = tmpCol - colRef;
105 float dstR = dot(tmpCol2.xyz, tmpCol2.xyz);
106 float tmp = exp(-dstR / sigma_r2 -
float(coords.x * coords.x + coords.y *
107 coords.y) / sigma_s2);
108 color.xyz += tmpCol.xyz * tmp;
112 color = weight > 0.0 ? color / weight : colRef;
113 f_color = vec4(color.xyz, 1.0);
119 uniform sampler2DArray u_tex;
120 uniform
float sigma_s2;
121 uniform
float sigma_r2;
129 vec3 color = vec3(0.0);
130 ivec3 coordsFrag = ivec3(ivec2(gl_FragCoord.xy),
slice);
133 vec3 colRef = texelFetch(u_tex, coordsFrag, 0).xyz;
135 for(
int i = -halfKernelSize; i <= halfKernelSize; i++) {
137 ivec3 coords = coordsFrag.xyz + ivec3(i * iX, i * iY, i * iZ);
139 tmpCol = texelFetch(u_tex, coordsFrag + coords, 0).xyz;
140 vec3 tmpCol2 = tmpCol - colRef;
141 float dstR = dot(tmpCol2.xyz, tmpCol2.xyz);
142 float tmp = exp(-dstR / sigma_r2 -
float(coords.x * coords.x + coords.y *
143 coords.y) / sigma_s2);
144 color.xyz += tmpCol.xyz * tmp;
148 color = weight > 0.0 ? color / weight : colRef;
149 f_color = vec4(color.xyz, 1.0);
154 case GL_TEXTURE_2D: {
159 case GL_TEXTURE_2D_ARRAY: {
164 case GL_TEXTURE_3D: {
TechniqueGL technique
Definition: display.hpp:45
int slice
Definition: display.hpp:37
The FilterGL1D class.
Definition: filter_1d.hpp:32
static int getKernelSize(float sigma)
KernelSize computes the size of a kernel in pixel give its sigma.
Definition: precomputed_gaussian.hpp:121
float sigma_r
Definition: filter_bilateral_1d.hpp:33
float sigma_s
Definition: filter_bilateral_1d.hpp:33
virtual void initShaders()
initShaders
Definition: filter_1d.hpp:175
GLenum target
Definition: display.hpp:47
#define MAKE_STRING(input_string)
void setUniformAux()
setUniformAux
The FilterGLBilateral1D class.
Definition: filter_bilateral_1d.hpp:30
void setUniform1f(const char *name_uniform, float value0)
SetUniform1f.
Definition: display.hpp:247
FilterGLBilateral1D(float sigma_s, float sigma_r, int direction, GLenum target)
FilterGLBilateral1D.
#define PIC_INLINE
Definition: base.hpp:33
void update(float sigma_s, float sigma_r)
update
void setUniform()
setUniform
Definition: filter_1d.hpp:158
Definition: bilateral_separation.hpp:25
#define MAX(a, b)
Definition: math.hpp:73
void FragmentShader()
FragmentShader.
std::string fragment_source
Definition: display.hpp:57
The FilterGL1D class.
Definition: display.hpp:32
void release()
release
Definition: display.hpp:85
void setUniform1i(const char *name_uniform, int value0)
SetUniform.
Definition: display.hpp:236