#include "gbuffer.h" #include "sparrowrenderer.h" #include "glassert.h" GBuffer::GBuffer(int width, int height) { glAssert(glGenFramebuffers(1, &fbo)); glAssert(glBindFramebuffer(GL_FRAMEBUFFER, fbo)); // - Normal buffer glAssert(glGenTextures(1, textures + NORMAL)); glAssert(glBindTexture(GL_TEXTURE_2D, textures[NORMAL])); glAssert(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, NULL)); glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); glAssert(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[NORMAL], 0)); // - Color + Specular exponent buffer glAssert(glGenTextures(1, textures + COLOR)); glAssert(glBindTexture(GL_TEXTURE_2D, textures[COLOR])); glAssert(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); glAssert(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textures[COLOR], 0)); // - Specular color + objectId buffer glAssert(glGenTextures(1, textures + SPECULAR)); glAssert(glBindTexture(GL_TEXTURE_2D, textures[SPECULAR])); glAssert(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); glAssert(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, textures[SPECULAR], 0)); // - depth buffer glAssert(glGenTextures(1, textures + DEPTH)); glAssert(glBindTexture(GL_TEXTURE_2D, textures[DEPTH])); glAssert(glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL)); glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); glAssert(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); glAssert(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textures[DEPTH], 0)); // - Tell OpenGL which color attachments we'll use (of this framebuffer) for rendering GLuint attachments[4] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_DEPTH_ATTACHMENT}; glAssert(glDrawBuffers(4, attachments)); } void GBuffer::bind() { glAssert(glBindFramebuffer(GL_FRAMEBUFFER, fbo)); } void GBuffer::bindTexture(TextureType type, int slot) { glAssert(glActiveTexture(GL_TEXTURE0 + slot)); glAssert(glBindTexture(GL_TEXTURE_2D, textures[type])); }