Fixed issue where framebuffers had renderbuffers and textures for the same attachments

dev
Shariq Shah 6 years ago
parent 475fdf564f
commit 1447a9403f
  1. 2
      src/common/version.h
  2. 4
      src/game/camera.c
  3. 39
      src/game/framebuffer.c

@ -4,7 +4,7 @@
/* Auto generated version file. DO NOT MODIFY */ /* Auto generated version file. DO NOT MODIFY */
#define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MAJOR 0
#define SYMMETRY_VERSION_MINOR 1 #define SYMMETRY_VERSION_MINOR 1
#define SYMMETRY_VERSION_REVISION 301 #define SYMMETRY_VERSION_REVISION 302
#define SYMMETRY_VERSION_BRANCH "dev" #define SYMMETRY_VERSION_BRANCH "dev"
#endif #endif

@ -118,7 +118,7 @@ void camera_attach_fbo(struct Camera* camera,
log_error("camera:attach_fbo", "Camera already has fbo attached!"); log_error("camera:attach_fbo", "Camera already has fbo attached!");
return; return;
} }
camera->fbo = framebuffer_create(width, height, has_depth, 0, resizeable); camera->fbo = framebuffer_create(width, height, 0, 1, resizeable);
if(camera->fbo > -1) if(camera->fbo > -1)
{ {
if(has_color) if(has_color)
@ -144,7 +144,7 @@ void camera_attach_fbo(struct Camera* camera,
width, height, width, height,
GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT,
GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT,
GL_UNSIGNED_BYTE, GL_FLOAT,
NULL); NULL);
texture_set_param(camera->depth_tex, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); texture_set_param(camera->depth_tex, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
texture_set_param(camera->depth_tex, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); texture_set_param(camera->depth_tex, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

@ -42,8 +42,8 @@ int framebuffer_create(int width, int height, bool has_depth, bool has_color, bo
{ {
int index = -1; int index = -1;
GLuint fbo = 0; GLuint fbo = 0;
GLuint depth_renderbuffer = 0; GLuint depth_renderbuffer = -1;
GLuint color_renderbuffer = 0; GLuint color_renderbuffer = -1;
glGenFramebuffers(1, &fbo); glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo);
@ -133,11 +133,11 @@ void framebuffer_remove(int index)
fbo->texture_attachments[i] = -1; fbo->texture_attachments[i] = -1;
} }
} }
if(fbo->depth_renderbuffer != 0) glDeleteRenderbuffers(1, &fbo->depth_renderbuffer); if(fbo->depth_renderbuffer > -1) glDeleteRenderbuffers(1, &fbo->depth_renderbuffer);
if(fbo->color_renderbuffer != 0) glDeleteRenderbuffers(1, &fbo->color_renderbuffer); if(fbo->color_renderbuffer > -1) glDeleteRenderbuffers(1, &fbo->color_renderbuffer);
glDeleteFramebuffers(1, &fbo->handle); glDeleteFramebuffers(1, &fbo->handle);
fbo->color_renderbuffer = 0; fbo->color_renderbuffer = -1;
fbo->depth_renderbuffer = 0; fbo->depth_renderbuffer = -1;
fbo->handle = 0; fbo->handle = 0;
fbo->width = -1; fbo->width = -1;
fbo->height = -1; fbo->height = -1;
@ -184,14 +184,35 @@ void framebuffer_texture_set(int index, int texture, enum Framebuffer_Attachment
GLint current_fbo = 0; GLint current_fbo = 0;
GL_CHECK(glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &current_fbo)); GL_CHECK(glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &current_fbo));
framebuffer_bind(index); framebuffer_bind(index);
{
GL_CHECK(glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_CHECK(glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
gl_attachment, gl_attachment,
GL_TEXTURE_2D, GL_TEXTURE_2D,
texture_get_texture_handle(texture), texture_get_texture_handle(texture),
0)); 0));
fbo->texture_attachments[attachment] = texture; fbo->texture_attachments[attachment] = texture;
if(attachment == FA_COLOR_ATTACHMENT0) glDrawBuffer(GL_COLOR_ATTACHMENT0); if(attachment == FA_COLOR_ATTACHMENT0)
{
glDrawBuffer(GL_COLOR_ATTACHMENT0);
if(fbo->color_renderbuffer > -1)
{
glDeleteRenderbuffers(1, &fbo->color_renderbuffer);
fbo->color_renderbuffer = -1;
}
}
else if(attachment == FA_DEPTH_ATTACHMENT && fbo->depth_renderbuffer != -1)
{
glDeleteRenderbuffers(1, &fbo->depth_renderbuffer);
fbo->depth_renderbuffer = -1;
}
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
log_error("framebuffer:texture_set", "Framebuffer not complete!");
}
glBindFramebuffer(GL_FRAMEBUFFER, current_fbo); glBindFramebuffer(GL_FRAMEBUFFER, current_fbo);
} }
@ -220,7 +241,7 @@ void framebuffer_resize(int index, int width, int height)
struct FBO* fbo = &fbo_list[index]; struct FBO* fbo = &fbo_list[index];
if(!fbo->resizeable) return; if(!fbo->resizeable) return;
framebuffer_bind(index); framebuffer_bind(index);
if(fbo->depth_renderbuffer != 0) if(fbo->depth_renderbuffer > -1)
{ {
glBindRenderbuffer(GL_RENDERBUFFER, fbo->depth_renderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, fbo->depth_renderbuffer);
GL_CHECK(glRenderbufferStorage(GL_RENDERBUFFER, GL_CHECK(glRenderbufferStorage(GL_RENDERBUFFER,
@ -234,7 +255,7 @@ void framebuffer_resize(int index, int width, int height)
glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindRenderbuffer(GL_RENDERBUFFER, 0);
} }
if(fbo->color_renderbuffer != 0) if(fbo->color_renderbuffer > -1)
{ {
glBindRenderbuffer(GL_RENDERBUFFER, fbo->color_renderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, fbo->color_renderbuffer);
GL_CHECK(glRenderbufferStorage(GL_RENDERBUFFER, GL_CHECK(glRenderbufferStorage(GL_RENDERBUFFER,

Loading…
Cancel
Save