Forward plus render pass now removed from Renderer.cpp to it's own class.
This commit is contained in:
@@ -0,0 +1,38 @@
|
|||||||
|
#ifndef DrawFinalPass_h__
|
||||||
|
#define DrawFinalPass_h__
|
||||||
|
|
||||||
|
#include "IRenderer.h"
|
||||||
|
#include "DrawFinalPassState.h"
|
||||||
|
#include "LightCullingPass.h"
|
||||||
|
#include "FrameBuffer.h"
|
||||||
|
#include "ShaderProgram.h"
|
||||||
|
#include "Util/UnorderedMapVec2.h"
|
||||||
|
#include "Texture.h"
|
||||||
|
|
||||||
|
class DrawFinalPass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass);
|
||||||
|
~DrawFinalPass() { }
|
||||||
|
void InitializeTextures();
|
||||||
|
void InitializeFrameBuffers();
|
||||||
|
void InitializeShaderPrograms();
|
||||||
|
|
||||||
|
void Draw(RenderQueueCollection& rq);
|
||||||
|
|
||||||
|
//Getters
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
||||||
|
|
||||||
|
Texture* m_WhiteTexture;
|
||||||
|
|
||||||
|
const IRenderer* m_Renderer;
|
||||||
|
const LightCullingPass* m_LightCullingPass;
|
||||||
|
|
||||||
|
ShaderProgram* m_ForwardPlusProgram;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef DrawFinalPassState_h__
|
||||||
|
#define DrawFinalPassState_h__
|
||||||
|
|
||||||
|
#include "Rendering/RenderState.h"
|
||||||
|
|
||||||
|
class DrawFinalPassState : public RenderState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawFinalPassState();
|
||||||
|
~DrawFinalPassState();
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
#include "PickingPass.h"
|
#include "PickingPass.h"
|
||||||
#include "DrawScenePass.h"
|
#include "DrawScenePass.h"
|
||||||
#include "LightCullingPass.h"
|
#include "LightCullingPass.h"
|
||||||
|
#include "DrawFinalPass.h"
|
||||||
|
|
||||||
#include "../Core/EventBroker.h"
|
#include "../Core/EventBroker.h"
|
||||||
#include "EPicking.h"
|
#include "EPicking.h"
|
||||||
@@ -45,6 +46,7 @@ private:
|
|||||||
PickingPass* m_PickingPass;
|
PickingPass* m_PickingPass;
|
||||||
LightCullingPass* m_LightCullingPass;
|
LightCullingPass* m_LightCullingPass;
|
||||||
ImGuiRenderPass* m_ImGuiRenderPass;
|
ImGuiRenderPass* m_ImGuiRenderPass;
|
||||||
|
DrawFinalPass* m_DrawFinalPass;
|
||||||
|
|
||||||
//----------------------Functions----------------------//
|
//----------------------Functions----------------------//
|
||||||
void InitializeWindow();
|
void InitializeWindow();
|
||||||
@@ -56,21 +58,10 @@ private:
|
|||||||
//void PickingPass(RenderQueueCollection& rq);
|
//void PickingPass(RenderQueueCollection& rq);
|
||||||
void DrawScreenQuad(GLuint textureToDraw);
|
void DrawScreenQuad(GLuint textureToDraw);
|
||||||
|
|
||||||
//----------------------Forward+-----------------------//
|
|
||||||
void DrawForwardPlus(RenderQueueCollection& rq);
|
|
||||||
//Frustum
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------SSBO------------------------//
|
|
||||||
|
|
||||||
|
|
||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
||||||
//--------------------ShaderPrograms-------------------//
|
//--------------------ShaderPrograms-------------------//
|
||||||
ShaderProgram* m_BasicForwardProgram;
|
ShaderProgram* m_BasicForwardProgram;
|
||||||
ShaderProgram* m_DrawScreenQuadProgram;
|
ShaderProgram* m_DrawScreenQuadProgram;
|
||||||
|
|
||||||
ShaderProgram* m_ForwardPlusProgram;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
#include "Rendering/DrawFinalPass.h"
|
||||||
|
|
||||||
|
DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass)
|
||||||
|
{
|
||||||
|
m_Renderer = renderer;
|
||||||
|
m_LightCullingPass = lightCullingPass;
|
||||||
|
InitializeTextures();
|
||||||
|
InitializeShaderPrograms();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawFinalPass::InitializeTextures()
|
||||||
|
{
|
||||||
|
m_WhiteTexture = ResourceManager::Load<Texture>("Textures/Core/Blank.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawFinalPass::InitializeShaderPrograms()
|
||||||
|
{
|
||||||
|
m_ForwardPlusProgram = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram");
|
||||||
|
m_ForwardPlusProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/ForwardPlus.vert.glsl")));
|
||||||
|
m_ForwardPlusProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/ForwardPlus.frag.glsl")));
|
||||||
|
m_ForwardPlusProgram->Compile();
|
||||||
|
m_ForwardPlusProgram->Link();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawFinalPass::Draw(RenderQueueCollection& rq)
|
||||||
|
{
|
||||||
|
GLERROR("DrawFinalPass::Draw: Pre");
|
||||||
|
|
||||||
|
DrawFinalPassState state;
|
||||||
|
m_ForwardPlusProgram->Bind();
|
||||||
|
GLuint shaderHandle = m_ForwardPlusProgram->GetHandle();
|
||||||
|
|
||||||
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO());
|
||||||
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO());
|
||||||
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightCullingPass->LightIndexSSBO());
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix()));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix()));
|
||||||
|
|
||||||
|
//TODO: Render: Add code for more jobs than modeljobs.
|
||||||
|
for (auto &job : rq.Forward) {
|
||||||
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
||||||
|
if(modelJob) {
|
||||||
|
//TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix));
|
||||||
|
glUniform4fv(glGetUniformLocation(shaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color));
|
||||||
|
|
||||||
|
if(modelJob->DiffuseTexture != nullptr) {
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture);
|
||||||
|
} else {
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindVertexArray(modelJob->Model->VAO);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
|
glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GLERROR("DrawFinalPass::Draw: END");
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#include "Rendering/DrawFinalPassState.h"
|
||||||
|
|
||||||
|
|
||||||
|
DrawFinalPassState::DrawFinalPassState()
|
||||||
|
{
|
||||||
|
BindFramebuffer(0);
|
||||||
|
|
||||||
|
Enable(GL_DEPTH_TEST);
|
||||||
|
Enable(GL_CULL_FACE);
|
||||||
|
ClearColor(glm::vec4(200.f / 255, 0.f / 255, 200.f / 255, 0.f));
|
||||||
|
Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawFinalPassState::~DrawFinalPassState()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -14,15 +14,12 @@ void DrawScenePass::InitializeTextures()
|
|||||||
|
|
||||||
void DrawScenePass::InitializeShaderPrograms()
|
void DrawScenePass::InitializeShaderPrograms()
|
||||||
{
|
{
|
||||||
//Gör så att shaders är en resource, tex som texture classen. Konstruktorn måste vara privat.
|
|
||||||
m_BasicForwardProgram = ResourceManager::Load<ShaderProgram>("#BasicForwardProgram");
|
m_BasicForwardProgram = ResourceManager::Load<ShaderProgram>("#BasicForwardProgram");
|
||||||
|
|
||||||
m_BasicForwardProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/BasicForward.vert.glsl")));
|
m_BasicForwardProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/BasicForward.vert.glsl")));
|
||||||
m_BasicForwardProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/BasicForward.frag.glsl")));
|
m_BasicForwardProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/BasicForward.frag.glsl")));
|
||||||
m_BasicForwardProgram->Compile();
|
m_BasicForwardProgram->Compile();
|
||||||
m_BasicForwardProgram->Link();
|
m_BasicForwardProgram->Link();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawScenePass::Draw(RenderQueueCollection& rq)
|
void DrawScenePass::Draw(RenderQueueCollection& rq)
|
||||||
@@ -61,6 +58,12 @@ void DrawScenePass::Draw(RenderQueueCollection& rq)
|
|||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
auto spriteJob = std::dynamic_pointer_cast<SpriteJob>(job);
|
||||||
|
if(spriteJob)
|
||||||
|
{
|
||||||
|
//Hello im a sprite, please draw me.
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
GLERROR("DrawScenePass::Draw: End");
|
GLERROR("DrawScenePass::Draw: End");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,47 +72,12 @@ void Renderer::InitializeShaders()
|
|||||||
m_DrawScreenQuadProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl")));
|
m_DrawScreenQuadProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl")));
|
||||||
m_DrawScreenQuadProgram->Compile();
|
m_DrawScreenQuadProgram->Compile();
|
||||||
m_DrawScreenQuadProgram->Link();
|
m_DrawScreenQuadProgram->Link();
|
||||||
|
|
||||||
m_ForwardPlusProgram = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram");
|
|
||||||
m_ForwardPlusProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/ForwardPlus.vert.glsl")));
|
|
||||||
m_ForwardPlusProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/ForwardPlus.frag.glsl")));
|
|
||||||
m_ForwardPlusProgram->Compile();
|
|
||||||
m_ForwardPlusProgram->Link();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::InputUpdate(double dt)
|
void Renderer::InputUpdate(double dt)
|
||||||
{
|
{
|
||||||
static DebugCameraInputController<Renderer> firstPersonInputController(m_EventBroker, -1);
|
static DebugCameraInputController<Renderer> firstPersonInputController(m_EventBroker, -1);
|
||||||
|
|
||||||
glm::vec3 m_Position = m_Camera->Position();
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_O) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position = glm::vec3(0.f, 0.f, 5.f);
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_W) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position += m_Camera->Forward() * m_CameraMoveSpeed * (float)dt;
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_S) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position -= m_Camera->Forward() * m_CameraMoveSpeed * (float)dt;
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_D) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position += m_Camera->Right() * m_CameraMoveSpeed * (float)dt;
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_A) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position -= m_Camera->Right() * m_CameraMoveSpeed * (float)dt;
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_CameraMoveSpeed = 5.f;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_CameraMoveSpeed = 0.5f;
|
|
||||||
}
|
|
||||||
|
|
||||||
firstPersonInputController.Update(dt);
|
firstPersonInputController.Update(dt);
|
||||||
m_Camera->SetOrientation(firstPersonInputController.Orientation());
|
m_Camera->SetOrientation(firstPersonInputController.Orientation());
|
||||||
m_Camera->SetPosition(firstPersonInputController.Position());
|
m_Camera->SetPosition(firstPersonInputController.Position());
|
||||||
@@ -132,7 +97,7 @@ void Renderer::Draw(RenderQueueCollection& rq)
|
|||||||
m_LightCullingPass->CullLights();
|
m_LightCullingPass->CullLights();
|
||||||
|
|
||||||
//m_DrawScenePass->Draw(rq);
|
//m_DrawScenePass->Draw(rq);
|
||||||
DrawForwardPlus(rq);
|
m_DrawFinalPass->Draw(rq);
|
||||||
glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f);
|
glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f);
|
||||||
GLERROR("Renderer::Draw m_DrawScenePass->Draw");
|
GLERROR("Renderer::Draw m_DrawScenePass->Draw");
|
||||||
m_ImGuiRenderPass->Draw();
|
m_ImGuiRenderPass->Draw();
|
||||||
@@ -183,50 +148,5 @@ void Renderer::InitializeRenderPasses()
|
|||||||
m_DrawScenePass = new DrawScenePass(this);
|
m_DrawScenePass = new DrawScenePass(this);
|
||||||
m_PickingPass = new PickingPass(this, m_EventBroker);
|
m_PickingPass = new PickingPass(this, m_EventBroker);
|
||||||
m_LightCullingPass = new LightCullingPass(this);
|
m_LightCullingPass = new LightCullingPass(this);
|
||||||
}
|
m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass);
|
||||||
|
}
|
||||||
void Renderer::DrawForwardPlus(RenderQueueCollection& rq)
|
|
||||||
{
|
|
||||||
GLERROR("Renderer::DrawForwardPlus: Pre");
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
glEnable(GL_CULL_FACE);
|
|
||||||
glClearColor(200.f / 255, 0.f / 255, 200.f / 255, 0.f);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
m_ForwardPlusProgram->Bind();
|
|
||||||
GLuint ShaderHandle = m_ForwardPlusProgram->GetHandle();
|
|
||||||
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO());
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO());
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightCullingPass->LightIndexSSBO());
|
|
||||||
//TODO: Render: Add code for more jobs than modeljobs.
|
|
||||||
for (auto &job : rq.Forward) {
|
|
||||||
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
|
||||||
if (modelJob) {
|
|
||||||
|
|
||||||
//TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix));
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix()));
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix()));
|
|
||||||
glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color));
|
|
||||||
|
|
||||||
//TODO: Renderer: bättre textur felhantering samt fler texturer stöd
|
|
||||||
if (modelJob->DiffuseTexture != nullptr) {
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture);
|
|
||||||
} else {
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
glBindVertexArray(modelJob->Model->VAO);
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
|
||||||
glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GLERROR("Renderer::DrawForwardPlus: End");
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user