From 3ab32864139072a6df2ad01d472f5b54ca81455f Mon Sep 17 00:00:00 2001 From: tleety Date: Wed, 9 Sep 2015 16:00:18 +0200 Subject: [PATCH] Added backbone to the BGFX renderer, with comments on what to do next. --- include/Core/BGFXRenderer.h | 71 +++++------------- include/Core/Renderer.h | 2 - src/game/Core/BGFXRenderer.cpp | 131 +++++++++++++++++++++++++++++++++ src/game/Core/Renderer.cpp | 2 + 4 files changed, 151 insertions(+), 55 deletions(-) mode change 100644 => 100755 include/Core/Renderer.h mode change 100644 => 100755 src/game/Core/BGFXRenderer.cpp mode change 100644 => 100755 src/game/Core/Renderer.cpp diff --git a/include/Core/BGFXRenderer.h b/include/Core/BGFXRenderer.h index aa61bf2..ce48ffc 100755 --- a/include/Core/BGFXRenderer.h +++ b/include/Core/BGFXRenderer.h @@ -7,6 +7,7 @@ #include "Util/Rectangle.h" #include "Core/Camera.h" #include "Core/RenderQueue.h" +#include "Core/ShaderProgram.h" namespace dd { @@ -33,59 +34,8 @@ public: } } - void Initialize() - { - // Initialize GLFW - if (!glfwInit()) { - LOG_ERROR("GLFW: Initialization failed"); - exit(EXIT_FAILURE); - } - - // Create a window - GLFWmonitor* monitor = nullptr; - if (m_Fullscreen) { - monitor = glfwGetPrimaryMonitor(); - } - glfwWindowHint(GLFW_SAMPLES, 8); - m_Window = glfwCreateWindow(m_Resolution.Width, m_Resolution.Height, "daydream", monitor, nullptr); - if (!m_Window) { - LOG_ERROR("GLFW: Failed to create window"); - exit(EXIT_FAILURE); - } - //glfwMakeContextCurrent(m_Window); - - // Initialize GLEW -// if (glewInit() != GLEW_OK) { -// LOG_ERROR("GLEW: Initialization failed"); -// exit(EXIT_FAILURE); -// } - //LOG_ERROR("STUFF"); - - // Initialize bgfx - bgfx::glfwSetWindow(m_Window); - bgfx::init(bgfx::RendererType::OpenGL, BGFX_PCI_ID_NONE, 0, nullptr, nullptr); - bgfx::reset(m_Resolution.Width, m_Resolution.Height, BGFX_RESET_NONE); - bgfx::setDebug(BGFX_DEBUG_TEXT); - bgfx::setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x303030ff, 1.0f, 0); - - std::stringstream ss; - ss << bgfx::getRendererName(bgfx::getRendererType()); -#ifdef DEBUG - ss << " DEBUG"; -#endif - LOG_INFO(ss.str().c_str()); - glfwSetWindowTitle(m_Window, ss.str().c_str()); - } - - void Draw(RenderQueueCollection& rq) - { - bgfx::touch(0); - - bgfx::dbgTextClear(); - bgfx::dbgTextPrintf(0, 1, 0x4f, "daydream"); - - bgfx::frame(); - } + void Initialize(); + void Draw(RenderQueueCollection& rq); private: Rectangle m_Resolution = Rectangle(1280, 720); @@ -95,6 +45,21 @@ private: const dd::Camera* m_Camera = nullptr; GLFWwindow* m_Window = nullptr; + + void DrawForward(); + void DrawDeferred(RenderQueue &objects, RenderQueue &lights); + void DrawScene(RenderQueue &objects, ShaderProgram &program); + void DrawLightScene(RenderQueue &objects, ShaderProgram &program); + void LoadShaders(); + void CreateBuffers(); + void debugKeys(); + + ShaderProgram* m_spDeferred1; + ShaderProgram* m_spDeferred2; + ShaderProgram* m_spDeferred3; + ShaderProgram* m_spForward; + ShaderProgram* m_spScreen; + //TODO: Shaders, CreateBuffers, Draw forward, drawdeferred, drawscene, drawlights. }; } diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h old mode 100644 new mode 100755 index 8aa4a2c..7f444f3 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -30,8 +30,6 @@ namespace dd class Renderer { public: - //Render(); - GLFWwindow* Window() const { return m_Window; } Rectangle Resolution() const { return m_Resolution; } void SetResolution(const Rectangle& resolution) { m_Resolution = resolution; } diff --git a/src/game/Core/BGFXRenderer.cpp b/src/game/Core/BGFXRenderer.cpp old mode 100644 new mode 100755 index 411ec42..dc88fce --- a/src/game/Core/BGFXRenderer.cpp +++ b/src/game/Core/BGFXRenderer.cpp @@ -1,3 +1,134 @@ #include "PrecompiledHeader.h" #include "Core/BGFXRenderer.h" +void dd::BGFXRenderer::Initialize() { + + // Initialize GLFW + if (!glfwInit()) { + LOG_ERROR("GLFW: Initialization failed"); + exit(EXIT_FAILURE); + } + // Create a window + GLFWmonitor* monitor = nullptr; + if (m_Fullscreen) { + monitor = glfwGetPrimaryMonitor(); + } + glfwWindowHint(GLFW_SAMPLES, 8); + m_Window = glfwCreateWindow(m_Resolution.Width, m_Resolution.Height, "daydream", monitor, nullptr); + if (!m_Window) { + LOG_ERROR("GLFW: Failed to create window"); + exit(EXIT_FAILURE); + } + //intiialize BGFX + bgfx::glfwSetWindow(m_Window); + + bgfx::init(); + bgfx::reset(m_Resolution.Width, m_Resolution.Height, BGFX_RESET_NONE); + + //Enable debug text + bgfx::setDebug(BGFX_DEBUG_TEXT); + + //Set view 0 clear state + bgfx::setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x303030ff, 1.0f, 0); + + std::stringstream ss; + ss << bgfx::getRendererName(bgfx::getRendererType()); +#ifdef DEBUG + ss << " DEBUG"; +#endif + LOG_INFO(ss.str().c_str()); + glfwSetWindowTitle(m_Window, ss.str().c_str()); + //LoadShaders + //CreateBuffers + +} + +void dd::BGFXRenderer::Draw(RenderQueueCollection& rq) { + //TODO: Fix this shit. + + //Draw the different passes. + DrawDeferred(rq.Deferred, rq.Lights); + //DrawForward(); //For alpha things + + //Settings for the last combination of images. + //Clear + //bind textures + //Draw array + + //Swapbuffer? + + //DEbugKeys. + +// bgfx::touch(0); +// bgfx::dbgTextClear(); +// bgfx::dbgTextPrintf(0, 1, 0x4f, "DayDream"); +// bgfx::frame(); +} + +void dd::BGFXRenderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) { + //Pass 1: Fill g-buffers + + //Make sure the settings are correct, like Backface culling and depthmask and shit. + //Clear + //Bind The first shaders with the remade shaderprogram class. + //Draw the scene by calling DrawScene() and putting in objects and the shaderprogram used. + + //Pass 2: Lighting + + //Make sure the settings are correct, like backface culling and depthmask and shit. + //clear + //bind shaders with remade shaderProgram class. + //Draw by calling DrawLightSpheres() and sending in the Renderqueue with lights. + + //Pass 3: Combine into final image. + + //Make sure settings are correct. + //clear + //Bind shaderprograms + //Bind light and gbuffer textures to uniforms so the shader can use them. +} + +void dd::BGFXRenderer::DrawScene(RenderQueue &objects, ShaderProgram &program) { + //Init shaderprogram + + //Fix the camera matrises + + //Loop throught jobs and modeljobs, make sure the uniform/texture variables are set. +} + +void dd::BGFXRenderer::DrawLightScene(RenderQueue &objects, ShaderProgram &program) { + //Init shaderProgram + + //Bind textures + + //Fix matrises + + //Loop through the jobs and draw them with the right uniforms and shit. +} +void dd::BGFXRenderer::debugKeys() { + + //TODO: Insert keys to debug rendering. +} + +void dd::BGFXRenderer::LoadShaders() { + //Remake shaderprogram so the loadshader function can work with bgfx +} + +void dd::BGFXRenderer::CreateBuffers() { + //Quad and sphere for what? + + //Depth buffer + + //Generate G-Buffer(first pass) textures + + //Create first pass frame buffer + + //Generate Lighting(second pass) texture + + //Generate second pass framebuffer + + //Generate final texture + + //Generate third pass buffer +} + diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp old mode 100644 new mode 100755 index 5af1892..9d9a90c --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -256,6 +256,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred2); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); + m_spDeferred2->Bind(); DrawLightSpheres(lights); @@ -265,6 +266,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); + m_spDeferred3->Bind(); glUniform3fv(glGetUniformLocation(*m_spDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.3f))); glActiveTexture(GL_TEXTURE0);