18 #ifndef PIC_UTIL_GL_FBO_HPP 19 #define PIC_UTIL_GL_FBO_HPP 23 #include "../../base.hpp" 114 glBindFramebuffer(GL_FRAMEBUFFER,
fbo);
122 glBindFramebuffer(GL_FRAMEBUFFER, 0);
148 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
149 std::cerr <<
"FBO Incomplete: Attachment" << std::endl;
152 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
153 std::cerr <<
"FBO Incomplete: Missing Attachment" << std::endl;
156 case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
157 std::cerr <<
"FBO Incomplete: Draw Buffer" << std::endl;
160 case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
161 std::cerr <<
"FBO Incomplete: Read Buffer" << std::endl;
165 std::cerr <<
"Undefined FBO error" << std::endl;
183 glDeleteTextures(1, &
tex);
188 glDeleteRenderbuffers(1, &
depth);
193 glDeleteFramebuffers(1, &
fbo);
222 glGenTextures(1, &this->tex);
225 glBindTexture(GL_TEXTURE_2D, this->tex);
226 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
227 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
228 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
229 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
230 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F,
width,
height, 0, GL_RGBA, GL_FLOAT,
232 glBindTexture(GL_TEXTURE_2D, 0);
235 glBindTexture(GL_TEXTURE_3D, this->tex);
236 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
237 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
238 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
239 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
240 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
243 glBindTexture(GL_TEXTURE_3D, 0);
253 glGenRenderbuffers(1, &
depth);
254 glBindRenderbuffer(GL_RENDERBUFFER,
depth);
255 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT,
width,
height);
256 glBindRenderbuffer(GL_RENDERBUFFER, 0);
261 glGenFramebuffers(1, &
fbo);
264 glBindFramebuffer(GL_FRAMEBUFFER,
fbo);
268 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
272 glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D,
278 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
284 GLenum fboStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
286 if (fboStatus != GL_FRAMEBUFFER_COMPLETE) {
288 glDeleteFramebuffers(1, &
fbo);
295 glBindFramebuffer(GL_FRAMEBUFFER, 0);
309 for (
unsigned int i = 0; i <
nMRT; i++) {
311 glGenTextures(1, &
texMRT[i]);
312 glBindTexture(GL_TEXTURE_2D,
texMRT[i]);
313 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
314 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
315 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
316 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
317 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F,
width,
height, 0, GL_RGBA, GL_FLOAT, 0);
318 glBindTexture(GL_TEXTURE_2D, 0);
322 glGenRenderbuffers(1, &
depth);
323 glBindRenderbuffer(GL_RENDERBUFFER,
depth);
324 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT,
width,
height);
325 glBindRenderbuffer(GL_RENDERBUFFER, 0);
330 glGenFramebuffers(1, &
fbo);
333 glBindFramebuffer(GL_FRAMEBUFFER,
fbo);
336 for (
unsigned int i = 0; i <
nMRT; i++) {
339 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D,
346 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
352 GLenum fboStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
354 if (fboStatus != GL_FRAMEBUFFER_COMPLETE) {
356 glDeleteFramebuffers(1, &
fbo);
363 glBindFramebuffer(GL_FRAMEBUFFER, 0);
369 glBindFramebuffer(GL_FRAMEBUFFER,
fbo);
371 GLuint texWork = (
tex == 0) ? this->tex :
tex;
374 case GL_TEXTURE_2D: {
375 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
380 case GL_TEXTURE_3D: {
381 glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D,
389 GLenum fboStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
391 if (fboStatus != GL_FRAMEBUFFER_COMPLETE) {
393 glDeleteFramebuffers(1, &
fbo);
399 glBindFramebuffer(GL_FRAMEBUFFER, 0);
404 GLuint texWork = (
tex == 0) ? this->tex :
tex;
407 case GL_TEXTURE_2D: {
408 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
413 case GL_TEXTURE_2D_ARRAY: {
414 glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
415 GL_TEXTURE_2D_ARRAY, texWork, 0, slice);
419 case GL_TEXTURE_3D: {
420 glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D,
433 glBindFramebuffer(GL_FRAMEBUFFER,
fbo);
434 glDrawBuffer(GL_COLOR_ATTACHMENT0);
435 glReadBuffer(GL_COLOR_ATTACHMENT0);
438 glBindRenderbuffer(GL_RENDERBUFFER,
depth);
448 glBindFramebuffer(GL_FRAMEBUFFER, 0);
449 glDrawBuffer(GL_BACK);
450 glReadBuffer(GL_BACK);
453 glBindRenderbuffer(GL_RENDERBUFFER, 0);
463 glBindFramebuffer(GL_FRAMEBUFFER,
fbo);
474 glBindFramebuffer(GL_FRAMEBUFFER, 0);
static void checkStatus(GLenum fboStatus)
checkStatus
Definition: fbo.hpp:145
GLuint fbo
Definition: fbo.hpp:35
The Fbo class.
Definition: fbo.hpp:32
void bindSimple()
bindSimple
Definition: fbo.hpp:112
int frames
Definition: fbo.hpp:38
GLuint depth
Definition: fbo.hpp:37
int height
Definition: fbo.hpp:38
GLuint * texMRT
Definition: fbo.hpp:42
bool createMRT(int width, int height, bool bDepth, unsigned int nMRT)
create
GLuint * attachmentsMRT
Definition: fbo.hpp:44
unsigned int nMRT
Definition: fbo.hpp:43
void unbindSimple()
unbindSimple
Definition: fbo.hpp:120
bool bDepth
Definition: fbo.hpp:39
int width
Definition: fbo.hpp:38
#define PIC_INLINE
Definition: base.hpp:33
bool create(int width, int height, bool bDepth)
create
Definition: bilateral_separation.hpp:25
GLuint tex
Definition: fbo.hpp:36
void attachColorBuffer2(GLuint tex, GLenum target, int slice)
attachColorBuffer2
void attachColorBuffer(GLuint tex, GLenum target, int slice=0)
attachColorBuffer