Added FrameBuffer wrapper class
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
//TODO: Temp resourceManager
|
//TODO: Temp resourceManager
|
||||||
#include "../Core/ResourceManager.h"
|
#include "../Core/ResourceManager.h"
|
||||||
#include "Util/UnorderedMapVec2.h"
|
#include "Util/UnorderedMapVec2.h"
|
||||||
|
#include "Util/FrameBuffer.h"
|
||||||
|
|
||||||
class Renderer : public IRenderer
|
class Renderer : public IRenderer
|
||||||
{
|
{
|
||||||
@@ -22,7 +23,7 @@ private:
|
|||||||
Texture* m_ErrorTexture;
|
Texture* m_ErrorTexture;
|
||||||
Texture* m_WhiteTexture;
|
Texture* m_WhiteTexture;
|
||||||
float m_CameraMoveSpeed;
|
float m_CameraMoveSpeed;
|
||||||
GLuint m_PickingBuffer;
|
FrameBuffer m_PickingBuffer;
|
||||||
GLuint m_PickingTexture;
|
GLuint m_PickingTexture;
|
||||||
GLuint m_DepthBuffer;
|
GLuint m_DepthBuffer;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
#ifndef FrameBuffer_h__
|
||||||
|
#define FrameBuffer_h__
|
||||||
|
|
||||||
|
#include "OpenGL.h"
|
||||||
|
#include "GLError.h"
|
||||||
|
|
||||||
|
class BufferResource
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment);
|
||||||
|
|
||||||
|
GLuint* m_ResourceHandle;
|
||||||
|
GLenum m_ResourceType;
|
||||||
|
GLenum m_Attachment;
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <GLenum RESOURCETYPE>
|
||||||
|
class ResourceType : public BufferResource
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ResourceType(GLuint* resourceHandle, GLenum attachment)
|
||||||
|
: BufferResource(resourceHandle, RESOURCETYPE, attachment) { }
|
||||||
|
};
|
||||||
|
|
||||||
|
class Texture2D : public ResourceType<GL_TEXTURE_2D>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Texture2D(GLuint* resourceHandle, GLenum attachment)
|
||||||
|
: ResourceType(resourceHandle, attachment) { };
|
||||||
|
|
||||||
|
~Texture2D();
|
||||||
|
};
|
||||||
|
|
||||||
|
class RenderBuffer : public ResourceType<GL_RENDERBUFFER>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RenderBuffer(GLuint* resourceHandle, GLenum attachment)
|
||||||
|
: ResourceType(resourceHandle, attachment)
|
||||||
|
{ };
|
||||||
|
|
||||||
|
~RenderBuffer();
|
||||||
|
};
|
||||||
|
|
||||||
|
class FrameBuffer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FrameBuffer()
|
||||||
|
: m_BufferHandle(0) { }
|
||||||
|
~FrameBuffer();
|
||||||
|
|
||||||
|
void AddResource(std::shared_ptr<BufferResource> resource);
|
||||||
|
void Generate();
|
||||||
|
void Bind();
|
||||||
|
void Unbind();
|
||||||
|
GLuint GetHandle();
|
||||||
|
|
||||||
|
private:
|
||||||
|
GLuint m_BufferHandle;
|
||||||
|
std::vector<std::shared_ptr<BufferResource>> m_Resources;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -286,7 +286,7 @@ void Renderer::DrawScene(RenderQueueCollection& rq)
|
|||||||
|
|
||||||
void Renderer::PickingPass()
|
void Renderer::PickingPass()
|
||||||
{
|
{
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_PickingBuffer);
|
m_PickingBuffer.Bind();
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
@@ -356,7 +356,7 @@ void Renderer::DrawScreenQuad(GLuint textureToDraw)
|
|||||||
// Will return a vec3 where RG is the PickColor and B is the Depth
|
// Will return a vec3 where RG is the PickColor and B is the Depth
|
||||||
glm::vec3 Renderer::GetClickedPixelData(float x, float y)
|
glm::vec3 Renderer::GetClickedPixelData(float x, float y)
|
||||||
{
|
{
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_PickingBuffer);
|
m_PickingBuffer.Bind();
|
||||||
glm::vec2 pixelData;
|
glm::vec2 pixelData;
|
||||||
glReadPixels(x, y, 1, 1, GL_RG, GL_FLOAT, &pixelData);
|
glReadPixels(x, y, 1, 1, GL_RG, GL_FLOAT, &pixelData);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
@@ -390,18 +390,7 @@ void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better lo
|
|||||||
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height);
|
||||||
|
|
||||||
|
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT)));
|
||||||
glGenFramebuffers(1, &m_PickingBuffer);
|
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0)));
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_PickingBuffer);
|
m_PickingBuffer.Generate();
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_DepthBuffer);
|
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_PickingTexture, 0);
|
|
||||||
GLenum PickingBufferTextures[] = { GL_COLOR_ATTACHMENT0 };
|
|
||||||
glDrawBuffers(1, PickingBufferTextures);
|
|
||||||
|
|
||||||
if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
|
||||||
LOG_ERROR("m_FbDeferred2 incomplete: 0x%x\n", fbStatus);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
#include "Rendering/Util/FrameBuffer.h"
|
||||||
|
|
||||||
|
|
||||||
|
BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment)
|
||||||
|
{
|
||||||
|
m_ResourceHandle = resourceHandle;
|
||||||
|
m_ResourceType = resourceType;
|
||||||
|
m_Attachment = attachment;
|
||||||
|
}
|
||||||
|
|
||||||
|
Texture2D::~Texture2D()
|
||||||
|
{
|
||||||
|
if (m_ResourceHandle != 0) {
|
||||||
|
glDeleteTextures(1, m_ResourceHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RenderBuffer::~RenderBuffer()
|
||||||
|
{
|
||||||
|
if (m_ResourceHandle != 0) {
|
||||||
|
glDeleteRenderbuffers(1, m_ResourceHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FrameBuffer::~FrameBuffer()
|
||||||
|
{
|
||||||
|
if (m_BufferHandle != 0) {
|
||||||
|
glDeleteFramebuffers(1, &m_BufferHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameBuffer::AddResource(std::shared_ptr<BufferResource> resource)
|
||||||
|
{
|
||||||
|
m_Resources.push_back(resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameBuffer::Generate()
|
||||||
|
{
|
||||||
|
std::vector<GLenum> attachments;
|
||||||
|
|
||||||
|
glGenFramebuffers(1, &m_BufferHandle);
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle);
|
||||||
|
|
||||||
|
for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) {
|
||||||
|
switch ((*it)->m_ResourceType) {
|
||||||
|
case GL_TEXTURE_2D:
|
||||||
|
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0);
|
||||||
|
break;
|
||||||
|
case GL_RENDERBUFFER:
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLERROR("FrameBuffer generate");
|
||||||
|
|
||||||
|
if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT) {
|
||||||
|
attachments.push_back((*it)->m_Attachment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GLenum* bufferTextures = &attachments[0];
|
||||||
|
glDrawBuffers(1, bufferTextures);
|
||||||
|
|
||||||
|
if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
||||||
|
LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameBuffer::Bind()
|
||||||
|
{
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameBuffer::Unbind()
|
||||||
|
{
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint FrameBuffer::GetHandle()
|
||||||
|
{
|
||||||
|
return m_BufferHandle;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user