mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-21 10:49:23 +00:00
Enabled MSAA
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user