Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
PerPixelProcessingBase.cpp
1 /*
2  * PerPixelProcessingBase.cpp
3  *
4  * Created on: Feb 4, 2010
5  * Author: africk
6  */
7 
8 #include <OpenGLFramework/SpecializedBatches/PerPixelProcessingBase.hh>
9 
10 using namespace std;
11 using namespace BIAS;
12 
13 PerPixelProcessingBase::PerPixelProcessingBase() {
14  renderTargetP_ = NULL;
15  zBufferP_ = NULL;
16  textureP_ = NULL;
17  shaderProgramP_ = NULL;
18  fragmentShaderP_ = NULL;
19  renderTargetCreated_ = false;
20 }
21 
22 PerPixelProcessingBase::~PerPixelProcessingBase() {
23  if (renderTargetP_ != NULL && renderTargetCreated_) {
24  delete renderTargetP_;
25  }
26 
27  if (textureP_ != NULL) {
28  delete textureP_;
29  }
30 
31  if (zBufferP_ != NULL) {
32  delete zBufferP_;
33  }
34 
35  if (shaderProgramP_ != NULL) {
36  delete shaderProgramP_;
37  }
38 
39  if (fragmentShaderP_ != NULL) {
40  delete fragmentShaderP_;
41  }
42 }
43 
44 void PerPixelProcessingBase::SetDefaultRenderTarget(unsigned int width,
45  unsigned height, GLenum internalFormat) {
46 
47  BIASASSERT(width > 0 && height > 0);
48  try {
49  if (zBufferP_ != NULL) {
50  delete zBufferP_;
51  }
52 
53  zBufferP_ = new glfTexture2D();
54 
55  if (textureP_ != NULL) {
56  delete textureP_;
57  }
58 
59  textureP_ = new glfTexture2D();
60 
61  if (renderTargetP_ != NULL && renderTargetCreated_) {
62  delete renderTargetP_;
63  }
64 
65  renderTargetP_ = new glfFramebufferObject();
66 
67  zBufferP_->Create();
68  zBufferP_->SetMagFilter(GL_NEAREST);
69  zBufferP_->SetMinFilter(GL_NEAREST);
70  zBufferP_->SetWrapS(GL_CLAMP);
71  zBufferP_->SetWrapT(GL_CLAMP);
72  zBufferP_->Allocate(width, height, GL_DEPTH_COMPONENT);
73 
74  textureP_->Create();
75  textureP_->SetMagFilter(GL_NEAREST);
76  textureP_->SetMinFilter(GL_NEAREST);
77  textureP_->SetWrapS(GL_CLAMP);
78  textureP_->SetWrapT(GL_CLAMP);
79  textureP_->Allocate(width, height, internalFormat);
80 
81  renderTargetP_->Create();
82  renderTargetP_->AttachTexture(*textureP_, GL_COLOR_ATTACHMENT0_EXT);
83  renderTargetP_->AttachTexture(*zBufferP_, GL_DEPTH_ATTACHMENT_EXT);
84  renderTargetP_->CheckComplete();
85 
86  renderTargetCreated_ = true;
87 
88  batch_.SetRenderTarget(renderTargetP_);
89  } catch (glfException& e) {
90  std::cout << "Error: " << e.GetMessageString() << std::endl;
91  BIASABORT;
92  }
93 
94 }
95 
96 void PerPixelProcessingBase::SetDefaultFloatRenderTarget(unsigned int width,
97  unsigned height) {
98  SetDefaultRenderTarget(width, height, GL_LUMINANCE32F_ARB);
99 }
100 
101 void PerPixelProcessingBase::SetDefaultRGBRenderTarget(unsigned int width,
102  unsigned height) {
103  SetDefaultRenderTarget(width, height, GL_RGB);
104 }
105 
106 glfShaderProgram* PerPixelProcessingBase::CreateFragmentShaderProgram(
107  const std::string& fragmentShaderCode) {
108  try {
109  if (fragmentShaderP_ != NULL) {
110  delete fragmentShaderP_;
111  }
112 
113  if (shaderProgramP_ != NULL) {
114  delete shaderProgramP_;
115  }
116 
117  shaderProgramP_ = new glfShaderProgram();
118  fragmentShaderP_ = new glfShader();
119 
120  shaderProgramP_->Create();
121  fragmentShaderP_->Create(GL_FRAGMENT_SHADER, fragmentShaderCode);
122  shaderProgramP_->AttachShader(*fragmentShaderP_);
123  shaderProgramP_->Link();
124  batch_.SetShaderProgram(shaderProgramP_);
125  } catch (glfException& e) {
126  std::cout << "Error: " << e.GetMessageString() << std::endl;
127  BIASABORT;
128  }
129 
130  return shaderProgramP_;
131 }
132 
133 glfShaderProgram* PerPixelProcessingBase::CreateFragmentShaderProgramFromFile(
134  const std::string& fragmentShaderPath) {
135  try {
136  if (fragmentShaderP_ != NULL) {
137  delete fragmentShaderP_;
138  }
139 
140  if (shaderProgramP_ != NULL) {
141  delete shaderProgramP_;
142  }
143 
144  shaderProgramP_ = new glfShaderProgram();
145  fragmentShaderP_ = new glfShader();
146 
147  shaderProgramP_->Create();
148  fragmentShaderP_->CreateFromFile(GL_FRAGMENT_SHADER, fragmentShaderPath);
149  shaderProgramP_->AttachShader(*fragmentShaderP_);
150  shaderProgramP_->Link();
151  batch_.SetShaderProgram(shaderProgramP_);
152  } catch (glfException& e) {
153  std::cout << "Error: " << e.GetMessageString() << std::endl;
154  BIASABORT;
155  }
156 
157  return shaderProgramP_;
158 }
159 
160 //###################################
A 2D texture.
Definition: glfTexture2D.hh:40
Exception class used for run-time errors in the OpenGLFramework.
Definition: glfException.hh:79
const std::string & GetMessageString() const
Returns the description of the error including the file name and line number where the error occured...
A shader program composed of several shaders.
A GLSL vertex shader or fragment shader, which must be linked in a shader program.
Definition: glfShader.hh:39