#include "FrameBuffer.h" FrameBuffer::FrameBuffer() = default; FrameBuffer::FrameBuffer(int width, int height) { glGenFramebuffers(1, &m_FBO); glBindFramebuffer(GL_FRAMEBUFFER, m_FBO); glGenTextures(1, &m_Texture); glBindTexture(GL_TEXTURE_2D, m_Texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Texture, 0); glGenRenderbuffers(1, &m_RBO); glBindRenderbuffer(GL_RENDERBUFFER, m_RBO); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_RBO); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << std::endl; glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); glBindRenderbuffer(GL_RENDERBUFFER, 0); } FrameBuffer::~FrameBuffer() { glDeleteFramebuffers(1, &m_FBO); glDeleteTextures(1, &m_Texture); glDeleteRenderbuffers(1, &m_RBO); } unsigned int FrameBuffer::GetFrameTexture() const { return m_Texture; } FrameBuffer FrameBuffer::Create(int width, int height) { return FrameBuffer{width, height}; } void FrameBuffer::Shutdown() const { glDeleteBuffers(1, &m_FBO); glDeleteBuffers(1, &m_RBO); glDeleteTextures(1, &m_Texture); } void FrameBuffer::RescaleFrameBuffer(int width, int height) const { glBindTexture(GL_TEXTURE_2D, m_Texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Texture, 0); glBindRenderbuffer(GL_RENDERBUFFER, m_RBO); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_RBO); } void FrameBuffer::Bind() const { glBindFramebuffer(GL_FRAMEBUFFER, m_FBO); } void FrameBuffer::Unbind() { glBindFramebuffer(GL_FRAMEBUFFER, 0); }