Skip to content

Instantly share code, notes, and snippets.

@jherico
Created April 28, 2015 02:21
Show Gist options
  • Save jherico/d89235f1e44105e33aad to your computer and use it in GitHub Desktop.
Save jherico/d89235f1e44105e33aad to your computer and use it in GitHub Desktop.
struct FramebufferWraper {
glm::uvec2 size;
GLuint fbo{ 0 };
GLuint color{ 0 };
GLuint depth{ 0 };
virtual ~FramebufferWraper() {
release();
}
void allocate() {
release();
glGenRenderbuffers(1, &depth);
assert(depth);
glGenTextures(1, &color);
assert(color);
glGenFramebuffers(1, &fbo);
assert(fbo);
}
void release() {
if (fbo) {
glDeleteFramebuffers(1, &fbo);
fbo = 0;
}
if (color) {
glDeleteTextures(1, &color);
color = 0;
}
if (depth) {
glDeleteRenderbuffers(1, &depth);
depth = 0;
}
}
static bool checkStatus(GLenum target = GL_FRAMEBUFFER) {
GLuint status = glCheckFramebufferStatus(target);
switch (status) {
case GL_FRAMEBUFFER_COMPLETE:
return true;
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
std::cerr << "framebuffer incomplete attachment" << std::endl;
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
std::cerr << "framebuffer missing attachment" << std::endl;
break;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
std::cerr << "framebuffer incomplete draw buffer" << std::endl;
break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
std::cerr << "framebuffer incomplete read buffer" << std::endl;
break;
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
std::cerr << "framebuffer incomplete multisample" << std::endl;
break;
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
std::cerr << "framebuffer incomplete layer targets" << std::endl;
break;
case GL_FRAMEBUFFER_UNSUPPORTED:
std::cerr << "framebuffer unsupported internal format or image" << std::endl;
break;
default:
std::cerr << "other framebuffer error" << std::endl;
break;
}
return false;
}
void init(const glm::ivec2 & size) {
this->size = size;
allocate();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glBindTexture(GL_TEXTURE_2D, color);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, size.x, size.y);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
glBindRenderbuffer(GL_RENDERBUFFER, depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, size.x, size.y);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
if (!checkStatus()) {
FAIL("Could not create a valid framebuffer");
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void activate() {
assert(fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, size.x, size.y);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment