axmol/core/renderer/backend/opengl/RenderTargetGL.cpp

84 lines
2.7 KiB
C++
Raw Normal View History

#include "RenderTargetGL.h"
2020-10-27 16:58:37 +08:00
#include "DeviceGL.h"
#include "renderer/backend/opengl/MacrosGL.h"
CC_BACKEND_BEGIN
2020-10-27 16:58:37 +08:00
RenderTargetGL::RenderTargetGL(bool defaultRenderTarget, DeviceGL* deviceGL) : RenderTarget(defaultRenderTarget)
{
2021-12-25 10:04:45 +08:00
if (!defaultRenderTarget)
{
glGenFramebuffers(1, &_FBO);
}
2021-12-25 10:04:45 +08:00
else
{
2020-10-27 16:58:37 +08:00
_FBO = deviceGL->getDefaultFBO();
}
}
RenderTargetGL::~RenderTargetGL()
{
2021-12-25 10:04:45 +08:00
if (!_defaultRenderTarget)
{
bindFrameBuffer();
for (auto slot = 0; slot < MAX_COLOR_ATTCHMENT; ++slot)
2021-12-25 10:04:45 +08:00
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + slot, GL_TEXTURE_2D, 0, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
unbindFrameBuffer();
glDeleteFramebuffers(1, &_FBO);
CHECK_GL_ERROR_DEBUG();
}
}
void RenderTargetGL::bindFrameBuffer() const
{
glBindFramebuffer(GL_FRAMEBUFFER, _FBO);
}
void RenderTargetGL::unbindFrameBuffer() const
{
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
2022-06-24 14:18:48 +08:00
void RenderTargetGL::update() const {
if (!_dirty) return;
if(!_defaultRenderTarget) {
if(bitmask::any(_flags, TargetBufferFlags::COLOR_ALL))
{ // color attachments
GLenum bufs[MAX_COLOR_ATTCHMENT] = {GL_NONE};
for (size_t i = 0; i < MAX_COLOR_ATTCHMENT; ++i)
2021-12-25 10:04:45 +08:00
{
2022-06-24 14:18:48 +08:00
if (bitmask::any(_flags, getMRTColorFlag(i)))
{
auto textureInfo = _color[i];
auto textureHandler = textureInfo.texture != nullptr ? textureInfo.texture->getHandler() : 0;
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textureHandler,
textureInfo.level);
bufs[i] = GL_COLOR_ATTACHMENT0 + i;
}
}
2022-06-24 14:18:48 +08:00
#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX
glDrawBuffers(MAX_COLOR_ATTCHMENT, bufs);
#endif
CHECK_GL_ERROR_DEBUG();
}
2022-06-24 14:18:48 +08:00
// depth attacmhemt
2021-12-25 10:04:45 +08:00
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
2022-06-24 14:18:48 +08:00
_depth.texture != nullptr ? _depth.texture->getHandler() : 0, _depth.level);
CHECK_GL_ERROR_DEBUG();
2022-06-24 14:18:48 +08:00
// stencil attachment
2021-12-25 10:04:45 +08:00
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
2022-06-24 14:18:48 +08:00
_stencil.texture != nullptr ? _stencil.texture->getHandler() : 0, _stencil.level);
CHECK_GL_ERROR_DEBUG();
}
2022-06-24 14:18:48 +08:00
_dirty = false;
}
CC_BACKEND_END