76 lines
2.3 KiB
C++
76 lines
2.3 KiB
C++
|
#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);
|
||
|
}
|