118 lines
3.2 KiB
C++
118 lines
3.2 KiB
C++
#include "fboManager.h"
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
FboManager::FboManager() {
|
|
useRenderDepthBuffer = false;
|
|
attachmentCount = 0;
|
|
/*for(int i=0;i<5;i++) {
|
|
mrt[i] = GL_COLOR_ATTACHMENT0+i;
|
|
}*/
|
|
}
|
|
|
|
FboManager::~FboManager() {
|
|
glDeleteFramebuffers(1, &_fboId);
|
|
if(useRenderDepthBuffer) {
|
|
glDeleteRenderbuffers(1, &_renderDepthBufferId);
|
|
}
|
|
}
|
|
|
|
|
|
//create FBO
|
|
void FboManager::initFbo() {
|
|
glGenFramebuffers(1, &_fboId);
|
|
}
|
|
|
|
//generate and bind depth buffer
|
|
void FboManager::genRenderDepthBuffer(unsigned w, unsigned h) {
|
|
glGenRenderbuffers(1,&_renderDepthBufferId);
|
|
glBindRenderbuffer(GL_RENDERBUFFER, _renderDepthBufferId);
|
|
glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT,w,h);
|
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
|
}
|
|
|
|
//bind depth buffer
|
|
void FboManager::bindRenderDepthBuffer() {
|
|
glBindFramebuffer(GL_FRAMEBUFFER,_fboId);
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,_renderDepthBufferId);
|
|
//glBindFramebuffer(GL_FRAMEBUFFER,0);
|
|
}
|
|
|
|
void FboManager::setDrawBuffers() {
|
|
glDrawBuffers(attachmentCount, mrt);
|
|
}
|
|
|
|
void FboManager::bindToFbo(GLenum type, GLenum texture, GLuint textureId) {
|
|
glBindFramebuffer(GL_FRAMEBUFFER,_fboId);
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER,type,texture,textureId,0);
|
|
if(type != GL_DEPTH_ATTACHMENT) {
|
|
mrt[attachmentCount] = type;
|
|
attachmentCount += 1;
|
|
glDrawBuffer(GL_NONE);
|
|
glReadBuffer(GL_NONE);
|
|
}
|
|
//glBindFramebuffer(GL_FRAMEBUFFER,0);
|
|
}
|
|
|
|
void FboManager::bind3DTextureToFbo(GLenum type, GLuint textureId) {
|
|
glBindFramebuffer(GL_FRAMEBUFFER, _fboId);
|
|
glFramebufferTexture(GL_FRAMEBUFFER, type, textureId, 0);
|
|
//glFramebufferTexture3D(GL_FRAMEBUFFER, type, GL_TEXTURE_3D, textureId, 0, 0);
|
|
if (type != GL_DEPTH_ATTACHMENT) {
|
|
mrt[attachmentCount] = type;
|
|
attachmentCount += 1;
|
|
glDrawBuffer(GL_NONE);
|
|
glReadBuffer(GL_NONE);
|
|
}
|
|
}
|
|
|
|
GLuint FboManager::getFboId() {
|
|
return _fboId;
|
|
}
|
|
|
|
bool FboManager::checkFboStatus() {
|
|
// check FBO status
|
|
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
|
switch(status)
|
|
{
|
|
case GL_FRAMEBUFFER_COMPLETE_EXT:
|
|
std::cout << "Framebuffer complete." << std::endl;
|
|
return true;
|
|
|
|
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
|
|
std::cout << "[ERROR] Framebuffer incomplete: Attachment is NOT complete." << std::endl;
|
|
return false;
|
|
|
|
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
|
|
std::cout << "[ERROR] Framebuffer incomplete: No image is attached to FBO." << std::endl;
|
|
return false;
|
|
|
|
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
|
|
std::cout << "[ERROR] Framebuffer incomplete: Attached images have different dimensions." << std::endl;
|
|
return false;
|
|
|
|
case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
|
|
std::cout << "[ERROR] Framebuffer incomplete: Color attached images have different internal formats." << std::endl;
|
|
return false;
|
|
|
|
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
|
|
std::cout << "[ERROR] Framebuffer incomplete: Draw buffer." << std::endl;
|
|
return false;
|
|
|
|
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
|
|
std::cout << "[ERROR] Framebuffer incomplete: Read buffer." << std::endl;
|
|
return false;
|
|
|
|
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
|
|
std::cout << "[ERROR] Unsupported by FBO implementation." << std::endl;
|
|
return false;
|
|
|
|
default:
|
|
std::cout << "[ERROR] Unknow error." << std::endl;
|
|
return false;
|
|
}
|
|
} |