13 EE_CORE_ASSERT(tex->GetWidth() > 0 && tex->GetHeight() > 0,
"Framebuffer dimensions must be positive");
16 glGenFramebuffers(1, &m_frameBufferId);
19 m_textureId =
static_cast<GLuint
>(
reinterpret_cast<intptr_t
>(tex->GetNativeHandle()));
22 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureId, 0);
24 glGenRenderbuffers(1, &m_renderBufferId);
25 glBindRenderbuffer(GL_RENDERBUFFER, m_renderBufferId);
26 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, tex->GetWidth(), tex->GetHeight());
27 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_renderBufferId);
35 glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferId);
40 glBindFramebuffer(GL_FRAMEBUFFER, 0);
45 GLCheck(glBindFramebuffer(GL_READ_FRAMEBUFFER, m_frameBufferId));
46 GLCheck(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0));
50 0, 0, m_texture->GetWidth(), m_texture->GetHeight(),
51 0, 0, screenWidth, screenHeight,
52 GL_COLOR_BUFFER_BIT, GL_NEAREST
58 if (width == m_texture->GetWidth() && height == m_texture->GetHeight())
return;
59 else if (width <= 0 || height <= 0)
return;
69 m_texture->SetData(
nullptr, meta);
72 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureId, 0);
75 glBindRenderbuffer(GL_RENDERBUFFER, m_renderBufferId);
76 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
77 glBindRenderbuffer(GL_RENDERBUFFER, 0);
83bool Elevate::OpenGLFrameBuffer::CheckCompleteness()
const
85 uint32_t status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
86 if (status != GL_FRAMEBUFFER_COMPLETE) {
87 const char* msg = GetFramebufferStatusString(status);
88 EE_CORE_ERROR(
"Framebuffer error: {}", msg);
94const char* Elevate::OpenGLFrameBuffer::GetFramebufferStatusString(uint32_t status)
const
98 case GL_FRAMEBUFFER_COMPLETE:
return "COMPLETE";
99 case GL_FRAMEBUFFER_UNDEFINED:
return "UNDEFINED";
100 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
return "INCOMPLETE_ATTACHMENT";
101 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
return "MISSING_ATTACHMENT";
102 case GL_FRAMEBUFFER_UNSUPPORTED:
return "UNSUPPORTED_FORMAT";
103 case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
return "INCOMPLETE_MULTISAMPLE";
104 default:
return "UNKNOWN_ERROR";
void Bind() const override
void Rescale(uint32_t width, uint32_t height) override
void Unbind() const override
void BlitFramebufferToScreen(uint32_t screenWidth, uint32_t screenHeight) const override
OpenGLFrameBuffer(TexturePtr tex)
static void BindTexture(const std::shared_ptr< Texture > &texture, uint8_t slot=0)
std::shared_ptr< Texture > TexturePtr