From c5140b4f13b9cf7b2560462a63891423a5e08b3d Mon Sep 17 00:00:00 2001 From: Adrien GIVRY Date: Thu, 5 Sep 2019 18:58:44 -0400 Subject: [PATCH] Framebuffer wrapping implemented A simple wrapping for FBO has been implemented. We use this wrapped framebuffer only in AView for now. There is not a lot of settings attached to the FBO for now but it is enough to handle the scene view. --- .../OvEditor/include/OvEditor/Panels/AView.h | 10 +-- .../OvEditor/src/OvEditor/Panels/AView.cpp | 32 +------- .../Overload/OvRendering/OvRendering.vcxproj | 2 + .../OvRendering/OvRendering.vcxproj.filters | 6 ++ .../include/OvRendering/Buffers/Framebuffer.h | 70 ++++++++++++++++ .../src/OvRendering/Buffers/Framebuffer.cpp | 82 +++++++++++++++++++ 6 files changed, 166 insertions(+), 36 deletions(-) create mode 100644 Sources/Overload/OvRendering/include/OvRendering/Buffers/Framebuffer.h create mode 100644 Sources/Overload/OvRendering/src/OvRendering/Buffers/Framebuffer.cpp diff --git a/Sources/Overload/OvEditor/include/OvEditor/Panels/AView.h b/Sources/Overload/OvEditor/include/OvEditor/Panels/AView.h index 7afcc44e6..797e118aa 100644 --- a/Sources/Overload/OvEditor/include/OvEditor/Panels/AView.h +++ b/Sources/Overload/OvEditor/include/OvEditor/Panels/AView.h @@ -10,6 +10,7 @@ #include #include #include +#include #include namespace OvEditor::Core { class EditorRenderer; } @@ -35,11 +36,6 @@ namespace OvEditor::Panels const OvUI::Settings::PanelWindowSettings& p_windowSettings ); - /** - * Destructor - */ - ~AView(); - /** * Update the view * @param p_deltaTime @@ -117,8 +113,6 @@ namespace OvEditor::Panels OvMaths::FVector3 m_gridColor = OvMaths::FVector3::One; private: - uint32_t m_fbo; - uint32_t m_renderTexture; - uint32_t m_depthStencilBuffer; + OvRendering::Buffers::Framebuffer m_fbo; }; } \ No newline at end of file diff --git a/Sources/Overload/OvEditor/src/OvEditor/Panels/AView.cpp b/Sources/Overload/OvEditor/src/OvEditor/Panels/AView.cpp index dc67c1383..cb4a708dd 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Panels/AView.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Panels/AView.cpp @@ -16,22 +16,11 @@ OvEditor::Panels::AView::AView const OvUI::Settings::PanelWindowSettings& p_windowSettings ) : PanelWindow(p_title, p_opened, p_windowSettings), m_editorRenderer(EDITOR_RENDERER()) { - glGenFramebuffers(1, &m_fbo); - glGenTextures(1, &m_renderTexture); - glGenRenderbuffers(1, &m_depthStencilBuffer); - m_cameraPosition = { -10.0f, 4.0f, 10.0f }; m_camera.SetPitch(-10.0f); m_camera.SetYaw(-45.f); - m_image = &CreateWidget(m_renderTexture, OvMaths::FVector2{ 0.f, 0.f }); -} - -OvEditor::Panels::AView::~AView() -{ - glDeleteBuffers(1, &m_fbo); - glDeleteTextures(1, &m_renderTexture); - glGenRenderbuffers(1, &m_depthStencilBuffer); + m_image = &CreateWidget(m_fbo.GetTextureID(), OvMaths::FVector2{ 0.f, 0.f }); } void OvEditor::Panels::AView::Update(float p_deltaTime) @@ -42,20 +31,7 @@ void OvEditor::Panels::AView::Update(float p_deltaTime) m_image->size = OvMaths::FVector2(static_cast(winWidth), static_cast(winHeight)); - /* Setup texture */ - glBindTexture(GL_TEXTURE_2D, m_renderTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, winWidth, winHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - /* Setup depth-stencil buffer (24 + 8 bits) */ - glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, winWidth, winHeight); - - /* Setup frame buffer */ - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer); - glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_renderTexture, 0); + m_fbo.Resize(winWidth, winHeight); Unbind(); } @@ -66,12 +42,12 @@ void OvEditor::Panels::AView::Bind() glViewport(0, 0, winWidth, winHeight); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); + m_fbo.Bind(); } void OvEditor::Panels::AView::Unbind() { - glBindFramebuffer(GL_FRAMEBUFFER, 0); + m_fbo.Unbind(); } void OvEditor::Panels::AView::_Draw_Impl() diff --git a/Sources/Overload/OvRendering/OvRendering.vcxproj b/Sources/Overload/OvRendering/OvRendering.vcxproj index 881c00e0b..494489b3f 100644 --- a/Sources/Overload/OvRendering/OvRendering.vcxproj +++ b/Sources/Overload/OvRendering/OvRendering.vcxproj @@ -129,6 +129,7 @@ xcopy "$(SolutionDir)..\..\Dependencies\assimp\bin\*.dll" "$(SolutionDir)..\..\B + @@ -163,6 +164,7 @@ xcopy "$(SolutionDir)..\..\Dependencies\assimp\bin\*.dll" "$(SolutionDir)..\..\B + diff --git a/Sources/Overload/OvRendering/OvRendering.vcxproj.filters b/Sources/Overload/OvRendering/OvRendering.vcxproj.filters index 1837d7ce5..51b858027 100644 --- a/Sources/Overload/OvRendering/OvRendering.vcxproj.filters +++ b/Sources/Overload/OvRendering/OvRendering.vcxproj.filters @@ -117,6 +117,9 @@ Header Files + + Header Files + @@ -170,6 +173,9 @@ Source Files + + Source Files + diff --git a/Sources/Overload/OvRendering/include/OvRendering/Buffers/Framebuffer.h b/Sources/Overload/OvRendering/include/OvRendering/Buffers/Framebuffer.h new file mode 100644 index 000000000..c74e1f849 --- /dev/null +++ b/Sources/Overload/OvRendering/include/OvRendering/Buffers/Framebuffer.h @@ -0,0 +1,70 @@ +/** +* @project: Overload +* @author: Overload Tech. +* @restrictions: This software may not be resold, redistributed or otherwise conveyed to a third party. +*/ + +#pragma once + +#include + +#include "OvRendering/Context/Driver.h" + +namespace OvRendering::Buffers +{ + /** + * Wraps OpenGL EBO + */ + class API_OVRENDERING Framebuffer + { + public: + /** + * Create the framebuffer + * @param p_width + * @param p_height + */ + Framebuffer(uint16_t p_width = 0, uint16_t p_height = 0); + + /** + * Destructor + */ + ~Framebuffer(); + + /** + * Bind the framebuffer + */ + void Bind(); + + /** + * Unbind the framebuffer + */ + void Unbind(); + + /** + * Defines a new size for the framebuffer + * @param p_width + * @param p_height + */ + void Resize(uint16_t p_width, uint16_t p_height); + + /** + * Returns the ID of the OpenGL framebuffer + */ + uint32_t GetID(); + + /** + * Returns the ID of the OpenGL render texture + */ + uint32_t GetTextureID(); + + /** + * Returns the ID of the OpenGL render buffer + */ + uint32_t GetRenderBufferID(); + + private: + uint32_t m_bufferID = 0; + uint32_t m_renderTexture = 0; + uint32_t m_depthStencilBuffer = 0; + }; +} \ No newline at end of file diff --git a/Sources/Overload/OvRendering/src/OvRendering/Buffers/Framebuffer.cpp b/Sources/Overload/OvRendering/src/OvRendering/Buffers/Framebuffer.cpp new file mode 100644 index 000000000..d0b3eac66 --- /dev/null +++ b/Sources/Overload/OvRendering/src/OvRendering/Buffers/Framebuffer.cpp @@ -0,0 +1,82 @@ +/** +* @project: Overload +* @author: Overload Tech. +* @restrictions: This software may not be resold, redistributed or otherwise conveyed to a third party. +*/ + +#include + +#include "OvRendering/Buffers/Framebuffer.h" + +OvRendering::Buffers::Framebuffer::Framebuffer(uint16_t p_width, uint16_t p_height) +{ + /* Generate OpenGL objects */ + glGenFramebuffers(1, &m_bufferID); + glGenTextures(1, &m_renderTexture); + glGenRenderbuffers(1, &m_depthStencilBuffer); + + /* Setup texture */ + glBindTexture(GL_TEXTURE_2D, m_renderTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glBindTexture(GL_TEXTURE_2D, 0); + + /* Setup framebuffer */ + Bind(); + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_renderTexture, 0); + Unbind(); + + Resize(p_width, p_height); +} + +OvRendering::Buffers::Framebuffer::~Framebuffer() +{ + /* Destroy OpenGL objects */ + glDeleteBuffers(1, &m_bufferID); + glDeleteTextures(1, &m_renderTexture); + glGenRenderbuffers(1, &m_depthStencilBuffer); +} + +void OvRendering::Buffers::Framebuffer::Bind() +{ + glBindFramebuffer(GL_FRAMEBUFFER, m_bufferID); +} + +void OvRendering::Buffers::Framebuffer::Unbind() +{ + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +void OvRendering::Buffers::Framebuffer::Resize(uint16_t p_width, uint16_t p_height) +{ + /* Resize texture */ + glBindTexture(GL_TEXTURE_2D, m_renderTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, p_width, p_height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); + glBindTexture(GL_TEXTURE_2D, 0); + + /* Setup depth-stencil buffer (24 + 8 bits) */ + glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, p_width, p_height); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + /* Attach depth and stencil buffer to the framebuffer */ + Bind(); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer); + Unbind(); +} + +uint32_t OvRendering::Buffers::Framebuffer::GetID() +{ + return m_bufferID; +} + +uint32_t OvRendering::Buffers::Framebuffer::GetTextureID() +{ + return m_renderTexture; +} + +uint32_t OvRendering::Buffers::Framebuffer::GetRenderBufferID() +{ + return m_depthStencilBuffer; +}