18 #ifndef PIC_GL_FILTERING_FILTER_BILATERAL_2DSE_HPP 19 #define PIC_GL_FILTERING_FILTER_BILATERAL_2DSE_HPP 21 #include "../../gl/filtering/filter.hpp" 22 #include "../../util/file_lister.hpp" 23 #include "../../gl/point_samplers/sampler_random_m.hpp" 84 static int main(
int argc,
char* argv[])
87 printf(
"Usage: name_input sigma_s sigma_pos sigma_nor sigma_alb\n");
91 execute(argv[1],
float(atof(argv[2])),
float(atof(argv[3])),
float(atof(argv[4])),
float(atof(argv[5])));
113 std::string nameOut = name +
"_flt." + ext;
115 std::string namePos = name +
"_pos." + ext;
116 std::string nameNor = name +
"_nor." + ext;
117 std::string nameAlb = name +
"_alb." + ext;
133 vec.push_back(&imgIn);
134 vec.push_back(&imgPos);
135 vec.push_back(&imgNor);
136 vec.push_back(&imgAlb);
151 for(
int i = 0; i < testing; i++) {
160 double ms = double(timeVal) / (double(testing) * 1000000.0);
161 printf(
"Cross Bilateral Filter with G-buffer on GPU time: %f ms\n",
ms);
165 imgOut->
Write(nameOut);
182 int halfKernelSize = kernelSize >> 1;
188 Image tmp_imageRand(1, 128, 128, 1);
190 tmp_imageRand *= float(nRand - 1);
199 printf(
"Window: %d\n", halfKernelSize);
202 Vec2i window =
Vec2i(halfKernelSize, halfKernelSize);
222 uniform sampler2D u_tex;
223 uniform sampler2D u_edge_pos;
224 uniform sampler2D u_edge_nor;
225 uniform sampler2D u_edge_alb;
226 uniform isampler2D u_poisson;
227 uniform sampler2D u_rand;
228 uniform
int nSamples;
229 uniform
float sigma_s2;
230 uniform
float sigma_pos2;
231 uniform
float sigma_nor2;
232 uniform
float sigma_alb2;
236 vec3 color = vec3(0.0, 0.0, 0.0);
237 ivec2 coordsFrag = ivec2(gl_FragCoord.xy);
239 vec3 colRef = texelFetch(u_tex, coordsFrag, 0).xyz;
240 vec3 edge_posRef = texelFetch(u_edge_pos, coordsFrag, 0).xyz;
241 vec3 edge_norRef = texelFetch(u_edge_nor, coordsFrag, 0).xyz;
242 vec3 edge_albRef = texelFetch(u_edge_alb, coordsFrag, 0).xyz;
245 float shifter = texture2D(u_rand, gl_FragCoord.xy, 0).x;
247 for(
int i = 0; i < nSamples; i++) {
249 ivec3 coords = texelFetch(u_poisson, ivec2(i, shifter), 0).xyz;
251 vec3 tmpEdge = texelFetch(u_edge_pos, coordsFrag.xy + coords.xy, 0).xyz;
252 vec3 tmpEdge2 = tmpEdge - edge_posRef;
253 float dstPos = dot(tmpEdge2.xyz, tmpEdge2.xyz);
255 tmpEdge = texelFetch(u_edge_nor, coordsFrag.xy + coords.xy, 0).xyz;
256 float dstNor = 1.0 - abs(dot(tmpEdge, edge_norRef));
258 tmpEdge = texelFetch(u_edge_alb, coordsFrag.xy + coords.xy, 0).xyz;
259 tmpEdge2 = tmpEdge - edge_albRef;
260 float dstAlb = dot(tmpEdge2.xyz, tmpEdge2.xyz);
262 float tmp = dstPos / sigma_pos2 + dstAlb / sigma_alb2 + float(coords.z) / sigma_s2 + dstNor / sigma_nor2 ;
265 vec3 tmpCol = texelFetch(u_tex, coordsFrag.xy + coords.xy, 0).xyz;
266 color.xyz += tmpCol * tmp;
270 f_color = vec4(weight > 0.0 ? color / weight : colRef, 1.0);
279 printf(
"Number of samples: %d\n",
ms->
nSamples);
284 update(-1.0f, -1.0f, -1.0f, -1.0f);
293 flag = (this->sigma_s ==
sigma_s);
298 flag = flag || (this->sigma_p ==
sigma_p);
303 flag = flag || (this->sigma_n ==
sigma_n);
308 flag = flag || (this->sigma_a ==
sigma_a);
313 int halfKernelSize = kernelSize >> 1;
316 Vec2i window =
Vec2i(halfKernelSize, halfKernelSize);
321 float sigmas2 = 2.0f * this->sigma_s * this->
sigma_s;
322 float sigmap2 = 2.0f * this->sigma_p * this->
sigma_p;
323 float sigman2 = 2.0f * this->sigma_n * this->
sigma_n;
324 float sigmaa2 = 2.0f * this->sigma_a * this->
sigma_a;
348 if(imgIn[0] == NULL) {
352 int w = imgIn[0]->
width;
353 int h = imgIn[0]->height;
357 imgOut =
new ImageGL(imgIn[0]->frames, w, h, imgIn[0]->channels,
IMG_GPU, GL_TEXTURE_2D);
373 glViewport(0, 0, (GLsizei)w, (GLsizei)h);
379 glActiveTexture(GL_TEXTURE5);
380 glBindTexture(GL_TEXTURE_2D, edge_alb->
getTexture());
382 glActiveTexture(GL_TEXTURE4);
383 glBindTexture(GL_TEXTURE_2D, edge_nor->
getTexture());
385 glActiveTexture(GL_TEXTURE3);
386 glBindTexture(GL_TEXTURE_2D, edge_pos->
getTexture());
388 glActiveTexture(GL_TEXTURE2);
391 glActiveTexture(GL_TEXTURE1);
394 glActiveTexture(GL_TEXTURE0);
395 glBindTexture(GL_TEXTURE_2D, base->
getTexture());
407 glActiveTexture(GL_TEXTURE5);
408 glBindTexture(GL_TEXTURE_2D, 0);
410 glActiveTexture(GL_TEXTURE4);
411 glBindTexture(GL_TEXTURE_2D, 0);
413 glActiveTexture(GL_TEXTURE3);
414 glBindTexture(GL_TEXTURE_2D, 0);
416 glActiveTexture(GL_TEXTURE2);
417 glBindTexture(GL_TEXTURE_2D, 0);
419 glActiveTexture(GL_TEXTURE1);
420 glBindTexture(GL_TEXTURE_2D, 0);
422 glActiveTexture(GL_TEXTURE0);
423 glBindTexture(GL_TEXTURE_2D, 0);
static ImageGL * execute(std::string nameIn, float sigma_s, float sigma_p, float sigma_n, float sigma_a, int testing=1)
execute
Definition: filter_bilateral_2ds_e.hpp:106
void update(float sigma_s, float sigma_p, float sigma_n, float sigma_a)
update
TechniqueGL technique
Definition: display.hpp:45
The Fbo class.
Definition: display.hpp:32
int channels
Definition: filter_radial_basis_function.hpp:80
FilterGLBilateral2DSE(float sigma_s, float sigma_p, float sigma_n, float sigma_a)
FilterGLBilateral2DSE.
static int getKernelSize(float sigma)
KernelSize computes the size of a kernel in pixel give its sigma.
Definition: precomputed_gaussian.hpp:121
bool create(int width, int height, bool bDepth)
create
Definition: display.hpp:207
MRSamplersGL< 2 > * ms
Definition: filter_bilateral_2ds_e.hpp:34
GLuint generateTextureGL(GLenum target, GLenum format_type, bool mipmap)
generateTextureGL
void bind()
bind
Definition: display.hpp:189
GLuint glBeginTimeQuery()
glBeginTimeQuery
Definition: timings.hpp:29
GLuint getTexture()
getTexture
Definition: display.hpp:80
float sigma_n
Definition: filter_bilateral_2ds_e.hpp:33
#define MAKE_STRING(input_string)
The Image class stores an image as buffer of float.
Definition: filter_radial_basis_function.hpp:60
float sigma_a
Definition: filter_bilateral_2ds_e.hpp:33
GLuint64 glEndTimeQuery(GLuint64 ret)
glEndTimeQuery
Definition: timings.hpp:46
void initShaders()
initShaders
The ImageGL class.
Definition: image.hpp:42
GLuint getTexture() const
getTexture
Definition: display.hpp:369
Vec< 2, int > Vec2i
Vec2i.
Definition: vec.hpp:829
bool Write(std::string nameFile, LDR_type typeWrite, int writerCounter)
Write saves an Image into a file on the disk.
Definition: filter_radial_basis_function.hpp:1924
void setUniform1f(const char *name_uniform, float value0)
SetUniform1f.
Definition: display.hpp:247
Fbo * fbo
Definition: display.hpp:39
void FragmentShader()
FragmentShader.
The FilterGLBilateral2DSE class.
Definition: filter_bilateral_2ds_e.hpp:30
void updateGL(Vec< N, int > window, int nSamples)
updateGL
Definition: sampler_random_m.hpp:129
void bind()
bind
Definition: display.hpp:427
QuadGL * quad
Definition: display.hpp:42
The FilterGL class.
Definition: filter.hpp:35
static int main(int argc, char *argv[])
main
Definition: filter_bilateral_2ds_e.hpp:84
std::string getExtension(std::string name)
getExtension gets the extension of a file name.
Definition: string.hpp:186
void Render()
Render draws a quad on screen.
Definition: display.hpp:140
void setRand(unsigned int seed)
setRand
Definition: filter_radial_basis_function.hpp:1392
GLuint generateTexture()
generateTexture
Definition: sampler_random_m.hpp:151
The FilterGL class.
Definition: display.hpp:35
The MRSamplersGL class.
Definition: sampler_random_m.hpp:45
The ImageGL class.
Definition: display.hpp:42
The Vec class.
Definition: display.hpp:35
float sigma_s
Definition: filter_bilateral_2ds_e.hpp:33
int width
Definition: filter_radial_basis_function.hpp:80
bool initStandard(std::string version_number, std::string vertex_shader_source, std::string fragment_shader_source, std::string name)
initStandard
Definition: display.hpp:114
ImageGL * Process(ImageGLVec imgIn, ImageGL *imgOut)
Process.
float sigma_p
Definition: filter_bilateral_2ds_e.hpp:33
Definition: point_samplers.hpp:51
void unbind()
unbind
Definition: display.hpp:197
void loadToMemory()
loadToMemory
std::string vertex_source
Definition: display.hpp:57
GLuint getTexture() const
getTexture
Definition: image.hpp:369
Definition: bilateral_separation.hpp:25
std::string removeExtension(std::string name)
RemoveExtension removes the extension of a string.
Definition: string.hpp:132
void unbind()
unbind
Definition: display.hpp:442
std::vector< ImageGL * > ImageGLVec
ImageGLVec an std::vector of pic::ImageGL.
Definition: display.hpp:32
ImageGL * imageRand
Definition: filter_bilateral_2ds_e.hpp:37
std::string fragment_source
Definition: display.hpp:57
int nSamples
Definition: display.hpp:53
std::vector< ImageGL * > ImageGLVec
ImageGLVec an std::vector of pic::ImageGL.
Definition: image_vec.hpp:32
int height
Definition: filter_radial_basis_function.hpp:80
void setUniform1i(const char *name_uniform, int value0)
SetUniform.
Definition: display.hpp:236