PICCANTE  0.4
The hottest HDR imaging library!
filter.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_HPP
19 #define PIC_GL_FILTERING_FILTER_HPP
20 
21 #include "../../base.hpp"
22 #include "../../util/array.hpp"
23 #include "../../util/std_util.hpp"
24 #include "../../gl/image.hpp"
25 #include "../../gl/image_vec.hpp"
26 #include "../../util/array.hpp"
27 #include "../../util/gl/technique.hpp"
28 #include "../../util/gl/quad.hpp"
29 
30 namespace pic {
31 
35 class FilterGL
36 {
37 protected:
38  //FBO
39  Fbo *fbo;
40 
41  //Quad
43 
44  //Shaders
46 
47  GLenum target;
48 
50 
51  bool bFboOwn;
52 public:
53 
54  bool bDelete;
55  std::vector< FilterGL* > filters;
56 
58 
63  {
64  bDelete = false;
65 
66  fbo = NULL;
67 
68  this->bFboOwn = true;
69  quad = new QuadGL(false, 1.0f, 1.0f);
70 
71  target = GL_TEXTURE_2D;
72 
73  //getting a vertex program for screen aligned quad
75  }
76 
78  {
79  release();
80  }
81 
85  void release()
86  {
87  quad = delete_s(quad);
88 
89  if(bFboOwn) {
90  fbo = delete_s(fbo);
91  }
92 
93  releaseAux();
94  }
95 
99  virtual void releaseAux()
100  {
101 
102  }
103 
108  void setFbo(Fbo *fbo)
109  {
110  this->fbo = fbo;
111  this->bFboOwn = false;
112  }
113 
118  virtual Fbo *getFbo()
119  {
120  return fbo;
121  }
122 
131  virtual void OutputSize(ImageGLVec imgIn, int &width, int &height, int &channels, int &frames)
132  {
133  width = imgIn[0]->width;
134  height = imgIn[0]->height;
135  channels = imgIn[0]->channels;
136  frames = imgIn[0]->frames;
137  }
138 
144  {
145  if(flt == NULL) {
146  return;
147  }
148 
149  if(!flt->filters.empty()) {
150  for(unsigned int i = 0; i < flt->filters.size(); i++) {
151  insertFilter(flt->filters[i]);
152  }
153  } else {
154  filters.push_back(flt);
155  }
156  }
157 
162  void setTarget(GLenum target)
163  {
164  this->target = target;
165  }
166 
172  virtual void changePass(int pass, int tPass)
173  {
174  }
175 
182  static std::string gammaCorrection(std::string fragment_source,
183  bool bGammaCorrection)
184  {
185  size_t processing_found = fragment_source.find("__GAMMA__CORRECTION__");
186 
187  if(processing_found != std::string::npos) {
188  if(bGammaCorrection) {
189  fragment_source.replace(processing_found, 21,
190  " color = pow(color, vec3(1.0 / 2.2)); ");
191  } else {
192  fragment_source.replace(processing_found, 21, " ");
193  }
194  }
195 
196  return fragment_source;
197  }
198 
205  virtual ImageGL *setupAux(ImageGLVec imgIn, ImageGL *imgOut)
206  {
207  return allocateOutputMemory(imgIn, imgOut, bDelete);
208  }
209 
218  {
219  int w, h, c, f;
220  OutputSize(imgIn, w, h, c, f);
221 
222  if(imgOut == NULL) {
223  imgOut = new ImageGL(f, w, h, c, IMG_GPU, imgIn[0]->getTarget());
224  } else {
225  bool bSame = imgOut->width == w &&
226  imgOut->height == h &&
227  imgOut->channels == c &&
228  imgOut->frames == f;
229 
230  if(!bSame) {
231  if(bDelete) {
232  delete imgOut;
233  }
234 
235  imgOut = new ImageGL(f, w, h, c, IMG_GPU, imgIn[0]->getTarget());
236  }
237  }
238 
239  return imgOut;
240  }
241 
242  virtual void bindTechnique()
243  {
244  technique.bind();
245  }
246 
247  virtual void unbindTechnique()
248  {
249  technique.unbind();
250  }
251 
258  virtual ImageGL *Process(ImageGLVec imgIn, ImageGL *imgOut)
259  {
260  if(imgIn.empty()) {
261  return imgOut;
262  }
263 
264  if(imgIn[0] == NULL) {
265  return imgOut;
266  }
267 
268  imgOut = setupAux(imgIn, imgOut);
269 
270  if(imgOut == NULL) {
271  return NULL;
272  }
273 
274  //create an FBO
275  if(fbo == NULL) {
276  fbo = new Fbo();
277  bFboOwn = true;
278  }
279 
280  fbo->create(imgOut->width, imgOut->height, imgOut->frames, false, imgOut->getTexture());
281 
282  //bind the FBO
283  fbo->bind();
284  glViewport(0, 0, (GLsizei)imgIn[0]->width, (GLsizei)imgIn[0]->height);
285 
286  //bind shaders
287  bindTechnique();
288 
289  //bind textures
290  int n = int(imgIn.size());
291  for(auto i = 0; i < n; i++) {
292  glActiveTexture(GL_TEXTURE0 + i);
293  imgIn[i]->bindTexture();
294  }
295 
296  //bind texture internal filter parameters
297  int m = int(param.size());
298  for(auto i = 0; i < m; i++) {
299  glActiveTexture(GL_TEXTURE0 + n + i);
300  param[i]->bindTexture();
301  }
302 
303  //render an aligned quad
304  quad->Render();
305 
306  //unbind the FBO
307  fbo->unbind();
308 
309  //unbind shaders
310  unbindTechnique();
311 
312  //unbind textures
313  for(auto i = 0; i< n; i++) {
314  glActiveTexture(GL_TEXTURE0 + i);
315  imgIn[i]->unBindTexture();
316  }
317 
318  for(auto i = 0; i < m; i++) {
319  glActiveTexture(GL_TEXTURE0 + n + i);
320  param[i]->unBindTexture();
321  }
322 
323  return imgOut;
324  }
325 };
326 
327 } // end namespace pic
328 
329 #endif /* PIC_GL_FILTERING_FILTER_HPP */
330 
void unbind()
unbind
int channels
Definition: filter_radial_basis_function.hpp:80
int frames
Definition: filter_radial_basis_function.hpp:80
void setTarget(GLenum target)
setTarget
Definition: filter.hpp:162
T * delete_s(T *data)
delete_s
Definition: std_util.hpp:123
GLenum target
Definition: filter.hpp:47
void unbind()
unbind
Definition: technique.hpp:197
The Fbo class.
Definition: fbo.hpp:32
void insertFilter(FilterGL *flt)
insertFilter
Definition: filter.hpp:143
virtual void releaseAux()
releaseAux
Definition: filter.hpp:99
bool bFboOwn
Definition: filter.hpp:51
bool bDelete
Definition: filter.hpp:54
virtual Fbo * getFbo()
getFbo
Definition: filter.hpp:118
std::vector< FilterGL *> filters
Definition: filter.hpp:55
TechniqueGL technique
Definition: filter.hpp:45
The ImageGL class.
Definition: image.hpp:42
void release()
release
Definition: filter.hpp:85
The TechniqueGL class.
Definition: technique.hpp:31
ImageGLVec param
Definition: filter.hpp:49
static std::string getVertexProgramV3()
getVertexProgramV3 creates a simple vertex program.
Definition: quad.hpp:216
The QuadGL class.
Definition: quad.hpp:30
virtual ImageGL * setupAux(ImageGLVec imgIn, ImageGL *imgOut)
setupAux
Definition: filter.hpp:205
The FilterGL class.
Definition: filter.hpp:35
QuadGL * quad
Definition: filter.hpp:42
static std::string gammaCorrection(std::string fragment_source, bool bGammaCorrection)
gammaCorrection
Definition: filter.hpp:182
bool create(int width, int height, bool bDepth)
create
int width
Definition: filter_radial_basis_function.hpp:80
void Render()
Render draws a quad on screen.
Definition: quad.hpp:140
std::string fragment_source
Definition: filter.hpp:57
std::string vertex_source
Definition: filter.hpp:57
virtual ImageGL * Process(ImageGLVec imgIn, ImageGL *imgOut)
Process.
Definition: filter.hpp:258
ImageGL * allocateOutputMemory(ImageGLVec imgIn, ImageGL *imgOut, bool bDelete)
allocateOutputMemory
Definition: filter.hpp:217
~FilterGL()
Definition: filter.hpp:77
virtual void bindTechnique()
Definition: filter.hpp:242
Fbo * fbo
Definition: filter.hpp:39
FilterGL()
FilterGL.
Definition: filter.hpp:62
GLuint getTexture() const
getTexture
Definition: image.hpp:369
void setFbo(Fbo *fbo)
setFbo
Definition: filter.hpp:108
Definition: bilateral_separation.hpp:25
std::string geometry_source
Definition: filter.hpp:57
Definition: image.hpp:37
void bind()
bind
virtual void changePass(int pass, int tPass)
changePass
Definition: filter.hpp:172
virtual void unbindTechnique()
Definition: filter.hpp:247
void bind()
bind
Definition: technique.hpp:189
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
virtual void OutputSize(ImageGLVec imgIn, int &width, int &height, int &channels, int &frames)
OutputSize.
Definition: filter.hpp:131