PICCANTE  0.4
The hottest HDR imaging library!
filter_1d.hpp
Go to the documentation of this file.
1 /*
2 
3 PICCANTE
4 The hottest HDR imaging library!
5 http://vcg.isti.cnr.it/piccante
6 
7 Copyright (C) 2014
8 Visual Computing Laboratory - ISTI CNR
9 http://vcg.isti.cnr.it
10 First author: Francesco Banterle
11 
12 This Source Code Form is subject to the terms of the Mozilla Public
13 License, v. 2.0. If a copy of the MPL was not distributed with this
14 file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 
16 */
17 
18 #ifndef PIC_GL_FILTERING_FILTER_1D_HPP
19 #define PIC_GL_FILTERING_FILTER_1D_HPP
20 
21 #include "../../base.hpp"
22 
23 #include "../../util/std_util.hpp"
24 
25 #include "../../gl/filtering/filter.hpp"
26 
27 namespace pic {
28 
32 class FilterGL1D: public FilterGL
33 {
34 protected:
36 
37  int dirs[3], slice;
38 
42  virtual void initShaders();
43 
47  virtual void FragmentShader()
48  {
49 
50  }
51 
52 public:
53 
59  FilterGL1D(int direction, GLenum target);
60 
62  {
63  release();
64  }
65 
71  void changePass(int pass, int tPass);
72 
76  virtual void setUniformAux()
77  {
78 
79  }
80 
84  void setUniform();
85 
90  void setSlice(int slice)
91  {
92  this->slice = slice;
93  setUniform();
94  }
95 
100  void setSlice2(int slice)
101  {
102  this->slice = slice;
103  technique.setUniform1i("slice", slice);
104  }
105 
112  ImageGL *Process(ImageGLVec imgIn, ImageGL *imgOut);
113 };
114 
115 PIC_INLINE FilterGL1D::FilterGL1D(int direction, GLenum target): FilterGL()
116 {
117  weights = NULL;
118 
119  //protected values are assigned/computed
120  this->target = target;
121 
122  slice = 0;
123 
124  dirs[0] = dirs[1] = dirs[2] = 0;
125 
126  switch(target) {
127  case GL_TEXTURE_2D: {
128  dirs[direction % 2] = 1;
129  } break;
130 
131  case GL_TEXTURE_2D_ARRAY: {
132  dirs[direction % 3] = 1;
133  } break;
134 
135  case GL_TEXTURE_3D: {
136  dirs[direction % 3] = 1;
137  } break;
138  }
139 }
140 
141 PIC_INLINE void FilterGL1D::changePass(int pass, int tPass)
142 {
143 
144  if(target == GL_TEXTURE_2D) {
145  dirs[ pass % 2 ] = 1;
146  dirs[(pass + 1) % 2 ] = 0;
147  } else {
148  if(target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) {
149  dirs[ pass % 3 ] = 1;
150  dirs[(pass + 1) % 3 ] = 0;
151  dirs[(pass + 2) % 3 ] = 0;
152  }
153  }
154 
155  setUniform();
156 }
157 
159 {
160  technique.bind();
161  technique.setUniform1i("u_tex", 0);
162  setUniformAux();
163 
164  technique.setUniform1i("iX", dirs[0]);
165  technique.setUniform1i("iY", dirs[1]);
166 
167  if(target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) {
168  technique.setUniform1i("iZ", dirs[2]);
169  technique.setUniform1i("slice", slice);
170  }
171 
172  technique.unbind();
173 }
174 
176 {
177  technique.initStandard("330", vertex_source, fragment_source, "FilterGLConv1D");
178 
179  setUniform();
180 }
181 
183 {
184  if(imgIn[0] == NULL || imgIn.size() > 1) {
185  return imgOut;
186  }
187 
188  int w = imgIn[0]->width;
189  int h = imgIn[0]->height;
190  int f = imgIn[0]->frames;
191 
192  if(imgOut == NULL) {
193  imgOut = new ImageGL(f, w, h, imgIn[0]->channels, IMG_GPU, imgIn[0]->getTarget());
194  }
195 
196  if(fbo == NULL) {
197  fbo = new Fbo();
198  }
199 
200  fbo->create(w, h, f, false, imgOut->getTexture());
201 
202  ImageGL *base = imgIn[0];
203 
204  //bind textures
205  glActiveTexture(GL_TEXTURE0);
206  base->bindTexture();
207 
208  if(weights != NULL) {
209  glActiveTexture(GL_TEXTURE1);
210  weights->bindTexture();
211  }
212 
213  glViewport(0, 0, (GLsizei)w, (GLsizei)h);
214 
215  //bind shaders
216  technique.bind();
217 
218  //bind the fbo
219  fbo->bindSimple();
220 
221  //render an aligned quad
222  for(int z = 0; z < f; z++) {
223  setSlice2(z);
224  fbo->attachColorBuffer2(0, target, z);
225 
226  quad->Render();
227  }
228 
229  //unbind the fbo
230  fbo->unbindSimple();
231 
232  //unbingd shaders
233  technique.unbind();
234 
235  //unbind textures
236  if(weights != NULL) {
237  glActiveTexture(GL_TEXTURE1);
239  }
240 
241  glActiveTexture(GL_TEXTURE0);
242  base->unBindTexture();
243 
244  return imgOut;
245 }
246 
247 } // end namespace pic
248 
249 #endif /* PIC_GL_FILTERING_FILTER_1D_HPP */
250 
~FilterGL1D()
Definition: filter_1d.hpp:61
void changePass(int pass, int tPass)
changePass
TechniqueGL technique
Definition: display.hpp:45
The Fbo class.
Definition: display.hpp:32
The FilterGL1D class.
Definition: filter_1d.hpp:32
FilterGL1D(int direction, GLenum target)
FilterGL1D.
bool create(int width, int height, bool bDepth)
create
Definition: display.hpp:207
void bindTexture()
bindTexture
void bindTexture()
bindTexture
Definition: image.hpp:981
void bind()
bind
Definition: display.hpp:189
void unbindSimple()
unbindSimple
Definition: display.hpp:120
GLenum target
Definition: display.hpp:47
int slice
Definition: filter_1d.hpp:37
virtual void FragmentShader()
FragmentShader.
Definition: filter_1d.hpp:47
The ImageGL class.
Definition: image.hpp:42
GLuint getTexture() const
getTexture
Definition: display.hpp:369
ImageGL * weights
Definition: filter_1d.hpp:35
Fbo * fbo
Definition: display.hpp:39
QuadGL * quad
Definition: display.hpp:42
The FilterGL class.
Definition: filter.hpp:35
void attachColorBuffer2(GLuint tex, GLenum target, int slice)
attachColorBuffer2
Definition: display.hpp:402
ImageGL * Process(ImageGLVec imgIn, ImageGL *imgOut)
Process.
void unBindTexture()
unBindTexture
void Render()
Render draws a quad on screen.
Definition: display.hpp:140
The FilterGL class.
Definition: display.hpp:35
#define PIC_INLINE
Definition: base.hpp:33
The ImageGL class.
Definition: display.hpp:42
virtual void setUniformAux()
setUniformAux
Definition: filter_1d.hpp:76
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
int dirs[3]
Definition: filter_1d.hpp:37
void setUniform()
setUniform
void unbind()
unbind
Definition: display.hpp:197
void setSlice(int slice)
setSlice
Definition: filter_1d.hpp:90
void unBindTexture()
unBindTexture
Definition: image.hpp:986
std::string vertex_source
Definition: display.hpp:57
Definition: bilateral_separation.hpp:25
void setSlice2(int slice)
setSlice2
Definition: filter_1d.hpp:100
virtual void initShaders()
initShaders
std::vector< ImageGL * > ImageGLVec
ImageGLVec an std::vector of pic::ImageGL.
Definition: display.hpp:32
std::string fragment_source
Definition: display.hpp:57
Definition: image.hpp:37
void bindSimple()
bindSimple
Definition: display.hpp:112
std::vector< ImageGL * > ImageGLVec
ImageGLVec an std::vector of pic::ImageGL.
Definition: image_vec.hpp:32
void release()
release
Definition: display.hpp:85
void setUniform1i(const char *name_uniform, int value0)
SetUniform.
Definition: display.hpp:236