diff --git a/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp b/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp index cc9ac019c..40a6f645e 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp @@ -132,6 +132,7 @@ namespace Nz struct SetFrameBufferData { + std::array clearValues; //< TODO: Remove hard limit? const OpenGLFramebuffer* framebuffer; }; diff --git a/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.inl b/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.inl index bec54f598..1dd4b4d30 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.inl +++ b/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.inl @@ -138,6 +138,9 @@ namespace Nz SetFrameBufferData setFramebuffer; setFramebuffer.framebuffer = &framebuffer; + assert(clearValues.size() < setFramebuffer.clearValues.size()); + std::copy(clearValues.begin(), clearValues.end(), setFramebuffer.clearValues.begin()); + m_commands.emplace_back(std::move(setFramebuffer)); } diff --git a/include/Nazara/OpenGLRenderer/OpenGLFramebuffer.hpp b/include/Nazara/OpenGLRenderer/OpenGLFramebuffer.hpp index d6bc34dee..e5228039b 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLFramebuffer.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLFramebuffer.hpp @@ -30,6 +30,8 @@ namespace Nz virtual void Activate() const = 0; + virtual std::size_t GetColorBufferCount() const = 0; + inline Type GetType() const; OpenGLFramebuffer& operator=(const OpenGLFramebuffer&) = delete; diff --git a/include/Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.hpp b/include/Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.hpp index 0e702f98c..e1a7cb998 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.hpp @@ -24,6 +24,8 @@ namespace Nz void Activate() const override; + std::size_t GetColorBufferCount() const override; + OpenGLWindowFramebuffer& operator=(const OpenGLWindowFramebuffer&) = delete; OpenGLWindowFramebuffer& operator=(OpenGLWindowFramebuffer&&) = delete; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp index 1996b8e4f..ab3a25631 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp @@ -35,6 +35,8 @@ typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const G cb(glBufferData, PFNGLBUFFERDATAPROC) \ cb(glBufferSubData, PFNGLBUFFERSUBDATAPROC) \ cb(glClear, PFNGLCLEARPROC) \ + cb(glClearBufferfi, PFNGLCLEARBUFFERFIPROC) \ + cb(glClearBufferuiv, PFNGLCLEARBUFFERUIVPROC) \ cb(glClearColor, PFNGLCLEARCOLORPROC) \ cb(glClearDepthf, PFNGLCLEARDEPTHFPROC) \ cb(glClearStencil, PFNGLCLEARSTENCILPROC) \ diff --git a/src/Nazara/OpenGLRenderer/OpenGLCommandBuffer.cpp b/src/Nazara/OpenGLRenderer/OpenGLCommandBuffer.cpp index 3308adf01..4c47d6a54 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLCommandBuffer.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLCommandBuffer.cpp @@ -93,7 +93,24 @@ namespace Nz command.framebuffer->Activate(); context = GL::Context::GetCurrentContext(); - context->glClearColor(0.5, 0.5, 0.5, 1.0); + + if (command.framebuffer->GetType() == OpenGLFramebuffer::Type::FBO) + { + std::size_t colorBufferCount = command.framebuffer->GetColorBufferCount(); + for (std::size_t i = 0; i < colorBufferCount; ++i) + { + Nz::Color color = command.clearValues[i].color; + std::array clearColor = { color.r, color.g, color.b, color.a }; + + context->glClearBufferuiv(GL_COLOR, GLint(i), clearColor.data()); + } + } + else + { + Nz::Color color = command.clearValues[0].color; + context->glClearColor(color.r, color.g, color.b, color.a); + } + context->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } else diff --git a/src/Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.cpp b/src/Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.cpp index 48b900a5c..a7e8283f6 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.cpp @@ -17,4 +17,9 @@ namespace Nz context.BindFramebuffer(GL::FramebufferTarget::Draw, 0); } + + std::size_t OpenGLWindowFramebuffer::GetColorBufferCount() const + { + return 1; + } }