SparrowRenderer/gbuffer.cpp
2015-11-22 21:07:33 +01:00

57 lines
2.8 KiB
C++

#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]));
}