Enabled MSAA

This commit is contained in:
parax0
2016-08-30 19:05:28 -06:00
parent 4fd3e9c437
commit 1de2691f33
8 changed files with 146 additions and 88 deletions

View File

@@ -2,20 +2,22 @@
#include <Common/Log.h>
CFramebuffer::CFramebuffer()
: mInitialized(false)
: mpRenderbuffer(nullptr)
, mpTexture(nullptr)
, mWidth(0)
, mHeight(0)
, mpRenderbuffer(nullptr)
, mpTexture(nullptr)
, mEnableMultisampling(false)
, mInitialized(false)
{
}
CFramebuffer::CFramebuffer(u32 Width, u32 Height)
: mInitialized(false)
: mpRenderbuffer(nullptr)
, mpTexture(nullptr)
, mWidth(0)
, mHeight(0)
, mpRenderbuffer(nullptr)
, mpTexture(nullptr)
, mEnableMultisampling(false)
, mInitialized(false)
{
Resize(Width, Height);
}
@@ -44,30 +46,18 @@ void CFramebuffer::Init()
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
mpRenderbuffer = new CRenderbuffer(mWidth, mHeight);
mpRenderbuffer->Bind();
glFramebufferRenderbuffer(
GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mpRenderbuffer->BufferID()
);
mpTexture = new CTexture(mWidth, mHeight);
mpTexture->Bind(0);
glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mpTexture->TextureID(), 0
);
mStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (mStatus != GL_FRAMEBUFFER_COMPLETE)
Log::Error("Framebuffer not complete");
mpRenderbuffer->SetMultisamplingEnabled(mEnableMultisampling);
mpTexture->SetMultisamplingEnabled(mEnableMultisampling);
InitBuffers();
mInitialized = true;
}
}
void CFramebuffer::Bind()
void CFramebuffer::Bind(GLenum Target /*= GL_FRAMEBUFFER*/)
{
if (!mInitialized) Init();
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
glBindFramebuffer(Target, mFramebuffer);
}
void CFramebuffer::Resize(u32 Width, u32 Height)
@@ -81,30 +71,51 @@ void CFramebuffer::Resize(u32 Width, u32 Height)
{
mpRenderbuffer->Resize(Width, Height);
mpTexture->Resize(Width, Height);
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
mpRenderbuffer->Bind();
glFramebufferRenderbuffer(
GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mpRenderbuffer->BufferID()
);
mpTexture->Bind(0);
glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mpTexture->TextureID(), 0
);
InitBuffers();
}
}
}
CTexture* CFramebuffer::Texture()
void CFramebuffer::SetMultisamplingEnabled(bool Enable)
{
return mpTexture;
if (mEnableMultisampling != Enable)
{
mEnableMultisampling = Enable;
if (mInitialized)
{
mpRenderbuffer->SetMultisamplingEnabled(Enable);
mpTexture->SetMultisamplingEnabled(Enable);
InitBuffers();
}
}
}
// ************ PROTECTED ************
void CFramebuffer::InitBuffers()
{
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
mpRenderbuffer->Bind();
glFramebufferRenderbuffer(
GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mpRenderbuffer->BufferID()
);
mpTexture->Bind(0);
glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, (mEnableMultisampling ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D), mpTexture->TextureID(), 0
);
mStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (mStatus != GL_FRAMEBUFFER_COMPLETE)
Log::Error("Framebuffer not complete; error " + TString::HexString((u32) mStatus, 0));
}
// ************ STATIC ************
void CFramebuffer::BindDefaultFramebuffer()
void CFramebuffer::BindDefaultFramebuffer(GLenum Target /*= GL_FRAMEBUFFER*/)
{
glBindFramebuffer(GL_FRAMEBUFFER, smDefaultFramebuffer);
glBindFramebuffer(Target, smDefaultFramebuffer);
}
GLint CFramebuffer::smDefaultFramebuffer;

View File

@@ -11,6 +11,7 @@ class CFramebuffer
CRenderbuffer *mpRenderbuffer;
CTexture *mpTexture;
u32 mWidth, mHeight;
bool mEnableMultisampling;
bool mInitialized;
GLenum mStatus;
@@ -22,11 +23,18 @@ public:
CFramebuffer(u32 Width, u32 Height);
~CFramebuffer();
void Init();
void Bind();
void Bind(GLenum Target = GL_FRAMEBUFFER);
void Resize(u32 Width, u32 Height);
CTexture* Texture();
static void BindDefaultFramebuffer();
void SetMultisamplingEnabled(bool Enable);
// Accessors
inline CTexture* Texture() const { return mpTexture; }
// Static
static void BindDefaultFramebuffer(GLenum Target = GL_FRAMEBUFFER);
protected:
void InitBuffers();
};
#endif // CFRAMEBUFFER_H

View File

@@ -8,20 +8,23 @@ class CRenderbuffer
{
GLuint mRenderbuffer;
u32 mWidth, mHeight;
bool mEnableMultisampling;
bool mInitialized;
public:
CRenderbuffer::CRenderbuffer()
: mInitialized(false)
, mWidth(0)
: mWidth(0)
, mHeight(0)
, mEnableMultisampling(false)
, mInitialized(false)
{
}
CRenderbuffer::CRenderbuffer(u32 Width, u32 Height)
: mInitialized(false)
, mWidth(Width)
: mWidth(Width)
, mHeight(Height)
, mEnableMultisampling(false)
, mInitialized(false)
{
}
@@ -33,10 +36,9 @@ public:
void CRenderbuffer::Init()
{
glGenRenderbuffers(1, &mRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, mWidth, mHeight);
mInitialized = true;
glGenRenderbuffers(1, &mRenderbuffer);
InitStorage();
}
inline void CRenderbuffer::Resize(u32 Width, u32 Height)
@@ -45,10 +47,7 @@ public:
mHeight = Height;
if (mInitialized)
{
Bind();
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, mWidth, mHeight);
}
InitStorage();
}
inline void CRenderbuffer::Bind()
@@ -66,6 +65,26 @@ public:
{
return mRenderbuffer;
}
inline void SetMultisamplingEnabled(bool Enable)
{
if (mEnableMultisampling != Enable)
{
mEnableMultisampling = Enable;
InitStorage();
}
}
private:
void InitStorage()
{
Bind();
if (mEnableMultisampling)
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT24, mWidth, mHeight);
else
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, mWidth, mHeight);
}
};
#endif // CRENDERBUFFER_H