Program Listing for File GBuffer.cpp

Return to documentation for file (Src/GraphicsEngineOpenGL/renderer/deferred/GBuffer.cpp)

#include "renderer/deferred/GBuffer.hpp"

#include "hostDevice/bindings.hpp"

#include <stdio.h>

GBuffer::GBuffer()
{
    this->window_width = 1024;
    this->window_height = 768;
}

GBuffer::GBuffer(GLint window_width, GLint window_height)
{
    this->window_width = window_width;
    this->window_height = window_height;
}

void GBuffer::create()
{
    glGenFramebuffers(1, &g_buffer);
    glBindFramebuffer(GL_FRAMEBUFFER, g_buffer);

    glGenTextures(1, &g_position);
    glBindTexture(GL_TEXTURE_2D, g_position);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, window_width, window_height, 0, GL_RGBA, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glFramebufferTexture2D(GL_FRAMEBUFFER, g_buffer_attachment[0], GL_TEXTURE_2D, g_position, 0);

    glGenTextures(1, &g_normal);
    glBindTexture(GL_TEXTURE_2D, g_normal);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, window_width, window_height, 0, GL_RGBA, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glFramebufferTexture2D(GL_FRAMEBUFFER, g_buffer_attachment[1], GL_TEXTURE_2D, g_normal, 0);

    glGenTextures(1, &g_albedo);
    glBindTexture(GL_TEXTURE_2D, g_albedo);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, window_width, window_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glFramebufferTexture2D(GL_FRAMEBUFFER, g_buffer_attachment[2], GL_TEXTURE_2D, g_albedo, 0);

    glGenTextures(1, &g_material_id);
    glBindTexture(GL_TEXTURE_2D, g_material_id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, window_width, window_height, 0, GL_RGBA, GL_UNSIGNED_INT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glFramebufferTexture2D(GL_FRAMEBUFFER, g_buffer_attachment[3], GL_TEXTURE_2D, g_material_id, 0);

    glDrawBuffers(G_BUFFER_SIZE, g_buffer_attachment);

    // create and attach depth buffer (renderbuffer)
    // renderbuffers are a bit more performant
    glGenRenderbuffers(1, &g_depth);
    glBindRenderbuffer(GL_RENDERBUFFER, g_depth);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, window_width, window_height);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, g_depth);

    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { printf("Framebuffer not complete!"); }

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

void GBuffer::read(std::shared_ptr<ShaderProgram> shader_program)
{
    // GBUFFER
    GLuint texture_index = GBUFFER_TEXTURES_SLOT;
    shader_program->setUniformInt(texture_index, "g_position");
    glActiveTexture(GL_TEXTURE0 + texture_index);
    glBindTexture(GL_TEXTURE_2D, g_position);

    texture_index++;
    shader_program->setUniformInt(texture_index, "g_normal");
    glActiveTexture(GL_TEXTURE0 + texture_index);
    glBindTexture(GL_TEXTURE_2D, g_normal);

    texture_index++;
    shader_program->setUniformInt(texture_index, "g_albedo");
    glActiveTexture(GL_TEXTURE0 + texture_index);
    glBindTexture(GL_TEXTURE_2D, g_albedo);

    texture_index++;
    shader_program->setUniformInt(texture_index, "g_material_id");
    glActiveTexture(GL_TEXTURE0 + texture_index);
    glBindTexture(GL_TEXTURE_2D, g_material_id);
}

void GBuffer::update_window_params(GLuint window_width, GLuint window_height)
{
    this->window_width = window_width;
    this->window_height = window_height;
}

GBuffer::~GBuffer()
{
    glDeleteFramebuffers(1, &g_buffer);
    glDeleteTextures(1, &g_position);
    glDeleteTextures(1, &g_normal);
    glDeleteTextures(1, &g_albedo);
    glDeleteTextures(1, &g_material_id);
}