57 lines
2.8 KiB
C++
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]));
|
|
}
|