From 393a7741401e64558bbe4a5962281f4009b41940 Mon Sep 17 00:00:00 2001 From: Tleety Date: Wed, 9 Dec 2015 14:50:39 +0100 Subject: [PATCH 01/12] Framework for Forward+ renderer, Buggy. --- include/Engine/Rendering/Renderer.h | 86 ++++++++++++++--- resources/Shaders/GridFrustum.comp.glsl | 118 ++++++++++++++++++++++++ resources/Shaders/cullLights.comp.glsl | 71 ++++++++++++++ src/Engine/Rendering/Renderer.cpp | 97 +++++++++++++++++-- 4 files changed, 354 insertions(+), 18 deletions(-) create mode 100644 resources/Shaders/GridFrustum.comp.glsl create mode 100644 resources/Shaders/cullLights.comp.glsl diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b1b76468..b227f110 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -11,18 +11,30 @@ #include "FrameBuffer.h" #include "../Core/World.h" +#define TILE_SIZE 16 +#define NUM_LIGHTS 3 + + +enum lightType +{ + Point, + Spot, + Directional, + Area +}; + class Renderer : public IRenderer { public: - virtual void Initialize() override; - virtual void Update(double dt) override; - virtual void Draw(RenderQueueCollection& rq) override; + virtual void Initialize() override; + virtual void Update(double dt) override; + virtual void Draw(RenderQueueCollection& rq) override; private: - //----------------------Variables----------------------// - Texture* m_ErrorTexture; - Texture* m_WhiteTexture; - float m_CameraMoveSpeed; + //----------------------Variables----------------------// + Texture* m_ErrorTexture; + Texture* m_WhiteTexture; + float m_CameraMoveSpeed; FrameBuffer m_PickingBuffer; GLuint m_PickingTexture; GLuint m_DepthBuffer; @@ -32,26 +44,76 @@ private: Model* m_UnitSphere; - + std::unordered_map m_PickingColorsToEntity; - //----------------------Functions----------------------// - void InitializeWindow(); - void InitializeShaders(); + //----------------------Functions----------------------// + void InitializeWindow(); + void InitializeShaders(); void InitializeTextures(); void InitializeFrameBuffers(); + void InitializeSSBOs(); //TODO: Renderer: Get InputUpdate out of renderer - void InputUpdate(double dt); + void InputUpdate(double dt); void PickingPass(RenderQueueCollection& rq); void DrawScreenQuad(GLuint textureToDraw); void DrawScene(RenderQueueCollection& rq); + //----------------------Forward+-----------------------// + void CalculateFrustum(); + void CullLights(); + //Frustum + struct Plane + { + glm::vec3 Normal; + float d; + }; + + struct Frustum + { + Plane plane[4]; + }; + Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution + + //Lights + void TEMPCreateLights(); + //TODO: Renderer: Add Directionllights, spotlights and area lights to this as type. + struct PointLight { + glm::vec4 Position = glm::vec4(0.f); + glm::vec4 Color = glm::vec4(1.f); + float Radius = 5.f; + float Intensity = 0.8f; + float Falloff = 0.3f; + float Padding = 1337; + }; + PointLight m_PointLights[NUM_LIGHTS]; + + struct LightGrid { + int Amount; + int Start; + glm::vec2 Padding; + }; + LightGrid m_LightGrid[80*45]; + + int m_LightOffset = 0; + + int m_LightIndex[80*45*200]; + + //-------------------------SSBO------------------------// + GLuint m_FrustumSSBO; + GLuint m_LightSSBO; + GLuint m_LightGridSSBO; + GLuint m_LightOffsetSSBO; + GLuint m_LightIndexSSBO; void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// ShaderProgram m_BasicForwardProgram; ShaderProgram m_PickingProgram; ShaderProgram m_DrawScreenQuadProgram; + ShaderProgram m_CalculateFrustumProgram; + ShaderProgram m_LightCullProgram; + }; #endif \ No newline at end of file diff --git a/resources/Shaders/GridFrustum.comp.glsl b/resources/Shaders/GridFrustum.comp.glsl new file mode 100644 index 00000000..64f4d467 --- /dev/null +++ b/resources/Shaders/GridFrustum.comp.glsl @@ -0,0 +1,118 @@ +#version 430 + +#define TILE_SIZE 16 +#define NUM_TILES 3600 + +uniform mat4 P; +uniform vec2 ScreenDimensions; + +struct Plane { + vec3 Normal; + float d; +}; +struct Frustum { + Plane Planes[4]; +}; + +layout (std430, binding = 1) buffer FrustumBuffer +{ + Frustum Data[80*45]; +} Frustums; + + +struct PlaneNormals { + vec3 Normal1; + float pad1; + vec3 Normal2; + float Pad2; +}; + +struct FrustumNormals { + PlaneNormals Planes[4]; +}; + +layout (std430, binding = 2) buffer PlaneNormalBuffer +{ + FrustumNormals Data[80*45]; +} FrustumNorm; + + +vec4 ConvertToView(vec4 ScreenCoords) +{ + vec2 normalizedScreenCoords = ScreenCoords.xy / ScreenDimensions; + vec4 clipSpace = vec4( vec2(normalizedScreenCoords.x, normalizedScreenCoords.y) * 2.0 - 1.0, ScreenCoords.z, ScreenCoords.w); + vec4 view = inverse(P) * clipSpace; + view = view / view.w; + return view; +} + +Plane ComputePlane( vec3 p0, vec3 p1, vec3 p2 ) +{ + Plane plane; + + vec3 v0 = p1 - p0; + vec3 v2 = p2 - p0; + + plane.Normal = normalize( cross( v0, v2 ) ); + plane.d = dot( vec3(plane.Normal), p0 ); // Always 0 probably + return plane; +} + +layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in; +void main () +{ + if(gl_GlobalInvocationID.x * TILE_SIZE < ScreenDimensions.x && gl_GlobalInvocationID.y * TILE_SIZE < ScreenDimensions.y) { + //Top-Left = 0 | Top-Right = 1 + //Bottom-Left = 2 | Bottom-Right = 3 + vec4 ScreenCoords[4]; + ScreenCoords[0] = vec4(gl_GlobalInvocationID.x * TILE_SIZE, (gl_GlobalInvocationID.y + 1 ) * TILE_SIZE, -1.0, 1.0); // Z-axis might need to be 1 + ScreenCoords[1] = vec4((gl_GlobalInvocationID.x + 1) * TILE_SIZE, (gl_GlobalInvocationID.y + 1) * TILE_SIZE, -1.0, 1.0); + ScreenCoords[2] = vec4(gl_GlobalInvocationID.x * TILE_SIZE, (gl_GlobalInvocationID.y) * TILE_SIZE, -1.0, 1.0); + ScreenCoords[3] = vec4((gl_GlobalInvocationID.x + 1) * TILE_SIZE, (gl_GlobalInvocationID.y) * TILE_SIZE, -1.0, 1.0); + + vec3 ViewVectors[4]; + for(int i = 0; i < 4; i++) { + ViewVectors[i] = vec3(ConvertToView(ScreenCoords[i])); + } + + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal1 = (ViewVectors[2]); + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal2 = (ViewVectors[0]); + + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal1 = (ViewVectors[1]); + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal2 = (ViewVectors[3]); + + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal1 = (ViewVectors[0]); + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal2 = (ViewVectors[1]); + + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal1 = (ViewVectors[3]); + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal2 = (ViewVectors[2]); + /* + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal1 = vec3(ScreenCoords[2]); + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal2 = vec3(ScreenCoords[0]); + + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal1 = vec3(ScreenCoords[1]); + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal2 = vec3(ScreenCoords[3]); + + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal1 = vec3(ScreenCoords[0]); + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal2 = vec3(ScreenCoords[1]); + + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal1 = vec3(ScreenCoords[3]); + FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal2 = vec3(ScreenCoords[2]); + +*/ + + + vec3 EyePos = vec3(0,0,0); + + Frustum f; + f.Planes[0] = ComputePlane(EyePos, ViewVectors[2], ViewVectors[0]); + f.Planes[1] = ComputePlane(EyePos, ViewVectors[1], ViewVectors[3]); + f.Planes[2] = ComputePlane(EyePos, ViewVectors[0], ViewVectors[1]); + f.Planes[3] = ComputePlane(EyePos, ViewVectors[3], ViewVectors[2]); + + + + + Frustums.Data[gl_GlobalInvocationID.x + gl_GlobalInvocationID.y*80] = f; + } +} \ No newline at end of file diff --git a/resources/Shaders/cullLights.comp.glsl b/resources/Shaders/cullLights.comp.glsl new file mode 100644 index 00000000..72d36ec1 --- /dev/null +++ b/resources/Shaders/cullLights.comp.glsl @@ -0,0 +1,71 @@ +#version 430 + +//in uvec3 gl_NumWorkGroups; +//in uvec3 gl_WorkGroupID; +//in uvec3 gl_LocalInvocationID; +//in uvec3 gl_GlobalInvocationID; +//in uint gl_LocalInvocationIndex; + +#define NUM_LIGHTS 3 +#define MAX_LIGHTS_PER_TILE 200 +#define NUM_TILES 3600 + +struct PointLight { + vec4 Position; + vec4 Color; + float Radius; + float Intensity; + vec2 Pad; +}; + +layout (std430, binding = 0) buffer PointLightBuffer +{ + PointLight PointLights[NUM_LIGHTS]; +}; + +struct Plane { + vec3 Normal; + float d; +}; + +struct Frustum { + Plane Planes[4]; +}; + +layout (std430, binding = 1) buffer FrustumBuffer +{ + Frustum Frustums[80*45]; +}; + +layout (std430, binding = 3) buffer LightIndexBuffer +{ + float LightIndexList[MAX_LIGHTS_PER_TILE*NUM_TILES]; +}; + +struct LightGrid +{ + int Amount; + int Start; + vec2 padding; +}; + +layout (std430, binding = 4) buffer LightGridBuffer +{ + LightGrid LightGrids[NUM_TILES]; +}; + +layout (std430, binding = 5) buffer LightOffsetCounter +{ + int GlobalLightOffsetCounter; +}; + + +layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in; +void main () +{ + if(gl_LocalInvocationIndex == 0) { + LightIndexList[int(gl_WorkGroupID.x) + int(gl_WorkGroupID.y)*80] = int(gl_WorkGroupID.x); + } + + +} \ No newline at end of file diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index aba512fd..36f260c5 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -10,11 +10,17 @@ void Renderer::Initialize() if (m_Camera == nullptr) { m_Camera = m_DefaultCamera; } + TEMPCreateLights(); glfwSwapInterval(m_VSYNC); InitializeShaders(); InitializeTextures(); InitializeFrameBuffers(); + InitializeSSBOs(); + CalculateFrustum(); + + + m_ScreenQuad = ResourceManager::Load("Models/Core/ScreenQuad.obj"); @@ -80,6 +86,13 @@ void Renderer::InitializeShaders() m_DrawScreenQuadProgram.Compile(); m_DrawScreenQuadProgram.Link(); + m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); + m_CalculateFrustumProgram.Compile(); + m_CalculateFrustumProgram.Link(); + + m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); + m_CalculateFrustumProgram.Compile(); + m_CalculateFrustumProgram.Link(); } void Renderer::InputUpdate(double dt) @@ -169,7 +182,8 @@ void Renderer::Draw(RenderQueueCollection& rq) { //TODO: Renderer: Kanske borde vara längst upp i update. PickingPass(rq); - DrawScreenQuad(m_PickingTexture); + //DrawScreenQuad(m_PickingTexture); + //CullLights(); DrawScene(rq); glfwSwapBuffers(m_Window); @@ -278,7 +292,6 @@ void Renderer::PickingPass(RenderQueueCollection& rq) } - void Renderer::DrawScreenQuad(GLuint textureToDraw) { glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -300,7 +313,6 @@ void Renderer::DrawScreenQuad(GLuint textureToDraw) , GL_UNSIGNED_INT, 0, m_ScreenQuad->TextureGroups[0].StartIndex); } - void Renderer::InitializeTextures() { m_ErrorTexture=ResourceManager::Load("Textures/Core/ErrorTexture.png"); @@ -332,8 +344,6 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin GLERROR("Texture initialization failed"); } - - void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better location, as its really big { glGenRenderbuffers(1, &m_DepthBuffer); @@ -343,4 +353,79 @@ void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better lo m_PickingBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); m_PickingBuffer.AddResource(std::shared_ptr(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); m_PickingBuffer.Generate(); -} \ No newline at end of file +} + +void Renderer::InitializeSSBOs() +{ + glGenBuffers(1, &m_FrustumSSBO); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_FrustumSSBO); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_Frustums), &m_Frustums, GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); + + GLERROR("m_FrustumSSBO"); + + glGenBuffers(1, &m_LightSSBO); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_PointLights), &m_PointLights, GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); + + GLERROR("m_LightSSBO"); + + + glGenBuffers(1, &m_LightGridSSBO); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightGridSSBO); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightGrid), &m_LightGrid, GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); + + GLERROR("m_LightGridSSBO"); + + + glGenBuffers(1, &m_LightOffsetSSBO); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightOffsetSSBO); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); + + GLERROR("m_LightOffsetSSBO"); + + + glGenBuffers(1, &m_LightIndexSSBO); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightIndexSSBO); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightIndex), &m_LightIndex, GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); + + GLERROR("m_LightIndexSSBO"); + +} + +void Renderer::CalculateFrustum() +{ + m_CalculateFrustumProgram.Bind(); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); + glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height); + glDispatchCompute(m_Resolution.Width / TILE_SIZE, m_Resolution.Height / TILE_SIZE, 1); + GLERROR("CalculateFrustum Error"); + +} + +void Renderer::TEMPCreateLights() +{ + for (int i = 0; i < NUM_LIGHTS; i++) { + m_PointLights[i].Position = glm::vec4(i, 0.f, 0.f, 0.f); + m_PointLights[i].Color = glm::vec4(1.f, 0.5f, 0.f + i*0.1f, 1.f); + } +} + +void Renderer::CullLights() +{ + m_LightCullProgram.Bind(); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_LightOffsetSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO); + glDispatchCompute(m_Resolution.Width / TILE_SIZE, m_Resolution.Height / TILE_SIZE, 1); + GLERROR("CullLights Error"); + +} + From de6e74c0b18c4b78d8ae259483038908e7ec8ef0 Mon Sep 17 00:00:00 2001 From: Tleety Date: Wed, 9 Dec 2015 17:36:03 +0100 Subject: [PATCH 02/12] Forward+ Debugging commit, dont try it. --- include/Engine/Rendering/Renderer.h | 19 ++++------ resources/Shaders/GridFrustum.comp.glsl | 49 +------------------------ resources/Shaders/cullLights.comp.glsl | 48 +++--------------------- src/Engine/Rendering/Renderer.cpp | 22 ++++++++--- 4 files changed, 33 insertions(+), 105 deletions(-) diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b227f110..b0ddf870 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -63,15 +63,12 @@ private: void CalculateFrustum(); void CullLights(); //Frustum - struct Plane - { + struct Plane { glm::vec3 Normal; float d; }; - - struct Frustum - { - Plane plane[4]; + struct Frustum { + Plane Planes[4]; }; Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution @@ -100,11 +97,11 @@ private: int m_LightIndex[80*45*200]; //-------------------------SSBO------------------------// - GLuint m_FrustumSSBO; - GLuint m_LightSSBO; - GLuint m_LightGridSSBO; - GLuint m_LightOffsetSSBO; - GLuint m_LightIndexSSBO; + GLuint m_FrustumSSBO = 0; + GLuint m_LightSSBO = 1; + GLuint m_LightGridSSBO = 2; + GLuint m_LightOffsetSSBO = 3; + GLuint m_LightIndexSSBO = 4; void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// diff --git a/resources/Shaders/GridFrustum.comp.glsl b/resources/Shaders/GridFrustum.comp.glsl index 64f4d467..27559370 100644 --- a/resources/Shaders/GridFrustum.comp.glsl +++ b/resources/Shaders/GridFrustum.comp.glsl @@ -14,29 +14,11 @@ struct Frustum { Plane Planes[4]; }; -layout (std430, binding = 1) buffer FrustumBuffer +layout (std430, binding = 0) buffer FrustumBuffer { - Frustum Data[80*45]; + Frustum Data[3600]; } Frustums; - -struct PlaneNormals { - vec3 Normal1; - float pad1; - vec3 Normal2; - float Pad2; -}; - -struct FrustumNormals { - PlaneNormals Planes[4]; -}; - -layout (std430, binding = 2) buffer PlaneNormalBuffer -{ - FrustumNormals Data[80*45]; -} FrustumNorm; - - vec4 ConvertToView(vec4 ScreenCoords) { vec2 normalizedScreenCoords = ScreenCoords.xy / ScreenDimensions; @@ -75,33 +57,6 @@ void main () ViewVectors[i] = vec3(ConvertToView(ScreenCoords[i])); } - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal1 = (ViewVectors[2]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal2 = (ViewVectors[0]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal1 = (ViewVectors[1]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal2 = (ViewVectors[3]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal1 = (ViewVectors[0]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal2 = (ViewVectors[1]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal1 = (ViewVectors[3]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal2 = (ViewVectors[2]); - /* - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal1 = vec3(ScreenCoords[2]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal2 = vec3(ScreenCoords[0]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal1 = vec3(ScreenCoords[1]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal2 = vec3(ScreenCoords[3]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal1 = vec3(ScreenCoords[0]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal2 = vec3(ScreenCoords[1]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal1 = vec3(ScreenCoords[3]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal2 = vec3(ScreenCoords[2]); - -*/ - - vec3 EyePos = vec3(0,0,0); Frustum f; diff --git a/resources/Shaders/cullLights.comp.glsl b/resources/Shaders/cullLights.comp.glsl index 72d36ec1..e9fa9a95 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -6,66 +6,30 @@ //in uvec3 gl_GlobalInvocationID; //in uint gl_LocalInvocationIndex; + + #define NUM_LIGHTS 3 #define MAX_LIGHTS_PER_TILE 200 #define NUM_TILES 3600 -struct PointLight { - vec4 Position; - vec4 Color; - float Radius; - float Intensity; - vec2 Pad; -}; - -layout (std430, binding = 0) buffer PointLightBuffer -{ - PointLight PointLights[NUM_LIGHTS]; -}; - struct Plane { vec3 Normal; float d; }; - struct Frustum { Plane Planes[4]; }; -layout (std430, binding = 1) buffer FrustumBuffer +layout (std430, binding = 0) buffer FrustumBuffer { - Frustum Frustums[80*45]; -}; + Frustum Data[3600]; +} Frustums; -layout (std430, binding = 3) buffer LightIndexBuffer -{ - float LightIndexList[MAX_LIGHTS_PER_TILE*NUM_TILES]; -}; - -struct LightGrid -{ - int Amount; - int Start; - vec2 padding; -}; - -layout (std430, binding = 4) buffer LightGridBuffer -{ - LightGrid LightGrids[NUM_TILES]; -}; - -layout (std430, binding = 5) buffer LightOffsetCounter -{ - int GlobalLightOffsetCounter; -}; layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in; void main () { - if(gl_LocalInvocationIndex == 0) { - LightIndexList[int(gl_WorkGroupID.x) + int(gl_WorkGroupID.y)*80] = int(gl_WorkGroupID.x); + if(1 == 1) { } - - } \ No newline at end of file diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 36f260c5..e9a35cba 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -90,9 +90,9 @@ void Renderer::InitializeShaders() m_CalculateFrustumProgram.Compile(); m_CalculateFrustumProgram.Link(); - m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); - m_CalculateFrustumProgram.Compile(); - m_CalculateFrustumProgram.Link(); + m_LightCullProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); + m_LightCullProgram.Compile(); + m_LightCullProgram.Link(); } void Renderer::InputUpdate(double dt) @@ -357,9 +357,11 @@ void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better lo void Renderer::InitializeSSBOs() { + printf("Size: %i\n", sizeof(m_Frustums)); glGenBuffers(1, &m_FrustumSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_FrustumSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_Frustums), &m_Frustums, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_FrustumSSBO"); @@ -367,6 +369,7 @@ void Renderer::InitializeSSBOs() glGenBuffers(1, &m_LightSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_PointLights), &m_PointLights, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightSSBO"); @@ -375,6 +378,7 @@ void Renderer::InitializeSSBOs() glGenBuffers(1, &m_LightGridSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightGridSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightGrid), &m_LightGrid, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightGridSSBO"); @@ -383,6 +387,7 @@ void Renderer::InitializeSSBOs() glGenBuffers(1, &m_LightOffsetSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightOffsetSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_LightOffsetSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightOffsetSSBO"); @@ -391,6 +396,7 @@ void Renderer::InitializeSSBOs() glGenBuffers(1, &m_LightIndexSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightIndexSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightIndex), &m_LightIndex, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightIndexSSBO"); @@ -399,12 +405,18 @@ void Renderer::InitializeSSBOs() void Renderer::CalculateFrustum() { + GLERROR("CalculateFrustum Error-1"); m_CalculateFrustumProgram.Bind(); + + GLERROR("CalculateFrustum Error1"); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); + GLERROR("CalculateFrustum Error2"); glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix())); + GLERROR("CalculateFrustum Error3"); glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height); - glDispatchCompute(m_Resolution.Width / TILE_SIZE, m_Resolution.Height / TILE_SIZE, 1); - GLERROR("CalculateFrustum Error"); + GLERROR("CalculateFrustum Error4"); + glDispatchCompute(5, 3, 1); + GLERROR("CalculateFrustum Error5"); } From 9d3313e3ede581b485ed27febbd1cef0c53a9581 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Dec 2015 10:46:27 +0100 Subject: [PATCH 03/12] Calculate frustrum removed from code untill Nvidia isn't shit. --- src/Engine/Rendering/Renderer.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index e9a35cba..c483cdc6 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -17,11 +17,7 @@ void Renderer::Initialize() InitializeTextures(); InitializeFrameBuffers(); InitializeSSBOs(); - CalculateFrustum(); - - - - + //CalculateFrustum(); m_ScreenQuad = ResourceManager::Load("Models/Core/ScreenQuad.obj"); m_UnitQuad = ResourceManager::Load("Models/Core/UnitQuad.obj"); From 37cf42527b9de668c0e1e5834fa597423eb24bf4 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Dec 2015 16:03:48 +0100 Subject: [PATCH 04/12] RenderState class structure made. --- include/Engine/Rendering/RenderState.h | 22 +++++++ src/Engine/Rendering/RenderState.cpp | 81 ++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 include/Engine/Rendering/RenderState.h create mode 100644 src/Engine/Rendering/RenderState.cpp diff --git a/include/Engine/Rendering/RenderState.h b/include/Engine/Rendering/RenderState.h new file mode 100644 index 00000000..76816308 --- /dev/null +++ b/include/Engine/Rendering/RenderState.h @@ -0,0 +1,22 @@ +#ifndef RenderState_h__ +#define RenderState_h__ + +#include "../Common.h" +#include "../OpenGL.h" +#include "../GLM.h" + +class RenderState +{ +public: + RenderState(); + ~RenderState(); + bool Enable(GLenum GLEnable); + bool CullFace(GLenum GlFaceToCull); + bool ClearColor(glm::vec4 color); + bool Clear(GLbitfield mask); +private: + std::vector m_Enables; + float m_preClearColor[4]; + GLenum m_preCullFace; +}; +#endif \ No newline at end of file diff --git a/src/Engine/Rendering/RenderState.cpp b/src/Engine/Rendering/RenderState.cpp new file mode 100644 index 00000000..6844dbfd --- /dev/null +++ b/src/Engine/Rendering/RenderState.cpp @@ -0,0 +1,81 @@ +#include "Rendering/RenderState.h" + +RenderState::RenderState() +{ +} + +bool RenderState::Enable(GLenum GLEnable) +{ + if(glIsEnabled(GLEnable)) + { + LOG_WARNING("Trying to enable somthing that is already enabled."); + return false; + } + m_Enables.push_back(GLEnable); + glEnable(GLEnable); + if (GLERROR("RenderState::Enable")) + { + return false; + } + return true; +} + +bool RenderState::CullFace(GLenum GLCullFace) +{ + if(!glIsEnabled(GL_CULL_FACE)) + { + LOG_ERROR("Setting GL_CULL_FACE without enabling it."); + return false; + } + + GLint a; + glGetIntegerv(GL_CULL_FACE_MODE, &a); + if(a == GL_BACK) + { + LOG_INFO("Setting Cullface to back, unessesary since this is already default."); + } + m_preCullFace = a; + glCullFace(GLCullFace); + if (GLERROR("RenderState::CullFace")) + { + return false; + } + return true; +} + +bool RenderState::ClearColor(glm::vec4 color) +{ + glGetFloatv(GL_COLOR_CLEAR_VALUE, &m_preClearColor[0]); + glClearColor(color.r, color.g, color.b, color.a); + if (GLERROR("RenderState::ClearColor")) { + return false; + } + return true; +} + +bool RenderState::Clear(GLbitfield mask) +{ + glClear(mask); + if (GLERROR("RenderState::Clear")) { + return false; + } + return true; +} + +RenderState::~RenderState() +{ + //Set cullface to default + glCullFace(m_preCullFace); + + //Set color to default + glClearColor(m_preClearColor[0], m_preClearColor[1], m_preClearColor[2], m_preClearColor[3]); + + //Disable Enables + for (auto i : m_Enables) + { + glDisable(i); + } + + m_Enables.clear(); +} + From cefc4e525784370d34f868c695575c723b7f51cf Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Dec 2015 16:06:25 +0100 Subject: [PATCH 05/12] PickingPassState done. --- include/Engine/Rendering/PickingPassState.h | 15 +++++++++++++++ src/Engine/Rendering/PickingPassState.cpp | 14 ++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 include/Engine/Rendering/PickingPassState.h create mode 100644 src/Engine/Rendering/PickingPassState.cpp diff --git a/include/Engine/Rendering/PickingPassState.h b/include/Engine/Rendering/PickingPassState.h new file mode 100644 index 00000000..5902f9dc --- /dev/null +++ b/include/Engine/Rendering/PickingPassState.h @@ -0,0 +1,15 @@ +#ifndef PickingPassState_h__ +#define PickingPassState_h__ + +#include "Rendering/RenderState.h" + +class PickingPassState : public RenderState +{ +public: + PickingPassState(); + ~PickingPassState(); +private: + +}; + +#endif \ No newline at end of file diff --git a/src/Engine/Rendering/PickingPassState.cpp b/src/Engine/Rendering/PickingPassState.cpp new file mode 100644 index 00000000..9822c47e --- /dev/null +++ b/src/Engine/Rendering/PickingPassState.cpp @@ -0,0 +1,14 @@ +#include "Rendering/PickingPassState.h" + + +PickingPassState::PickingPassState() +{ + Enable(GL_DEPTH_TEST); + Enable(GL_CULL_FACE); + CullFace(GL_BACK); + + glm::vec4 clearColor = glm::vec4(0.f); + ClearColor(clearColor); + Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} + From 91edab34bc9156fe26800d5b47de606db8fd2ba5 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Dec 2015 11:18:30 +0100 Subject: [PATCH 06/12] PickingPass now sets state and clear it when done. PickingState now it's own class so renderer is a bit cleaner. --- include/Engine/Rendering/PickingPass.h | 45 ++++++ include/Engine/Rendering/Renderer.h | 13 +- include/Engine/Rendering/ShaderProgram.h | 4 + include/Engine/Rendering/Util/GLError.h | 2 +- src/Engine/Rendering/FrameBuffer.cpp | 10 +- src/Engine/Rendering/PickingPass.cpp | 105 +++++++++++++ src/Engine/Rendering/PickingPassState.cpp | 5 + src/Engine/Rendering/RenderState.cpp | 2 +- src/Engine/Rendering/Renderer.cpp | 182 +++++++++++----------- 9 files changed, 264 insertions(+), 104 deletions(-) create mode 100644 include/Engine/Rendering/PickingPass.h create mode 100644 src/Engine/Rendering/PickingPass.cpp diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h new file mode 100644 index 00000000..313751d5 --- /dev/null +++ b/include/Engine/Rendering/PickingPass.h @@ -0,0 +1,45 @@ +#ifndef PickingPass_h__ +#define PickingPass_h__ + +#include "IRenderer.h" +#include "PickingPassState.h" +#include "FrameBuffer.h" +#include "ShaderProgram.h" +#include "Util/UnorderedMapVec2.h" + +class PickingPass +{ +public: + PickingPass(IRenderer* renderer); + ~PickingPass(); + void InitializeTextures(); + void InitializeFrameBuffers(); + void InitializeShaderPrograms(); + + void Draw(RenderQueueCollection& rq); + + + //Getters + const ShaderProgram& PickingProgram() const { return m_PickingProgram; } + const std::unordered_map& PickingColorsToEntity() const { return m_PickingColorsToEntity; } + GLuint PickingTexture() const { return m_PickingTexture; } + GLuint DepthBuffer() const { return m_DepthBuffer; } + const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; } + + +private: + void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; + + const IRenderer* m_Renderer; + + ShaderProgram m_PickingProgram; + + std::unordered_map m_PickingColorsToEntity; + + GLuint m_PickingTexture; + GLuint m_DepthBuffer; + + FrameBuffer m_PickingBuffer; +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b0ddf870..18f32a17 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -10,6 +10,8 @@ #include "Util/UnorderedMapVec2.h" #include "FrameBuffer.h" #include "../Core/World.h" +#include "PickingPass.h" + #define TILE_SIZE 16 #define NUM_LIGHTS 3 @@ -35,17 +37,12 @@ private: Texture* m_ErrorTexture; Texture* m_WhiteTexture; float m_CameraMoveSpeed; - FrameBuffer m_PickingBuffer; - GLuint m_PickingTexture; - GLuint m_DepthBuffer; Model* m_ScreenQuad; Model* m_UnitQuad; Model* m_UnitSphere; - - - std::unordered_map m_PickingColorsToEntity; + PickingPass* m_PickingPass; //----------------------Functions----------------------// void InitializeWindow(); @@ -53,9 +50,10 @@ private: void InitializeTextures(); void InitializeFrameBuffers(); void InitializeSSBOs(); + void InitializeRenderPasses(); //TODO: Renderer: Get InputUpdate out of renderer void InputUpdate(double dt); - void PickingPass(RenderQueueCollection& rq); + //void PickingPass(RenderQueueCollection& rq); void DrawScreenQuad(GLuint textureToDraw); void DrawScene(RenderQueueCollection& rq); @@ -106,7 +104,6 @@ private: void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// ShaderProgram m_BasicForwardProgram; - ShaderProgram m_PickingProgram; ShaderProgram m_DrawScreenQuadProgram; ShaderProgram m_CalculateFrustumProgram; ShaderProgram m_LightCullProgram; diff --git a/include/Engine/Rendering/ShaderProgram.h b/include/Engine/Rendering/ShaderProgram.h index 1b87650e..097e09c3 100644 --- a/include/Engine/Rendering/ShaderProgram.h +++ b/include/Engine/Rendering/ShaderProgram.h @@ -1,3 +1,5 @@ +#ifndef ShaderProgram_h__ +#define ShaderProgram_h__ #include "../Common.h" #include "../OpenGL.h" @@ -79,3 +81,5 @@ private: GLuint m_ShaderProgramHandle; std::vector> m_Shaders; }; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/Util/GLError.h b/include/Engine/Rendering/Util/GLError.h index 8202f433..754623d1 100644 --- a/include/Engine/Rendering/Util/GLError.h +++ b/include/Engine/Rendering/Util/GLError.h @@ -9,7 +9,7 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig GLenum error = glGetError(); if (error != GL_NO_ERROR) { - _LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s %i %s", info, error, gluErrorString(error)); + _LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s, %i, %s", info, error, gluErrorString(error)); return true; } diff --git a/src/Engine/Rendering/FrameBuffer.cpp b/src/Engine/Rendering/FrameBuffer.cpp index 1b53d868..b2b29626 100644 --- a/src/Engine/Rendering/FrameBuffer.cpp +++ b/src/Engine/Rendering/FrameBuffer.cpp @@ -48,13 +48,21 @@ void FrameBuffer::Generate() switch ((*it)->m_ResourceType) { case GL_TEXTURE_2D: glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0); + GLERROR("FrameBuffer generate: glFramebufferTexture2D"); + break; case GL_RENDERBUFFER: glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle); + GLERROR("FrameBuffer generate: glFramebufferRenderbuffer"); + if ( (*it)->m_Attachment != GL_COLOR_ATTACHMENT0 || + (*it)->m_Attachment != GL_DEPTH_ATTACHMENT || + (*it)->m_Attachment != GL_STENCIL_ATTACHMENT) + { + LOG_ERROR("RenderBuffer Attachment not valid."); + } break; } - GLERROR("FrameBuffer generate"); if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT) { attachments.push_back((*it)->m_Attachment); diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp new file mode 100644 index 00000000..5b44cbf4 --- /dev/null +++ b/src/Engine/Rendering/PickingPass.cpp @@ -0,0 +1,105 @@ +#include "Rendering/PickingPass.h" + +PickingPass::PickingPass(IRenderer* renderer) +{ + m_Renderer = renderer; + InitializeTextures(); + InitializeFrameBuffers(); + InitializeShaderPrograms(); +} + +PickingPass::~PickingPass() +{ + +} + +void PickingPass::InitializeTextures() +{ + GenerateTexture(&m_PickingTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, + glm::vec2(m_Renderer->Resolution().Width, m_Renderer->Resolution().Height), GL_RG8, GL_RG, GL_UNSIGNED_BYTE); +} + +void PickingPass::InitializeFrameBuffers() +{ + glGenRenderbuffers(1, &m_DepthBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Renderer->Resolution().Width, m_Renderer->Resolution().Height); + + m_PickingBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); + m_PickingBuffer.AddResource(std::shared_ptr(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); + m_PickingBuffer.Generate(); +} + +void PickingPass::InitializeShaderPrograms() +{ + m_PickingProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Picking.vert.glsl"))); + m_PickingProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Picking.frag.glsl"))); + m_PickingProgram.Compile(); + m_PickingProgram.BindFragDataLocation(0, "TextureFragment"); + m_PickingProgram.Link(); +} + +void PickingPass::Draw(RenderQueueCollection& rq) +{ + m_PickingColorsToEntity.clear(); + m_PickingBuffer.Bind(); + PickingPassState state; + + int r = 1; + int g = 0; + //TODO: Render: Add code for more jobs than modeljobs. + + + GLuint ShaderHandle = m_PickingProgram.GetHandle(); + m_PickingProgram.Bind(); + + for (auto &job : rq.Forward) { + auto modelJob = std::dynamic_pointer_cast(job); + + if (modelJob) { + //--------------- + //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. + //--------------- + int pickColor[2] = { r, g }; + for (auto i : m_PickingColorsToEntity) { + if (modelJob->Entity == i.second) { + pickColor[0] = i.first.x; + pickColor[1] = i.first.y; + r -= 1; + } + } + m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; + + //Render picking stuff + //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_Renderer->Camera()->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix())); + glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); + + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, nullptr, modelJob->StartIndex); + r += 1; + if (r > 255) { + r = 0; + g += 1; + } + } + } + m_PickingBuffer.Unbind(); + GLERROR("PickingPass Error"); +} + +void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const +{ + //TODO: Renderer: Make this in a sparate class + glGenTextures(1, texture); + glBindTexture(GL_TEXTURE_2D, *texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapping); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapping); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, dimensions.x, dimensions.y, 0, format, type, nullptr);//TODO: Renderer: Fix the precision and Resolution + GLERROR("Texture initialization failed"); +} diff --git a/src/Engine/Rendering/PickingPassState.cpp b/src/Engine/Rendering/PickingPassState.cpp index 9822c47e..18f702ee 100644 --- a/src/Engine/Rendering/PickingPassState.cpp +++ b/src/Engine/Rendering/PickingPassState.cpp @@ -3,6 +3,7 @@ PickingPassState::PickingPassState() { + Enable(GL_DEPTH_TEST); Enable(GL_CULL_FACE); CullFace(GL_BACK); @@ -12,3 +13,7 @@ PickingPassState::PickingPassState() Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } +PickingPassState::~PickingPassState() +{ + +} diff --git a/src/Engine/Rendering/RenderState.cpp b/src/Engine/Rendering/RenderState.cpp index 6844dbfd..3db428e4 100644 --- a/src/Engine/Rendering/RenderState.cpp +++ b/src/Engine/Rendering/RenderState.cpp @@ -32,7 +32,7 @@ bool RenderState::CullFace(GLenum GLCullFace) glGetIntegerv(GL_CULL_FACE_MODE, &a); if(a == GL_BACK) { - LOG_INFO("Setting Cullface to back, unessesary since this is already default."); + //LOG_INFO("Setting Cullface to back, unessesary since this is already default."); } m_preCullFace = a; glCullFace(GLCullFace); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index c483cdc6..8316cfa7 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -11,6 +11,7 @@ void Renderer::Initialize() m_Camera = m_DefaultCamera; } TEMPCreateLights(); + InitializeRenderPasses(); glfwSwapInterval(m_VSYNC); InitializeShaders(); @@ -71,24 +72,18 @@ void Renderer::InitializeShaders() m_BasicForwardProgram.Compile(); m_BasicForwardProgram.Link(); - m_PickingProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Picking.vert.glsl"))); - m_PickingProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Picking.frag.glsl"))); - m_PickingProgram.Compile(); - m_PickingProgram.BindFragDataLocation(0, "TextureFragment"); - m_PickingProgram.Link(); - m_DrawScreenQuadProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/DrawScreenQuad.vert.glsl"))); m_DrawScreenQuadProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl"))); m_DrawScreenQuadProgram.Compile(); m_DrawScreenQuadProgram.Link(); - m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); - m_CalculateFrustumProgram.Compile(); - m_CalculateFrustumProgram.Link(); + //m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); + //m_CalculateFrustumProgram.Compile(); + //m_CalculateFrustumProgram.Link(); - m_LightCullProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); - m_LightCullProgram.Compile(); - m_LightCullProgram.Link(); + //m_LightCullProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); + //m_LightCullProgram.Compile(); + //m_LightCullProgram.Link(); } void Renderer::InputUpdate(double dt) @@ -125,26 +120,26 @@ void Renderer::InputUpdate(double dt) static double mousePosX, mousePosY; glfwGetCursorPos(m_Window, &mousePosX, &mousePosY); - if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) { - ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer); - - glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); - // glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f)); + //if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) { + // ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer); + // + // glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); + // // glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f)); - //printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth); - //printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos)); - //printf("\n\n---------------------------\n"); - auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); - if (got == m_PickingColorsToEntity.end()) - printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]); - else - printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second); - //printf("----\n"); - //for (auto i : m_PickingColorsToEntity) { - // printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g); - //} - //printf("---------------------------\n\n"); - } + // //printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth); + // //printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos)); + // //printf("\n\n---------------------------\n"); + // //auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); + // //if (got == m_PickingColorsToEntity.end()) + // // printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]); + // //else + // // printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second); + // //printf("----\n"); + // //for (auto i : m_PickingColorsToEntity) { + // // printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g); + // //} + // //printf("---------------------------\n\n"); + //} if (glfwGetKey(m_Window, GLFW_KEY_SPACE) == GLFW_PRESS) { @@ -177,8 +172,8 @@ void Renderer::Update(double dt) void Renderer::Draw(RenderQueueCollection& rq) { //TODO: Renderer: Kanske borde vara längst upp i update. - PickingPass(rq); - //DrawScreenQuad(m_PickingTexture); + m_PickingPass->Draw(rq); + //DrawScreenQuad(m_PickingPass->PickingTexture()); //CullLights(); DrawScene(rq); @@ -229,64 +224,63 @@ void Renderer::DrawScene(RenderQueueCollection& rq) GLERROR("DrawScene Error"); } -void Renderer::PickingPass(RenderQueueCollection& rq) -{ - m_PickingColorsToEntity.clear(); - m_PickingBuffer.Bind(); +//void Renderer::PickingPass(RenderQueueCollection& rq) +//{ + //m_PickingColorsToEntity.clear(); + //m_PickingBuffer.Bind(); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); + //glEnable(GL_DEPTH_TEST); + //glEnable(GL_CULL_FACE); + //glCullFace(GL_BACK); - glClearColor(0.f, 0.f, 0.f, 1.f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - int r = 1; - int g = 0; - //TODO: Render: Add code for more jobs than modeljobs. + //glClearColor(0.f, 0.f, 0.f, 1.f); + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + //int r = 1; + //int g = 0; + ////TODO: Render: Add code for more jobs than modeljobs. - GLuint ShaderHandle = m_PickingProgram.GetHandle(); - m_PickingProgram.Bind(); + //GLuint ShaderHandle = m_PickingProgram.GetHandle(); + //m_PickingProgram.Bind(); - for (auto &job : rq.Forward) { - auto modelJob = std::dynamic_pointer_cast(job); + //for (auto &job : rq.Forward) { + // auto modelJob = std::dynamic_pointer_cast(job); - if (modelJob) { - //--------------- - //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. - //--------------- - int pickColor[2] = { r, g }; - for (auto i : m_PickingColorsToEntity) { - if(modelJob->Entity == i.second) { - pickColor[0] = i.first.x; - pickColor[1] = i.first.y; - r -= 1; - } - } - m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; - + // if (modelJob) { + // //--------------- + // //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. + // //--------------- + // int pickColor[2] = { r, g }; + // for (auto i : m_PickingColorsToEntity) { + // if(modelJob->Entity == i.second) { + // pickColor[0] = i.first.x; + // pickColor[1] = i.first.y; + // r -= 1; + // } + // } + // m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; + // - //Render picking stuff - //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())); - glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); + // //Render picking stuff + // //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())); + // glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); - 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); - r += 1; - if(r > 255) { - r = 0; - g += 1; - } - } - } - m_PickingBuffer.Unbind(); - GLERROR("PickingPass Error"); - -} + // 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); + // r += 1; + // if(r > 255) { + // r = 0; + // g += 1; + // } + // } + //} + //m_PickingBuffer.Unbind(); + //GLERROR("PickingPass Error"); +//} void Renderer::DrawScreenQuad(GLuint textureToDraw) { @@ -323,9 +317,6 @@ void Renderer::InitializeTextures() glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, m_Resolution.Width, m_Resolution.Height, 0, GL_RG, GL_FLOAT, NULL);//TODO: Renderer: Fix the precision and Resolution GLERROR("m_PickingTexture initialization failed"); */ - - GenerateTexture(&m_PickingTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, - glm::vec2(m_Resolution.Width, m_Resolution.Height), GL_RG8, GL_RG, GL_UNSIGNED_BYTE); } void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) @@ -342,13 +333,13 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better location, as its really big { - glGenRenderbuffers(1, &m_DepthBuffer); - glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height); - - m_PickingBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); - m_PickingBuffer.AddResource(std::shared_ptr(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); - m_PickingBuffer.Generate(); + //glGenRenderbuffers(1, &m_DepthBuffer); + //glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); + //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height); + // + //m_PickingBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); + //m_PickingBuffer.AddResource(std::shared_ptr(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); + //m_PickingBuffer.Generate(); } void Renderer::InitializeSSBOs() @@ -399,6 +390,11 @@ void Renderer::InitializeSSBOs() } +void Renderer::InitializeRenderPasses() +{ + m_PickingPass = new PickingPass(this); +} + void Renderer::CalculateFrustum() { GLERROR("CalculateFrustum Error-1"); From 725a8896ceee6d6941a1130a60e869aa4454fecf Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Dec 2015 13:51:08 +0100 Subject: [PATCH 07/12] PickingPass now publishes an event that others can listen to to get pickingdata. --- include/Engine/Rendering/PickingPass.h | 6 +++++- src/Engine/Rendering/PickingPass.cpp | 15 ++++++++++++++- src/Engine/Rendering/Renderer.cpp | 12 +----------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h index 313751d5..78c195a5 100644 --- a/include/Engine/Rendering/PickingPass.h +++ b/include/Engine/Rendering/PickingPass.h @@ -6,11 +6,13 @@ #include "FrameBuffer.h" #include "ShaderProgram.h" #include "Util/UnorderedMapVec2.h" +#include "../Core/EventBroker.h" +#include "EPicking.h" class PickingPass { public: - PickingPass(IRenderer* renderer); + PickingPass(IRenderer* renderer, EventBroker* eb); ~PickingPass(); void InitializeTextures(); void InitializeFrameBuffers(); @@ -30,6 +32,8 @@ public: private: void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; + EventBroker* m_EventBroker; + const IRenderer* m_Renderer; ShaderProgram m_PickingProgram; diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index 5b44cbf4..e254f379 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -1,8 +1,10 @@ #include "Rendering/PickingPass.h" -PickingPass::PickingPass(IRenderer* renderer) +PickingPass::PickingPass(IRenderer* renderer, EventBroker* eb) { m_Renderer = renderer; + m_EventBroker = eb; + InitializeTextures(); InitializeFrameBuffers(); InitializeShaderPrograms(); @@ -89,6 +91,17 @@ void PickingPass::Draw(RenderQueueCollection& rq) } m_PickingBuffer.Unbind(); GLERROR("PickingPass Error"); + + //Publish pick event every frame with the pick data that can be picked by the event + Events::Picking pickEvent = Events::Picking( + &m_PickingBuffer, + &m_DepthBuffer, + m_Renderer->Camera()->ProjectionMatrix(), + m_Renderer->Camera()->ViewMatrix(), + m_Renderer->Resolution(), + &m_PickingColorsToEntity); + + m_EventBroker->Publish(pickEvent); } void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index a3331414..b479acaf 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -263,16 +263,6 @@ void Renderer::DrawScene(RenderQueueCollection& rq) //m_PickingBuffer.Unbind(); //GLERROR("PickingPass Error"); - //Publish pick event every frame with the pick data that can be picked by the event - Events::Picking pickEvent = Events::Picking( - &m_PickingBuffer, - &m_DepthBuffer, - m_Camera->ProjectionMatrix(), - m_Camera->ViewMatrix(), - m_Resolution, - &m_PickingColorsToEntity); - - m_EventBroker->Publish(pickEvent); void Renderer::DrawScreenQuad(GLuint textureToDraw) { @@ -384,7 +374,7 @@ void Renderer::InitializeSSBOs() void Renderer::InitializeRenderPasses() { - m_PickingPass = new PickingPass(this); + m_PickingPass = new PickingPass(this, m_EventBroker); } void Renderer::CalculateFrustum() From 433331e752dd30357f6c29107cce01cebb364e02 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Dec 2015 14:22:54 +0100 Subject: [PATCH 08/12] DrawPass now moved to it's own class to make renderer cleaner. --- include/Engine/Rendering/DrawScenePass.h | 36 +++++++++ include/Engine/Rendering/DrawScenePassState.h | 15 ++++ include/Engine/Rendering/Renderer.h | 2 + src/Engine/Rendering/DrawScenePass.cpp | 61 +++++++++++++++ src/Engine/Rendering/DrawScenePassState.cpp | 16 ++++ src/Engine/Rendering/Renderer.cpp | 75 +------------------ 6 files changed, 133 insertions(+), 72 deletions(-) create mode 100644 include/Engine/Rendering/DrawScenePass.h create mode 100644 include/Engine/Rendering/DrawScenePassState.h create mode 100644 src/Engine/Rendering/DrawScenePass.cpp create mode 100644 src/Engine/Rendering/DrawScenePassState.cpp diff --git a/include/Engine/Rendering/DrawScenePass.h b/include/Engine/Rendering/DrawScenePass.h new file mode 100644 index 00000000..16ad224f --- /dev/null +++ b/include/Engine/Rendering/DrawScenePass.h @@ -0,0 +1,36 @@ +#ifndef DrawScenePass_h__ +#define DrawScenePass_h__ + +#include "IRenderer.h" +#include "DrawScenePassState.h" +#include "FrameBuffer.h" +#include "ShaderProgram.h" +#include "Util/UnorderedMapVec2.h" +#include "Texture.h" + +class DrawScenePass +{ +public: + DrawScenePass(IRenderer* renderer); + ~DrawScenePass() { } + 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; + + ShaderProgram m_BasicForwardProgram; + +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/DrawScenePassState.h b/include/Engine/Rendering/DrawScenePassState.h new file mode 100644 index 00000000..7ce74006 --- /dev/null +++ b/include/Engine/Rendering/DrawScenePassState.h @@ -0,0 +1,15 @@ +#ifndef DrawScenePassState_h__ +#define DrawScenePassState_h__ + +#include "Rendering/RenderState.h" + +class DrawScenePassState : public RenderState +{ +public: + DrawScenePassState(); + ~DrawScenePassState(); +private: + +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b9ad0d07..a3cb345a 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -11,6 +11,7 @@ #include "FrameBuffer.h" #include "../Core/World.h" #include "PickingPass.h" +#include "DrawScenePass.h" #define TILE_SIZE 16 @@ -52,6 +53,7 @@ private: Model* m_UnitSphere; PickingPass* m_PickingPass; + DrawScenePass* m_DrawScenePass; //----------------------Functions----------------------// void InitializeWindow(); diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp new file mode 100644 index 00000000..210b62f6 --- /dev/null +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -0,0 +1,61 @@ +#include "Rendering/DrawScenePass.h" + +DrawScenePass::DrawScenePass(IRenderer* renderer) +{ + m_Renderer = renderer; + InitializeTextures(); + InitializeShaderPrograms(); +} + +void DrawScenePass::InitializeTextures() +{ + m_WhiteTexture = ResourceManager::Load("Textures/Core/Blank.png"); + +} + +void DrawScenePass::InitializeShaderPrograms() +{ + //Gör så att shaders är en resource, tex som texture classen. Konstruktorn måste vara privat. + m_BasicForwardProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/BasicForward.vert.glsl"))); + m_BasicForwardProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/BasicForward.frag.glsl"))); + m_BasicForwardProgram.Compile(); + m_BasicForwardProgram.Link(); +} + +void DrawScenePass::Draw(RenderQueueCollection& rq) +{ + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + DrawScenePassState state; + + //TODO: Render: Add code for more jobs than modeljobs. + for (auto &job : rq.Forward) { + auto modelJob = std::dynamic_pointer_cast(job); + if (modelJob) { + GLuint ShaderHandle = m_BasicForwardProgram.GetHandle(); + + m_BasicForwardProgram.Bind(); + //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_Renderer->Camera()->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->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("DrawScene Error"); +} diff --git a/src/Engine/Rendering/DrawScenePassState.cpp b/src/Engine/Rendering/DrawScenePassState.cpp new file mode 100644 index 00000000..e0fb706f --- /dev/null +++ b/src/Engine/Rendering/DrawScenePassState.cpp @@ -0,0 +1,16 @@ +#include "Rendering/DrawScenePassState.h" + + +DrawScenePassState::DrawScenePassState() +{ + Enable(GL_DEPTH_TEST); + Enable(GL_CULL_FACE); + CullFace(GL_BACK); + ClearColor(glm::vec4(255.f / 255, 163.f / 255, 176.f / 255, 0.f)); + Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} + +DrawScenePassState::~DrawScenePassState() +{ + +} diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index b479acaf..634f66db 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -116,11 +116,8 @@ void Renderer::InputUpdate(double dt) m_CameraMoveSpeed = 0.5f; } - static double mousePosX, mousePosY; glfwGetCursorPos(m_Window, &mousePosX, &mousePosY); - // //} - // //printf("---------------------------\n\n"); if (glfwGetKey(m_Window, GLFW_KEY_SPACE) == GLFW_PRESS) { @@ -158,7 +155,8 @@ void Renderer::Draw(RenderQueueCollection& rq) //DrawScreenQuad(m_PickingPass->PickingTexture()); //CullLights(); - DrawScene(rq); + //DrawScene(rq); + m_DrawScenePass->Draw(rq); glfwSwapBuffers(m_Window); } @@ -206,64 +204,6 @@ void Renderer::DrawScene(RenderQueueCollection& rq) GLERROR("DrawScene Error"); } -//void Renderer::PickingPass(RenderQueueCollection& rq) -//{ - //m_PickingColorsToEntity.clear(); - //m_PickingBuffer.Bind(); - - //glEnable(GL_DEPTH_TEST); - //glEnable(GL_CULL_FACE); - //glCullFace(GL_BACK); - - //glClearColor(0.f, 0.f, 0.f, 1.f); - //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - //int r = 1; - //int g = 0; - ////TODO: Render: Add code for more jobs than modeljobs. - - - //GLuint ShaderHandle = m_PickingProgram.GetHandle(); - //m_PickingProgram.Bind(); - - //for (auto &job : rq.Forward) { - // auto modelJob = std::dynamic_pointer_cast(job); - - // if (modelJob) { - // //--------------- - // //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. - // //--------------- - // int pickColor[2] = { r, g }; - // for (auto i : m_PickingColorsToEntity) { - // if(modelJob->Entity == i.second) { - // pickColor[0] = i.first.x; - // pickColor[1] = i.first.y; - // r -= 1; - // } - // } - // m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; - // - - // //Render picking stuff - // //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())); - // glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); - - // 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); - // r += 1; - // if(r > 255) { - // r = 0; - // g += 1; - // } - // } - //} - //m_PickingBuffer.Unbind(); - //GLERROR("PickingPass Error"); - - void Renderer::DrawScreenQuad(GLuint textureToDraw) { glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -289,16 +229,6 @@ void Renderer::InitializeTextures() { m_ErrorTexture=ResourceManager::Load("Textures/Core/ErrorTexture.png"); m_WhiteTexture=ResourceManager::Load("Textures/Core/Blank.png"); - /* - glGenTextures(1, &m_PickingTexture); - glBindTexture(GL_TEXTURE_2D, m_PickingTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, m_Resolution.Width, m_Resolution.Height, 0, GL_RG, GL_FLOAT, NULL);//TODO: Renderer: Fix the precision and Resolution - GLERROR("m_PickingTexture initialization failed"); - */ } void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) @@ -375,6 +305,7 @@ void Renderer::InitializeSSBOs() void Renderer::InitializeRenderPasses() { m_PickingPass = new PickingPass(this, m_EventBroker); + m_DrawScenePass = new DrawScenePass(this); } void Renderer::CalculateFrustum() From 53d57364207cc7eaa1b3a73ed6a59f24cdbcbd38 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Dec 2015 16:07:12 +0100 Subject: [PATCH 09/12] Fixed a bugg with RenderState. Renderstate now also handles the Frambuffer binding. --- include/Engine/Rendering/PickingPassState.h | 4 +- include/Engine/Rendering/RenderState.h | 3 +- include/Engine/Rendering/Renderer.h | 2 +- src/Engine/Rendering/DrawScenePass.cpp | 5 +- src/Engine/Rendering/DrawScenePassState.cpp | 4 +- src/Engine/Rendering/PickingPass.cpp | 4 +- src/Engine/Rendering/PickingPassState.cpp | 7 +- src/Engine/Rendering/RenderState.cpp | 38 ++++++++- src/Engine/Rendering/Renderer.cpp | 93 +++++++++++---------- src/Game/Game.cpp | 3 +- 10 files changed, 100 insertions(+), 63 deletions(-) diff --git a/include/Engine/Rendering/PickingPassState.h b/include/Engine/Rendering/PickingPassState.h index 5902f9dc..4f6bfe40 100644 --- a/include/Engine/Rendering/PickingPassState.h +++ b/include/Engine/Rendering/PickingPassState.h @@ -6,10 +6,10 @@ class PickingPassState : public RenderState { public: - PickingPassState(); + PickingPassState(GLuint frameBuffer); ~PickingPassState(); -private: +private: }; #endif \ No newline at end of file diff --git a/include/Engine/Rendering/RenderState.h b/include/Engine/Rendering/RenderState.h index 76816308..e7ba2f80 100644 --- a/include/Engine/Rendering/RenderState.h +++ b/include/Engine/Rendering/RenderState.h @@ -14,9 +14,10 @@ public: bool CullFace(GLenum GlFaceToCull); bool ClearColor(glm::vec4 color); bool Clear(GLbitfield mask); + bool BindBuffer(GLint buffer); private: std::vector m_Enables; float m_preClearColor[4]; - GLenum m_preCullFace; + int m_preBuffer; }; #endif \ No newline at end of file diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index a3cb345a..5ab10e2f 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -52,8 +52,8 @@ private: Model* m_UnitQuad; Model* m_UnitSphere; - PickingPass* m_PickingPass; DrawScenePass* m_DrawScenePass; + PickingPass* m_PickingPass; //----------------------Functions----------------------// void InitializeWindow(); diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index 210b62f6..c780af1a 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -10,7 +10,6 @@ DrawScenePass::DrawScenePass(IRenderer* renderer) void DrawScenePass::InitializeTextures() { m_WhiteTexture = ResourceManager::Load("Textures/Core/Blank.png"); - } void DrawScenePass::InitializeShaderPrograms() @@ -24,10 +23,12 @@ void DrawScenePass::InitializeShaderPrograms() void DrawScenePass::Draw(RenderQueueCollection& rq) { - glBindFramebuffer(GL_FRAMEBUFFER, 0); + //glBindFramebuffer(GL_FRAMEBUFFER, 0); + GLERROR("Renderer::Draw PickingPass"); DrawScenePassState state; + //TODO: Render: Add code for more jobs than modeljobs. for (auto &job : rq.Forward) { auto modelJob = std::dynamic_pointer_cast(job); diff --git a/src/Engine/Rendering/DrawScenePassState.cpp b/src/Engine/Rendering/DrawScenePassState.cpp index e0fb706f..59654775 100644 --- a/src/Engine/Rendering/DrawScenePassState.cpp +++ b/src/Engine/Rendering/DrawScenePassState.cpp @@ -3,9 +3,11 @@ DrawScenePassState::DrawScenePassState() { + GLERROR("---"); + BindBuffer(0); + GLERROR("---"); Enable(GL_DEPTH_TEST); Enable(GL_CULL_FACE); - CullFace(GL_BACK); ClearColor(glm::vec4(255.f / 255, 163.f / 255, 176.f / 255, 0.f)); Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index e254f379..6c4510f8 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -44,14 +44,12 @@ void PickingPass::InitializeShaderPrograms() void PickingPass::Draw(RenderQueueCollection& rq) { m_PickingColorsToEntity.clear(); - m_PickingBuffer.Bind(); - PickingPassState state; + PickingPassState* state = new PickingPassState(m_PickingBuffer.GetHandle()); int r = 1; int g = 0; //TODO: Render: Add code for more jobs than modeljobs. - GLuint ShaderHandle = m_PickingProgram.GetHandle(); m_PickingProgram.Bind(); diff --git a/src/Engine/Rendering/PickingPassState.cpp b/src/Engine/Rendering/PickingPassState.cpp index 18f702ee..a52fa546 100644 --- a/src/Engine/Rendering/PickingPassState.cpp +++ b/src/Engine/Rendering/PickingPassState.cpp @@ -1,12 +1,13 @@ #include "Rendering/PickingPassState.h" -PickingPassState::PickingPassState() +PickingPassState::PickingPassState(GLuint frameBuffer) { - + GLERROR("---2"); + BindBuffer(frameBuffer); + GLERROR("---3"); Enable(GL_DEPTH_TEST); Enable(GL_CULL_FACE); - CullFace(GL_BACK); glm::vec4 clearColor = glm::vec4(0.f); ClearColor(clearColor); diff --git a/src/Engine/Rendering/RenderState.cpp b/src/Engine/Rendering/RenderState.cpp index 3db428e4..87f4a30d 100644 --- a/src/Engine/Rendering/RenderState.cpp +++ b/src/Engine/Rendering/RenderState.cpp @@ -2,6 +2,7 @@ RenderState::RenderState() { + } bool RenderState::Enable(GLenum GLEnable) @@ -30,12 +31,11 @@ bool RenderState::CullFace(GLenum GLCullFace) GLint a; glGetIntegerv(GL_CULL_FACE_MODE, &a); - if(a == GL_BACK) + if(a != GL_BACK) { //LOG_INFO("Setting Cullface to back, unessesary since this is already default."); + glCullFace(GLCullFace); } - m_preCullFace = a; - glCullFace(GLCullFace); if (GLERROR("RenderState::CullFace")) { return false; @@ -62,20 +62,50 @@ bool RenderState::Clear(GLbitfield mask) return true; } +bool RenderState::BindBuffer(GLint buffer) +{ + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &m_preBuffer); + if (buffer == m_preBuffer) + { + return true; + } + glBindFramebuffer(GL_FRAMEBUFFER, buffer); + if (GLERROR("RenderState::BindBuffer")) + { + printf("BufferID: %i\npreBufferID: %i\n", buffer, m_preBuffer); + return false; + } + return true; +} + RenderState::~RenderState() { + GLERROR("RenderState::~RenderState Pre"); + GLint n_buffer = -1; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &n_buffer); + //Set cullface to default - glCullFace(m_preCullFace); + if (glIsEnabled(GL_CULL_FACE)) { + glCullFace(GL_BACK); + } + GLERROR("RenderState::~RenderState glCullFace"); //Set color to default glClearColor(m_preClearColor[0], m_preClearColor[1], m_preClearColor[2], m_preClearColor[3]); + GLERROR("RenderState::~RenderState glClearColor"); //Disable Enables for (auto i : m_Enables) { glDisable(i); } + GLERROR("RenderState::~RenderState glDisable"); + if(m_preBuffer != 0) + { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } m_Enables.clear(); + GLERROR("RenderState::~RenderState glBindFramebuffer"); } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 634f66db..7e58728c 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -151,58 +151,61 @@ void Renderer::Update(double dt) void Renderer::Draw(RenderQueueCollection& rq) { //TODO: Renderer: Kanske borde vara längst upp i update. + GLERROR("Renderer::Draw Pre"); m_PickingPass->Draw(rq); + GLERROR("Renderer::Draw PickingPass"); //DrawScreenQuad(m_PickingPass->PickingTexture()); //CullLights(); //DrawScene(rq); m_DrawScenePass->Draw(rq); + GLERROR("Renderer::Draw m_DrawScenePass->Draw"); glfwSwapBuffers(m_Window); } - -void Renderer::DrawScene(RenderQueueCollection& rq) -{ - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - //TODO: Render: Clean up draw code - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - - glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 0.f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //TODO: Render: Add code for more jobs than modeljobs. - for (auto &job : rq.Forward) { - auto modelJob = std::dynamic_pointer_cast(job); - if (modelJob) { - GLuint ShaderHandle = m_BasicForwardProgram.GetHandle(); - - m_BasicForwardProgram.Bind(); - //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("DrawScene Error"); -} +// +//void Renderer::DrawScene(RenderQueueCollection& rq) +//{ +// glBindFramebuffer(GL_FRAMEBUFFER, 0); +// +// //TODO: Render: Clean up draw code +// glEnable(GL_DEPTH_TEST); +// glEnable(GL_CULL_FACE); +// glCullFace(GL_BACK); +// +// glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 0.f); +// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +// +// //TODO: Render: Add code for more jobs than modeljobs. +// for (auto &job : rq.Forward) { +// auto modelJob = std::dynamic_pointer_cast(job); +// if (modelJob) { +// GLuint ShaderHandle = m_BasicForwardProgram.GetHandle(); +// +// m_BasicForwardProgram.Bind(); +// //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("DrawScene Error"); +//} void Renderer::DrawScreenQuad(GLuint textureToDraw) { @@ -304,8 +307,8 @@ void Renderer::InitializeSSBOs() void Renderer::InitializeRenderPasses() { - m_PickingPass = new PickingPass(this, m_EventBroker); m_DrawScenePass = new DrawScenePass(this); + m_PickingPass = new PickingPass(this, m_EventBroker); } void Renderer::CalculateFrustum() diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index bff6aebc..1ebfd72a 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -73,8 +73,9 @@ void Game::Tick() m_Renderer->Update(dt); m_RenderQueueFactory->Update(m_World); + GLERROR("Game::Tick m_RenderQueueFactory->Update"); m_Renderer->Draw(m_RenderQueueFactory->RenderQueues()); - + GLERROR("Game::Tick m_Renderer->Draw"); m_EventBroker->Swap(); m_EventBroker->Clear(); From 45b87ed6b1eb91a1f4eb92772d34c53d8f5465b6 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Dec 2015 16:53:46 +0100 Subject: [PATCH 10/12] ShaderProgram is now a Resource. All shaderprograms are now pointers and loaded with Resourcemanager. --- include/Engine/Rendering/DrawScenePass.h | 2 +- include/Engine/Rendering/PickingPass.h | 4 ++-- include/Engine/Rendering/Renderer.h | 8 ++++---- include/Engine/Rendering/ShaderProgram.h | 9 ++++++--- src/Engine/Rendering/DrawScenePass.cpp | 16 +++++++++------ src/Engine/Rendering/PickingPass.cpp | 16 ++++++++------- src/Engine/Rendering/Renderer.cpp | 25 ++++++++++++------------ src/Game/Game.cpp | 1 + 8 files changed, 45 insertions(+), 36 deletions(-) diff --git a/include/Engine/Rendering/DrawScenePass.h b/include/Engine/Rendering/DrawScenePass.h index 16ad224f..782c5a49 100644 --- a/include/Engine/Rendering/DrawScenePass.h +++ b/include/Engine/Rendering/DrawScenePass.h @@ -29,7 +29,7 @@ private: const IRenderer* m_Renderer; - ShaderProgram m_BasicForwardProgram; + ShaderProgram* m_BasicForwardProgram; }; diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h index 78c195a5..e1bc42db 100644 --- a/include/Engine/Rendering/PickingPass.h +++ b/include/Engine/Rendering/PickingPass.h @@ -22,7 +22,7 @@ public: //Getters - const ShaderProgram& PickingProgram() const { return m_PickingProgram; } + const ShaderProgram& PickingProgram() const { return *m_PickingProgram; } const std::unordered_map& PickingColorsToEntity() const { return m_PickingColorsToEntity; } GLuint PickingTexture() const { return m_PickingTexture; } GLuint DepthBuffer() const { return m_DepthBuffer; } @@ -36,7 +36,7 @@ private: const IRenderer* m_Renderer; - ShaderProgram m_PickingProgram; + ShaderProgram* m_PickingProgram; std::unordered_map m_PickingColorsToEntity; diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 5ab10e2f..51a3c82d 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -114,10 +114,10 @@ private: void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// - ShaderProgram m_BasicForwardProgram; - ShaderProgram m_DrawScreenQuadProgram; - ShaderProgram m_CalculateFrustumProgram; - ShaderProgram m_LightCullProgram; + ShaderProgram* m_BasicForwardProgram; + ShaderProgram* m_DrawScreenQuadProgram; + ShaderProgram* m_CalculateFrustumProgram; + ShaderProgram* m_LightCullProgram; }; diff --git a/include/Engine/Rendering/ShaderProgram.h b/include/Engine/Rendering/ShaderProgram.h index 097e09c3..ad01c029 100644 --- a/include/Engine/Rendering/ShaderProgram.h +++ b/include/Engine/Rendering/ShaderProgram.h @@ -3,6 +3,7 @@ #include "../Common.h" #include "../OpenGL.h" +#include "../Core/ResourceManager.h" #include class Shader @@ -62,11 +63,13 @@ public: : ShaderType(fileName) { } }; -class ShaderProgram +class ShaderProgram : public Resource { -public: - ShaderProgram() + friend class ResourceManager; +private: + ShaderProgram(std::string) : m_ShaderProgramHandle(0) { } +public: ~ShaderProgram(); void AddShader(std::shared_ptr shader); diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index c780af1a..559a0f58 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -15,10 +15,14 @@ void DrawScenePass::InitializeTextures() void DrawScenePass::InitializeShaderPrograms() { //Gör så att shaders är en resource, tex som texture classen. Konstruktorn måste vara privat. - m_BasicForwardProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/BasicForward.vert.glsl"))); - m_BasicForwardProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/BasicForward.frag.glsl"))); - m_BasicForwardProgram.Compile(); - m_BasicForwardProgram.Link(); + m_BasicForwardProgram = ResourceManager::Load("#BasicForwardProgram"); + + m_BasicForwardProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/BasicForward.vert.glsl"))); + m_BasicForwardProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/BasicForward.frag.glsl"))); + m_BasicForwardProgram->Compile(); + m_BasicForwardProgram->Link(); + + } void DrawScenePass::Draw(RenderQueueCollection& rq) @@ -33,9 +37,9 @@ void DrawScenePass::Draw(RenderQueueCollection& rq) for (auto &job : rq.Forward) { auto modelJob = std::dynamic_pointer_cast(job); if (modelJob) { - GLuint ShaderHandle = m_BasicForwardProgram.GetHandle(); + GLuint ShaderHandle = m_BasicForwardProgram->GetHandle(); - m_BasicForwardProgram.Bind(); + m_BasicForwardProgram->Bind(); //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_Renderer->Camera()->ViewMatrix())); diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index 6c4510f8..7d4cb66f 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -34,11 +34,13 @@ void PickingPass::InitializeFrameBuffers() void PickingPass::InitializeShaderPrograms() { - m_PickingProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Picking.vert.glsl"))); - m_PickingProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Picking.frag.glsl"))); - m_PickingProgram.Compile(); - m_PickingProgram.BindFragDataLocation(0, "TextureFragment"); - m_PickingProgram.Link(); + m_PickingProgram = ResourceManager::Load("#PickingProgram"); + + m_PickingProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/Picking.vert.glsl"))); + m_PickingProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/Picking.frag.glsl"))); + m_PickingProgram->Compile(); + m_PickingProgram->BindFragDataLocation(0, "TextureFragment"); + m_PickingProgram->Link(); } void PickingPass::Draw(RenderQueueCollection& rq) @@ -50,8 +52,8 @@ void PickingPass::Draw(RenderQueueCollection& rq) int g = 0; //TODO: Render: Add code for more jobs than modeljobs. - GLuint ShaderHandle = m_PickingProgram.GetHandle(); - m_PickingProgram.Bind(); + GLuint ShaderHandle = m_PickingProgram->GetHandle(); + m_PickingProgram->Bind(); for (auto &job : rq.Forward) { auto modelJob = std::dynamic_pointer_cast(job); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 7e58728c..7f3e0166 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -66,15 +66,14 @@ void Renderer::InitializeWindow() void Renderer::InitializeShaders() { - m_BasicForwardProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/BasicForward.vert.glsl"))); - m_BasicForwardProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/BasicForward.frag.glsl"))); - m_BasicForwardProgram.Compile(); - m_BasicForwardProgram.Link(); + m_BasicForwardProgram = ResourceManager::Load("#m_BasicForwardProgram"); - m_DrawScreenQuadProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/DrawScreenQuad.vert.glsl"))); - m_DrawScreenQuadProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl"))); - m_DrawScreenQuadProgram.Compile(); - m_DrawScreenQuadProgram.Link(); + m_DrawScreenQuadProgram = ResourceManager::Load("#DrawScreenQuadProgram"); + + m_DrawScreenQuadProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/DrawScreenQuad.vert.glsl"))); + m_DrawScreenQuadProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl"))); + m_DrawScreenQuadProgram->Compile(); + m_DrawScreenQuadProgram->Link(); //m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); //m_CalculateFrustumProgram.Compile(); @@ -218,7 +217,7 @@ void Renderer::DrawScreenQuad(GLuint textureToDraw) glClear(GL_COLOR_BUFFER_BIT); - m_DrawScreenQuadProgram.Bind(); + m_DrawScreenQuadProgram->Bind(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureToDraw); @@ -314,14 +313,14 @@ void Renderer::InitializeRenderPasses() void Renderer::CalculateFrustum() { GLERROR("CalculateFrustum Error-1"); - m_CalculateFrustumProgram.Bind(); + m_CalculateFrustumProgram->Bind(); GLERROR("CalculateFrustum Error1"); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); GLERROR("CalculateFrustum Error2"); - glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix())); + glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix())); GLERROR("CalculateFrustum Error3"); - glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height); + glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height); GLERROR("CalculateFrustum Error4"); glDispatchCompute(5, 3, 1); GLERROR("CalculateFrustum Error5"); @@ -338,7 +337,7 @@ void Renderer::TEMPCreateLights() void Renderer::CullLights() { - m_LightCullProgram.Bind(); + m_LightCullProgram->Bind(); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 1ebfd72a..318d21b3 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -6,6 +6,7 @@ Game::Game(int argc, char* argv[]) ResourceManager::RegisterType("Model"); ResourceManager::RegisterType("Texture"); ResourceManager::RegisterType("EntityXMLFile"); + ResourceManager::RegisterType("ShaderProgram"); m_Config = ResourceManager::Load("Config.ini"); LOG_LEVEL = static_cast<_LOG_LEVEL>(m_Config->Get("Debug.LogLevel", 1)); From 59b261534ad35fd4c329e7b40e10ebcbe12b945b Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Dec 2015 16:57:02 +0100 Subject: [PATCH 11/12] Cleaned some comments and random annoyances in Renderer --- src/Engine/Rendering/Renderer.cpp | 63 +------------------------------ 1 file changed, 2 insertions(+), 61 deletions(-) diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 7f3e0166..42ec9018 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -69,16 +69,17 @@ void Renderer::InitializeShaders() m_BasicForwardProgram = ResourceManager::Load("#m_BasicForwardProgram"); m_DrawScreenQuadProgram = ResourceManager::Load("#DrawScreenQuadProgram"); - m_DrawScreenQuadProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/DrawScreenQuad.vert.glsl"))); m_DrawScreenQuadProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl"))); m_DrawScreenQuadProgram->Compile(); m_DrawScreenQuadProgram->Link(); + //m_CalculateFrustumProgram = ResourceManager::Load("#CalculateFrustumProgram"); //m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); //m_CalculateFrustumProgram.Compile(); //m_CalculateFrustumProgram.Link(); + //m_LightCullProgram = ResourceManager::Load("#LightCullProgram"); //m_LightCullProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); //m_LightCullProgram.Compile(); //m_LightCullProgram.Link(); @@ -144,67 +145,18 @@ void Renderer::Update(double dt) { m_EventBroker->Process(); InputUpdate(dt); - } void Renderer::Draw(RenderQueueCollection& rq) { - //TODO: Renderer: Kanske borde vara längst upp i update. - GLERROR("Renderer::Draw Pre"); m_PickingPass->Draw(rq); - GLERROR("Renderer::Draw PickingPass"); //DrawScreenQuad(m_PickingPass->PickingTexture()); //CullLights(); - //DrawScene(rq); m_DrawScenePass->Draw(rq); GLERROR("Renderer::Draw m_DrawScenePass->Draw"); glfwSwapBuffers(m_Window); } -// -//void Renderer::DrawScene(RenderQueueCollection& rq) -//{ -// glBindFramebuffer(GL_FRAMEBUFFER, 0); -// -// //TODO: Render: Clean up draw code -// glEnable(GL_DEPTH_TEST); -// glEnable(GL_CULL_FACE); -// glCullFace(GL_BACK); -// -// glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 0.f); -// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -// -// //TODO: Render: Add code for more jobs than modeljobs. -// for (auto &job : rq.Forward) { -// auto modelJob = std::dynamic_pointer_cast(job); -// if (modelJob) { -// GLuint ShaderHandle = m_BasicForwardProgram.GetHandle(); -// -// m_BasicForwardProgram.Bind(); -// //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("DrawScene Error"); -//} void Renderer::DrawScreenQuad(GLuint textureToDraw) { @@ -245,17 +197,6 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin GLERROR("Texture initialization failed"); } -void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better location, as its really big -{ - //glGenRenderbuffers(1, &m_DepthBuffer); - //glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); - //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height); - // - //m_PickingBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); - //m_PickingBuffer.AddResource(std::shared_ptr(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); - //m_PickingBuffer.Generate(); -} - void Renderer::InitializeSSBOs() { printf("Size: %i\n", sizeof(m_Frustums)); From d406059c79ab5e4c5eab05ea4a6fa9425f69a5d6 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Dec 2015 17:00:06 +0100 Subject: [PATCH 12/12] Small bugfix. --- include/Engine/Rendering/Renderer.h | 2 -- src/Engine/Rendering/Renderer.cpp | 1 - 2 files changed, 3 deletions(-) diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 51a3c82d..886c98ca 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -59,14 +59,12 @@ private: void InitializeWindow(); void InitializeShaders(); void InitializeTextures(); - void InitializeFrameBuffers(); void InitializeSSBOs(); void InitializeRenderPasses(); //TODO: Renderer: Get InputUpdate out of renderer void InputUpdate(double dt); //void PickingPass(RenderQueueCollection& rq); void DrawScreenQuad(GLuint textureToDraw); - void DrawScene(RenderQueueCollection& rq); //----------------------Forward+-----------------------// void CalculateFrustum(); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 42ec9018..f4897223 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -15,7 +15,6 @@ void Renderer::Initialize() glfwSwapInterval(m_VSYNC); InitializeShaders(); InitializeTextures(); - InitializeFrameBuffers(); InitializeSSBOs(); //CalculateFrustum();