You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.3 KiB
C++
94 lines
2.3 KiB
C++
|
3 years ago
|
/******************************************************************************
|
||
|
|
* File - frame_buffer.h
|
||
|
|
* Author - Joey Pollack
|
||
|
|
* Date - 2022/07/13 (y/m/d)
|
||
|
|
* Mod Date - 2022/07/13 (y/m/d)
|
||
|
|
* Description - OpenGL Frame buffer object
|
||
|
|
******************************************************************************/
|
||
|
|
|
||
|
|
#include "frame_buffer.h"
|
||
|
|
#include "texture.h"
|
||
|
|
#include <utils/logger.h>
|
||
|
|
#include <glad/gl.h>
|
||
|
|
|
||
|
|
namespace lunarium
|
||
|
|
{
|
||
|
|
FrameBuffer::FrameBuffer()
|
||
|
|
: mGLID(0), mTexture(nullptr), mRenderBufferID(0)
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
FrameBuffer* FrameBuffer::Create(int width, int height)
|
||
|
|
{
|
||
|
|
FrameBuffer* fb = new FrameBuffer;
|
||
|
|
fb->Resize(width, height);
|
||
|
|
return fb;
|
||
|
|
}
|
||
|
|
|
||
|
|
void FrameBuffer::Destroy(FrameBuffer** ppBuf)
|
||
|
|
{
|
||
|
|
(*ppBuf)->Unbind();
|
||
|
|
glDeleteFramebuffers(1, &(*ppBuf)->mGLID);
|
||
|
|
(*ppBuf) = nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
void FrameBuffer::Resize(int width, int height)
|
||
|
|
{
|
||
|
|
if (mGLID != 0)
|
||
|
|
{
|
||
|
|
glDeleteFramebuffers(1, &mGLID);
|
||
|
|
}
|
||
|
|
|
||
|
|
glGenFramebuffers(1, &mGLID);
|
||
|
|
Bind();
|
||
|
|
|
||
|
|
if (mTexture)
|
||
|
|
{
|
||
|
|
Texture::Destroy(&mTexture);
|
||
|
|
}
|
||
|
|
|
||
|
|
mTexture = Texture::Create(nullptr, width, height);
|
||
|
|
|
||
|
|
// Attach texture
|
||
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture->GetGLID(), 0);
|
||
|
|
|
||
|
|
// Render Buffer for depth/stencil testing
|
||
|
|
if (mRenderBufferID)
|
||
|
|
{
|
||
|
|
glDeleteRenderbuffers(1, &mRenderBufferID);
|
||
|
|
}
|
||
|
|
glGenRenderbuffers(1, &mRenderBufferID);
|
||
|
|
glBindRenderbuffer(GL_RENDERBUFFER, mRenderBufferID);
|
||
|
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
|
||
|
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||
|
|
|
||
|
|
// Atach the render buffer
|
||
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mRenderBufferID);
|
||
|
|
|
||
|
|
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||
|
|
{
|
||
|
|
Logger::Error(LogCategory::GRAPHICS, "Failed to create FrameBuffer object");
|
||
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||
|
|
}
|
||
|
|
|
||
|
|
Unbind();
|
||
|
|
}
|
||
|
|
|
||
|
|
void FrameBuffer::Bind()
|
||
|
|
{
|
||
|
|
glBindFramebuffer(GL_FRAMEBUFFER, mGLID);
|
||
|
|
}
|
||
|
|
|
||
|
|
void FrameBuffer::Unbind()
|
||
|
|
{
|
||
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||
|
|
}
|
||
|
|
|
||
|
|
Texture* FrameBuffer::GetTexture()
|
||
|
|
{
|
||
|
|
return mTexture;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|