ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ProgramGLSL.h
Go to the documentation of this file.
1 // File: ProgramGLSL.h
3 // Author: Changchang Wu
4 // Description : Interface for ProgramGLSL classes
5 // ProgramGLSL: Glsl Program
6 // FilterGLSL: Glsl Gaussian Filters
7 // ShaderBag: base class of ShaderBagPKSL and ShaderBagGLSL
8 //
9 // Copyright (c) 2007 University of North Carolina at Chapel Hill
10 // All Rights Reserved
11 //
12 // Permission to use, copy, modify and distribute this software and its
13 // documentation for educational, research and non-profit purposes, without
14 // fee, and without a written agreement is hereby granted, provided that the
15 // above copyright notice and the following paragraph appear in all copies.
16 //
17 // The University of North Carolina at Chapel Hill make no representations
18 // about the suitability of this software for any purpose. It is provided
19 // 'as is' without express or implied warranty.
20 //
21 // Please send BUG REPORTS to ccwu@cs.unc.edu
22 //
24 
25 
26 #ifndef _PROGRAM_GLSL_H
27 #define _PROGRAM_GLSL_H
28 
29 
30 #include "ProgramGPU.h"
31 
32 class ProgramGLSL:public ProgramGPU
33 {
34  class ShaderObject
35  {
36  GLuint _shaderID;
37  int _type;
38  int _compiled;
39  static int ReadShaderFile(const char * source, char *& code);
40  void CheckCompileLog();
41  public:
42  void PrintCompileLog(ostream & os );
43  int inline IsValidShaderObject(){ return _shaderID && _compiled;}
44  int IsValidVertexShader();
45  int IsValidFragmentShader();
46  GLuint GetShaderID(){return _shaderID;}
47  ~ShaderObject();
48  ShaderObject(int shadertype, const char * source, int filesource =0);
49  };
50 
51 protected:
52  int _linked;
54  GLuint _programID;
55 private:
56  void AttachShaderObject(ShaderObject& shader);
57  void DetachShaderObject(ShaderObject& shader);
58 
59 public:
60  void ReLink();
61  int IsNative();
62  int UseProgram();
63  void PrintLinkLog(std::ostream&os);
64  int ValidateProgram();
65  void CheckLinkLog();
66  int LinkProgram();
67  operator GLuint (){return _programID;}
68  virtual void * GetProgramID() { return (void*) _programID; }
69 public:
70  ProgramGLSL();
71  ~ProgramGLSL();
72  ProgramGLSL(const char* frag_source);
73 };
74 
75 
76 class GLTexImage;
77 class FilterGLSL : public FilterProgram
78 {
79 private:
80  ProgramGPU* CreateFilterH(float kernel[], int width);
81  ProgramGPU* CreateFilterV(float kernel[], int height);
82  ProgramGPU* CreateFilterHPK(float kernel[], int width);
83  ProgramGPU* CreateFilterVPK(float kernel[], int height);
84 public:
85  void MakeFilterProgram(float kernel[], int width);
86 public:
87  FilterGLSL(float sigma) ;
88 };
89 
90 class SiftParam;
91 
93 //class ShaderBag
94 //desciption: pure virtual class
95 // provides storage and usage interface of all the shaders for SIFT
96 // two implementations are ShaderBagPKSL and ShaderBagGLSL
98 class ShaderBag
99 {
100 public:
101  //shader: rgb to gray
103  //shader: copy keypoint to PBO
105  //shader: debug view
107  //shader: orientation
108  //shader: assign simple orientation to keypoints if hardware is low
110  //shader: display gaussian levels
112  //shader: display difference of gassian
114  //shader: display gradient
116  //shader: display keypoints as red(maximum) and blue (minimum)
118  //shader: up/down-sample
120  //shader: compute gradient/dog
123  //shader: keypoint detection in one pass
126  //shader: feature list generations..
134  //shader: generate vertex to display SIFT as a square
136  //shader: descriptor
138  //shader: copy pixels to margin
140 public:
142  vector<FilterProgram*> f_gaussian_skip0_v;
146 public:
147  virtual void SetGenListInitParam(int w, int h){};
148  virtual void SetGenListEndParam(int ktex){};
149  virtual void SetMarginCopyParam(int xmax, int ymax){};
150  virtual void LoadDescriptorShader(){};
151  virtual void SetFeatureDescirptorParam(int gtex, int otex, float dwidth, float fwidth, float width, float height, float sigma){};
152  virtual void SetFeatureOrientationParam(int gtex, int width, int height, float sigma, int stex, float step){};
153  virtual void SetSimpleOrientationInput(int oTex, float sigma, float sigma_step){};
154  virtual void LoadOrientationShader() =0;
155  virtual void SetGenListStartParam(float width, int tex0) =0;
156  virtual void LoadGenListShader(int ndoglev, int nlev)=0;
157  virtual void UnloadProgram()=0;
158  virtual void LoadKeypointShader(float threshold, float edgeTrheshold) = 0;
159  virtual void LoadFixedShaders()=0;
160  virtual void LoadDisplayShaders() = 0;
161  virtual void SetDogTexParam(int texU, int texD)=0;
162  virtual void SetGradPassParam(int texP=0){}
163  virtual void SetGenListStepParam(int tex, int tex0) = 0;
164  virtual void SetGenVBOParam( float width, float fwidth, float size)=0;
165 public:
166  void CreateGaussianFilters(SiftParam&param);
167  void SelectInitialSmoothingFilter(int octave_min, SiftParam&param);
168  void LoadDynamicShaders(SiftParam& param);
169  ShaderBag();
170  virtual ~ShaderBag();
171 };
172 
173 
175 {
176  GLint _param_dog_texu;
177  GLint _param_dog_texd;
178  GLint _param_ftex_width;
179  GLint _param_genlist_start_tex0;
180  GLint _param_genlist_step_tex0;
181  GLint _param_genvbo_size;
182  GLint _param_orientation_gtex;
183  GLint _param_orientation_size;
184  GLint _param_orientation_stex;
185  GLint _param_margin_copy_truncate;
186  GLint _param_genlist_init_bbox;
187  GLint _param_descriptor_gtex;
188  GLint _param_descriptor_size;
189  GLint _param_descriptor_dsize;
190 public:
191  virtual void SetMarginCopyParam(int xmax, int ymax);
192  void SetSimpleOrientationInput(int oTex, float sigma, float sigma_step);
193  void LoadOrientationShader();
194  void LoadDescriptorShaderF2();
195  virtual void LoadDescriptorShader();
196  virtual void SetFeatureOrientationParam(int gtex, int width, int height, float sigma, int stex = 0, float step = 1.0f);
197  virtual void SetFeatureDescirptorParam(int gtex, int otex, float dwidth, float fwidth, float width, float height, float sigma);
198  static void WriteOrientationCodeToStream(ostream& out);
199  static ProgramGLSL* LoadGenListStepShader(int start, int step);
200  virtual void SetGenListInitParam(int w, int h);
201  virtual void SetGenListStartParam(float width, int tex0);
202  virtual void LoadGenListShader(int ndoglev, int nlev);
203  virtual void UnloadProgram();
204  virtual void LoadKeypointShader(float threshold, float edgeTrheshold);
205  virtual void LoadFixedShaders();
206  virtual void LoadDisplayShaders();
207  virtual void SetDogTexParam(int texU, int texD);
208  virtual void SetGenListStepParam(int tex, int tex0);
209  virtual void SetGenVBOParam( float width, float fwidth, float size);
210  virtual ~ShaderBagGLSL(){}
211 };
212 
213 
215 {
216 private:
217  GLint _param_dog_texu;
218  GLint _param_dog_texd;
219  GLint _param_dog_texi;
220  GLint _param_margin_copy_truncate;
221  GLint _param_grad_pass_texp;
222  GLint _param_genlist_init_bbox;
223  GLint _param_genlist_start_tex0;
224  GLint _param_ftex_width;
225  GLint _param_genlist_step_tex0;
226  GLint _param_genlist_end_ktex;
227  GLint _param_genvbo_size;
228  GLint _param_orientation_gtex;
229  GLint _param_orientation_otex;
230  GLint _param_orientation_size;
231  GLint _param_descriptor_gtex;
232  GLint _param_descriptor_otex;
233  GLint _param_descriptor_size;
234  GLint _param_descriptor_dsize;
235 
236  //
237  ProgramGLSL* s_rect_description;
238 public:
239  ShaderBagPKSL () {s_rect_description = NULL; }
240  virtual ~ShaderBagPKSL() {if(s_rect_description) delete s_rect_description; }
241  virtual void LoadFixedShaders();
242  virtual void LoadDisplayShaders();
243  virtual void LoadOrientationShader() ;
244  virtual void SetGenListStartParam(float width, int tex0) ;
245  virtual void LoadGenListShader(int ndoglev, int nlev);
246  virtual void UnloadProgram();
247  virtual void LoadKeypointShader(float threshold, float edgeTrheshold) ;
248  virtual void LoadDescriptorShader();
249  virtual void LoadDescriptorShaderF2();
253  virtual void SetDogTexParam(int texU, int texD);
254  virtual void SetGradPassParam(int texP);
255  virtual void SetGenListStepParam(int tex, int tex0);
256  virtual void SetGenVBOParam( float width, float fwidth, float size);
257  virtual void SetFeatureDescirptorParam(int gtex, int otex, float dwidth, float fwidth, float width, float height, float sigma);
258  virtual void SetFeatureOrientationParam(int gtex, int width, int height, float sigma, int stex, float step);
259  virtual void SetSimpleOrientationInput(int oTex, float sigma, float sigma_step);
260  virtual void SetGenListEndParam(int ktex);
261  virtual void SetGenListInitParam(int w, int h);
262  virtual void SetMarginCopyParam(int xmax, int ymax);
263 };
264 
265 
266 #endif
267 
int width
int size
int height
#define NULL
void MakeFilterProgram(float kernel[], int width)
FilterGLSL(float sigma)
virtual void * GetProgramID()
Definition: ProgramGLSL.h:68
void PrintLinkLog(std::ostream &os)
int ValidateProgram()
GLuint _programID
Definition: ProgramGLSL.h:54
GLint _TextureParam0
Definition: ProgramGLSL.h:53
int UseProgram()
void CheckLinkLog()
int LinkProgram()
virtual void LoadGenListShader(int ndoglev, int nlev)
virtual void SetMarginCopyParam(int xmax, int ymax)
virtual ~ShaderBagGLSL()
Definition: ProgramGLSL.h:210
virtual void LoadKeypointShader(float threshold, float edgeTrheshold)
void LoadDescriptorShaderF2()
virtual void SetGenListStepParam(int tex, int tex0)
virtual void SetDogTexParam(int texU, int texD)
virtual void SetGenListStartParam(float width, int tex0)
void LoadOrientationShader()
virtual void SetGenListInitParam(int w, int h)
virtual void LoadDisplayShaders()
virtual void UnloadProgram()
virtual void LoadFixedShaders()
virtual void SetGenVBOParam(float width, float fwidth, float size)
void SetSimpleOrientationInput(int oTex, float sigma, float sigma_step)
static void WriteOrientationCodeToStream(ostream &out)
virtual void LoadDescriptorShader()
virtual void SetFeatureDescirptorParam(int gtex, int otex, float dwidth, float fwidth, float width, float height, float sigma)
static ProgramGLSL * LoadGenListStepShader(int start, int step)
virtual void SetFeatureOrientationParam(int gtex, int width, int height, float sigma, int stex=0, float step=1.0f)
virtual void UnloadProgram()
virtual void SetGenListEndParam(int ktex)
virtual void SetGenListStartParam(float width, int tex0)
virtual void SetSimpleOrientationInput(int oTex, float sigma, float sigma_step)
static ProgramGLSL * LoadDescriptorProgramRECT()
static ProgramGLSL * LoadDescriptorProgramPKSL()
virtual void SetGenListStepParam(int tex, int tex0)
virtual void LoadOrientationShader()
virtual void LoadDescriptorShader()
virtual void LoadDescriptorShaderF2()
virtual void SetDogTexParam(int texU, int texD)
virtual void LoadDisplayShaders()
virtual void SetMarginCopyParam(int xmax, int ymax)
virtual void LoadFixedShaders()
virtual void SetGenVBOParam(float width, float fwidth, float size)
virtual void LoadKeypointShader(float threshold, float edgeTrheshold)
virtual void SetFeatureDescirptorParam(int gtex, int otex, float dwidth, float fwidth, float width, float height, float sigma)
virtual void SetGenListInitParam(int w, int h)
virtual void LoadGenListShader(int ndoglev, int nlev)
virtual void SetGradPassParam(int texP)
virtual ~ShaderBagPKSL()
Definition: ProgramGLSL.h:240
virtual void SetFeatureOrientationParam(int gtex, int width, int height, float sigma, int stex, float step)
virtual void LoadGenListShader(int ndoglev, int nlev)=0
FilterProgram * f_gaussian_skip1
Definition: ProgramGLSL.h:143
virtual void LoadFixedShaders()=0
virtual void LoadOrientationShader()=0
virtual void SetGenListStepParam(int tex, int tex0)=0
ProgramGPU * s_seperate_sp
Definition: ProgramGLSL.h:125
ProgramGPU * s_keypoint
Definition: ProgramGLSL.h:124
ProgramGPU * s_display_gaussian
Definition: ProgramGLSL.h:111
ProgramGPU * s_display_grad
Definition: ProgramGLSL.h:115
ProgramGPU * s_genlist_histo
Definition: ProgramGLSL.h:129
virtual void SetSimpleOrientationInput(int oTex, float sigma, float sigma_step)
Definition: ProgramGLSL.h:153
virtual void SetGenVBOParam(float width, float fwidth, float size)=0
ProgramGPU * s_genlist_step
Definition: ProgramGLSL.h:131
ProgramGPU * s_dog_pass
Definition: ProgramGLSL.h:122
ProgramGPU * s_genlist_end
Definition: ProgramGLSL.h:132
ProgramGPU * s_descriptor_fp
Definition: ProgramGLSL.h:137
ProgramGPU * s_orientation
Definition: ProgramGLSL.h:109
int _gaussian_step_num
Definition: ProgramGLSL.h:145
virtual void LoadDescriptorShader()
Definition: ProgramGLSL.h:150
vector< FilterProgram * > f_gaussian_skip0_v
Definition: ProgramGLSL.h:142
virtual void SetGradPassParam(int texP=0)
Definition: ProgramGLSL.h:162
ProgramGPU * s_genlist_init_ex
Definition: ProgramGLSL.h:128
void CreateGaussianFilters(SiftParam &param)
virtual void SetGenListInitParam(int w, int h)
Definition: ProgramGLSL.h:147
virtual void SetMarginCopyParam(int xmax, int ymax)
Definition: ProgramGLSL.h:149
ProgramGPU * s_display_dog
Definition: ProgramGLSL.h:113
virtual void LoadKeypointShader(float threshold, float edgeTrheshold)=0
FilterProgram * f_gaussian_skip0
Definition: ProgramGLSL.h:141
ProgramGPU * s_margin_copy
Definition: ProgramGLSL.h:139
virtual void SetDogTexParam(int texU, int texD)=0
virtual void SetFeatureOrientationParam(int gtex, int width, int height, float sigma, int stex, float step)
Definition: ProgramGLSL.h:152
ProgramGPU * s_gray
Definition: ProgramGLSL.h:102
ProgramGPU * s_debug
Definition: ProgramGLSL.h:106
virtual ~ShaderBag()
virtual void SetGenListEndParam(int ktex)
Definition: ProgramGLSL.h:148
virtual void UnloadProgram()=0
void LoadDynamicShaders(SiftParam &param)
ProgramGPU * s_genlist_start
Definition: ProgramGLSL.h:130
ProgramGPU * s_copy_key
Definition: ProgramGLSL.h:104
ProgramGPU * s_vertex_list
Definition: ProgramGLSL.h:135
ProgramGPU * s_zero_pass
Definition: ProgramGLSL.h:133
FilterProgram ** f_gaussian_step
Definition: ProgramGLSL.h:144
void SelectInitialSmoothingFilter(int octave_min, SiftParam &param)
ProgramGPU * s_sampling
Definition: ProgramGLSL.h:119
ProgramGPU * s_genlist_init_tight
Definition: ProgramGLSL.h:127
ProgramGPU * s_display_keys
Definition: ProgramGLSL.h:117
virtual void SetGenListStartParam(float width, int tex0)=0
virtual void LoadDisplayShaders()=0
virtual void SetFeatureDescirptorParam(int gtex, int otex, float dwidth, float fwidth, float width, float height, float sigma)
Definition: ProgramGLSL.h:151
ProgramGPU * s_grad_pass
Definition: ProgramGLSL.h:121