From 7c714d1f985f80be5696be6802469757b8b4fe29 Mon Sep 17 00:00:00 2001 From: Tleety Date: Mon, 14 Dec 2015 17:35:01 +0100 Subject: [PATCH 01/18] Changed some error handling in the RenderState class. --- src/Engine/Rendering/RenderState.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Engine/Rendering/RenderState.cpp b/src/Engine/Rendering/RenderState.cpp index 87f4a30d..2d183b32 100644 --- a/src/Engine/Rendering/RenderState.cpp +++ b/src/Engine/Rendering/RenderState.cpp @@ -9,7 +9,7 @@ bool RenderState::Enable(GLenum GLEnable) { if(glIsEnabled(GLEnable)) { - LOG_WARNING("Trying to enable somthing that is already enabled."); + //LOG_WARNING("Trying to enable somthing that is already enabled."); return false; } m_Enables.push_back(GLEnable); @@ -25,17 +25,11 @@ bool RenderState::CullFace(GLenum GLCullFace) { if(!glIsEnabled(GL_CULL_FACE)) { - LOG_ERROR("Setting GL_CULL_FACE without enabling it."); - return false; + //LOG_ERROR("Setting GL_CULL_FACE without enabling it."); + Enable(GL_CULL_FACE); } - GLint a; - glGetIntegerv(GL_CULL_FACE_MODE, &a); - if(a != GL_BACK) - { - //LOG_INFO("Setting Cullface to back, unessesary since this is already default."); - glCullFace(GLCullFace); - } + glCullFace(GLCullFace); if (GLERROR("RenderState::CullFace")) { return false; From 1e370bac1337ce7db71e647adc6f1e0c255ee468 Mon Sep 17 00:00:00 2001 From: Tleety Date: Tue, 15 Dec 2015 15:28:37 +0100 Subject: [PATCH 02/18] ForwardPlus base debug commit. --- include/Engine/Rendering/Renderer.h | 2 + resources/Shaders/ForwardPlus.frag.glsl | 124 ++++++++++++++++++++++ resources/Shaders/ForwardPlus.vert.glsl | 34 +++++++ resources/Shaders/cullLights.comp.glsl | 130 ++++++++++++++++++++++-- src/Engine/Rendering/DrawScenePass.cpp | 6 +- src/Engine/Rendering/Renderer.cpp | 92 +++++++++++++---- 6 files changed, 359 insertions(+), 29 deletions(-) create mode 100644 resources/Shaders/ForwardPlus.frag.glsl create mode 100644 resources/Shaders/ForwardPlus.vert.glsl diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 886c98ca..59bf3d45 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -69,6 +69,7 @@ private: //----------------------Forward+-----------------------// void CalculateFrustum(); void CullLights(); + void DrawForwardPlus(RenderQueueCollection& rq); //Frustum struct Plane { glm::vec3 Normal; @@ -116,6 +117,7 @@ private: ShaderProgram* m_DrawScreenQuadProgram; ShaderProgram* m_CalculateFrustumProgram; ShaderProgram* m_LightCullProgram; + ShaderProgram* m_ForwardPlusProgram; }; diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl new file mode 100644 index 00000000..1f49102e --- /dev/null +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -0,0 +1,124 @@ +#version 430 + +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; +uniform vec4 Color; + +uniform sampler2D texture0; + + +struct PointLight { + vec4 Position; + vec4 Color; + float Radius; + float Intensity; + float Falloff; + float Padding; +}; + +layout (std430, binding = 1) buffer LightBuffer +{ + PointLight List[]; +} PointLights; + +struct LightGrid { + int Amount; + int Start; + vec2 Padding; +}; + +layout (std430, binding = 2) buffer LightGridBuffer +{ + LightGrid Data[]; +} LightGrids; + +layout (std430, binding = 4) buffer LightIndexBuffer +{ + int LightIndex[]; +}; + + +in VertexData{ + vec3 Position; + vec3 Normal; + vec2 TextureCoordinate; + vec4 DiffuseColor; +}Input; + +out vec4 fragmentColor; + +vec4 scene_ambient = vec4(0.6,0.6,0.6,1); + +struct LightResult { + vec4 Diffuse; + vec4 Specular; +}; + +float CalcAttenuation(float radius, float dist) { + return 1.0 - smoothstep(radius * 1.0, radius, dist); +} + +vec4 CalcSpecular(vec4 lightColor, vec4 viewVec, vec4 lightVec, vec4 normal) { + vec4 R = normalize( reflect(-lightVec, normal)); + float RdotV = max( dot(R, viewVec), 0.0); + return lightColor * pow(RdotV, 90.0); +} + +vec4 CalcDiffuse(vec4 lightColor, vec4 lightVec, vec4 normal) { + float power = max( dot(normal, lightVec), 0.0); + return lightColor * power; +} + +LightResult CalcPointLight(vec4 lightPos, float lightRadius, vec4 lightColor, float intensity, vec4 viewVec, vec4 position, vec4 normal) +{ + vec4 L = lightPos - position; + float dist = length(L); + L = normalize(L); + + float attenuation = CalcAttenuation(lightRadius, dist); + + LightResult result; + result.Diffuse = CalcDiffuse(lightColor, L, normal) * attenuation * intensity; + result.Specular = CalcSpecular(lightColor, viewVec, L, normal) * attenuation * intensity; + return result; +} + + +void main() +{ + vec4 texel = texture2D(texture0, Input.TextureCoordinate); + vec4 position = V * M * vec4(Input.Position, 1.0); + vec4 normal = V * vec4(Input.Normal, 0.0); + vec4 viewVec = normalize(-position); + + vec2 tilePos; + tilePos.x = int(gl_FragCoord.x/16); + tilePos.y = int(gl_FragCoord.y/16); + + LightResult totalLighting; + totalLighting.Diffuse = scene_ambient; + + //for(int i = 0; i < 3; i++) + for(int i = LightGrids.Data[int(tilePos.x + tilePos.y*80)].Start; i < LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount; i++) + { + int l = LightIndex[i]; + + LightResult result = CalcPointLight(V * PointLights.List[l].Position, PointLights.List[l].Radius, PointLights.List[l].Color, PointLights.List[l].Intensity, viewVec, position, normal); + + totalLighting.Diffuse += result.Diffuse; + totalLighting.Specular += result.Specular; + } + + fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color; + //fragmentColor = texel * Input.DiffuseColor * Color; + if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) + { + fragmentColor = vec4(0.5, 0, 0, 0); + } else { + //fragmentColor = vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Start/3600, 0, 0, 1); + } + +} + + diff --git a/resources/Shaders/ForwardPlus.vert.glsl b/resources/Shaders/ForwardPlus.vert.glsl new file mode 100644 index 00000000..20ab9051 --- /dev/null +++ b/resources/Shaders/ForwardPlus.vert.glsl @@ -0,0 +1,34 @@ +#version 430 + +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; + +layout(location = 0) in vec3 Position; +layout(location = 1) in vec3 Normal; +layout(location = 2) in vec3 Tangent; +layout(location = 3) in vec3 BiTangent; +layout(location = 4) in vec2 TextureCoords; +layout(location = 5) in vec4 DiffuseVertexColor; +layout(location = 6) in vec4 SpecularVertexColor; +layout(location = 7) in vec4 BoneIndices1; +layout(location = 8) in vec4 BoneIndices2; +layout(location = 9) in vec4 BoneWeights1; +layout(location = 10) in vec4 BoneWeights2; + +out VertexData{ + vec3 Position; + vec3 Normal; + vec2 TextureCoordinate; + vec4 DiffuseColor; +}Output; + +void main() +{ + gl_Position = P*V*M * vec4(Position, 1.0); + + Output.Position = Position; + Output.TextureCoordinate = TextureCoords; + Output.Normal = Normal; + Output.DiffuseColor = DiffuseVertexColor; +} \ No newline at end of file diff --git a/resources/Shaders/cullLights.comp.glsl b/resources/Shaders/cullLights.comp.glsl index e9fa9a95..ffa69d0e 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -1,16 +1,19 @@ #version 430 -//in uvec3 gl_NumWorkGroups; -//in uvec3 gl_WorkGroupID; -//in uvec3 gl_LocalInvocationID; -//in uvec3 gl_GlobalInvocationID; -//in uint gl_LocalInvocationIndex; +//in uvec3 gl_NumWorkGroups; //contains the number of workgroups that have been dispatched to a compute shader +//in uvec3 gl_WorkGroupID; //contains the index of the workgroup currently being operated on by a compute shader +//in uvec3 gl_LocalInvocationID; //contains the index of work item currently being operated on by a compute shader +//in uvec3 gl_GlobalInvocationID; //contains the global index of work item currently being operated on by a compute shader +//in uint gl_LocalInvocationIndex; //contains the local linear index of work item currently being operated on by a compute shader #define NUM_LIGHTS 3 -#define MAX_LIGHTS_PER_TILE 200 +#define MAX_LIGHTS_PER_TILE 1024 #define NUM_TILES 3600 +#define TILE_SIZE 16 + +uniform mat4 V; struct Plane { vec3 Normal; @@ -25,11 +28,124 @@ layout (std430, binding = 0) buffer FrustumBuffer Frustum Data[3600]; } Frustums; +struct PointLight { + vec4 Position; + vec4 Color; + float Radius; + float Intensity; + float Falloff; + float Padding; +}; +layout (std430, binding = 1) buffer LightBuffer +{ + PointLight List[]; +} PointLights; + +struct LightGrid { + int Amount; + int Start; + vec2 Padding; +}; + +layout (std430, binding = 2) buffer LightGridBuffer +{ + LightGrid Data[]; +} LightGrids; + +layout (std430, binding = 3) buffer LightOffsetBuffer +{ + int LightOffset[]; +}; + +layout (std430, binding = 4) buffer LightIndexBuffer +{ + int LightIndex[]; +}; + +shared int GroupLightCount; +shared int GroupLightIndexStartOffset; +shared int GroupLightIndex[MAX_LIGHTS_PER_TILE]; +shared Frustum GroupFrustum; +uint GroupIndex; + +bool SphereInsidePlane(vec3 center, float radius, Plane plane) +{ + return dot(plane.Normal, center) - plane.d < -radius; +} + +bool SphereInsideFrustrum(vec3 center, float radius, Frustum frustum/*, float zNear, float zFar*/) +{ + bool result = true; + + //Check depth here + //if ( sphere.c.z - sphere.r > zNear || sphere.c.z + sphere.r < zFar ) + //{ + // result = false; + //} + + for (int i =0; i < 4 && result; i++) + { + if(SphereInsidePlane(center, radius, frustum.Planes[i])) + { + result = false; + } + } + return result; +} + +void AppendLight(uint li) +{ + uint index; + index = atomicAdd(GroupLightCount, 1); + if( index < MAX_LIGHTS_PER_TILE ) + { + GroupLightIndex[index] = int(li); + } +} layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in; void main () { - if(1 == 1) { + GroupIndex = gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.y; + if(gl_LocalInvocationIndex == 0) + { + GroupLightCount = 0; + + GroupFrustum = Frustums.Data[GroupIndex]; + } + + memoryBarrierShared(); + barrier(); + + for(uint i = gl_LocalInvocationIndex; i < PointLights.List.length(); i += TILE_SIZE*TILE_SIZE) + { + PointLight light = PointLights.List[i]; + + //if pointlight + //Pos i view antagligen + if(SphereInsideFrustrum(vec3(V * light.Position), light.Radius, GroupFrustum)) + { + //TODO: Fix transparent and opaque list, and depth test. + AppendLight( i ); + } + + + //if conelight + + //if directional + + } + + memoryBarrierShared(); + barrier(); + + if(gl_LocalInvocationIndex == 0) + { + GroupLightIndexStartOffset = atomicAdd(LightOffset[0], GroupLightCount); + LightGrid g; + g.Start = GroupLightIndexStartOffset; + g.Amount = GroupLightCount; + LightGrids.Data[GroupIndex]; } } \ No newline at end of file diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index 559a0f58..34fc6d12 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -28,9 +28,10 @@ void DrawScenePass::InitializeShaderPrograms() void DrawScenePass::Draw(RenderQueueCollection& rq) { //glBindFramebuffer(GL_FRAMEBUFFER, 0); - GLERROR("Renderer::Draw PickingPass"); + GLERROR("DrawScenePass::Draw: Pre"); DrawScenePassState state; + m_BasicForwardProgram->Bind(); //TODO: Render: Add code for more jobs than modeljobs. @@ -39,7 +40,6 @@ void DrawScenePass::Draw(RenderQueueCollection& rq) 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())); @@ -62,5 +62,5 @@ void DrawScenePass::Draw(RenderQueueCollection& rq) continue; } } - GLERROR("DrawScene Error"); + GLERROR("DrawScenePass::Draw: End"); } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index f4897223..13b4b892 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -16,7 +16,7 @@ void Renderer::Initialize() InitializeShaders(); InitializeTextures(); InitializeSSBOs(); - //CalculateFrustum(); + CalculateFrustum(); m_ScreenQuad = ResourceManager::Load("Models/Core/ScreenQuad.obj"); m_UnitQuad = ResourceManager::Load("Models/Core/UnitQuad.obj"); @@ -73,15 +73,21 @@ void Renderer::InitializeShaders() 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_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(); + m_LightCullProgram = ResourceManager::Load("#LightCullProgram"); + m_LightCullProgram->AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); + m_LightCullProgram->Compile(); + m_LightCullProgram->Link(); + + m_ForwardPlusProgram = ResourceManager::Load("#ForwardPlusProgram"); + m_ForwardPlusProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); + m_ForwardPlusProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ForwardPlus.frag.glsl"))); + m_ForwardPlusProgram->Compile(); + m_ForwardPlusProgram->Link(); } void Renderer::InputUpdate(double dt) @@ -150,9 +156,10 @@ void Renderer::Draw(RenderQueueCollection& rq) { m_PickingPass->Draw(rq); //DrawScreenQuad(m_PickingPass->PickingTexture()); - //CullLights(); + CullLights(); - m_DrawScenePass->Draw(rq); + //m_DrawScenePass->Draw(rq); + DrawForwardPlus(rq); GLERROR("Renderer::Draw m_DrawScenePass->Draw"); glfwSwapBuffers(m_Window); } @@ -252,39 +259,86 @@ void Renderer::InitializeRenderPasses() void Renderer::CalculateFrustum() { - GLERROR("CalculateFrustum Error-1"); + GLERROR("CalculateFrustum Error: Pre"); + 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); - GLERROR("CalculateFrustum Error4"); glDispatchCompute(5, 3, 1); - GLERROR("CalculateFrustum Error5"); + GLERROR("CalculateFrustum Error: End"); } 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].Position = glm::vec4(5.f * (i-1), 0.f, 0.f, 1.f); m_PointLights[i].Color = glm::vec4(1.f, 0.5f, 0.f + i*0.1f, 1.f); + m_PointLights[i].Radius = 10.f; } } void Renderer::CullLights() { + GLERROR("CullLights Error: Pre"); + m_LightCullProgram->Bind(); + glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix())); 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"); + + GLERROR("CullLights Error: End"); } +void Renderer::DrawForwardPlus(RenderQueueCollection& rq) +{ + GLERROR("Renderer::DrawForwardPlus: Pre"); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + glClearColor(200.f / 255, 0.f / 255, 200.f / 255, 0.f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + m_ForwardPlusProgram->Bind(); + GLuint ShaderHandle = m_ForwardPlusProgram->GetHandle(); + + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO); + //TODO: Render: Add code for more jobs than modeljobs. + for (auto &job : rq.Forward) { + auto modelJob = std::dynamic_pointer_cast(job); + if (modelJob) { + + //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); + glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); + + //TODO: Renderer: bättre textur felhantering samt fler texturer stöd + if (modelJob->DiffuseTexture != nullptr) { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); + } else { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + } + + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); + + continue; + } + } + GLERROR("Renderer::DrawForwardPlus: End"); +} + From 1431bd1a11a2eb9a9602c681dd1ccbbf83452219 Mon Sep 17 00:00:00 2001 From: Tleety Date: Tue, 15 Dec 2015 15:39:23 +0100 Subject: [PATCH 03/18] DebugChanges --- resources/Shaders/cullLights.comp.glsl | 10 +++++----- src/Engine/Rendering/Renderer.cpp | 6 ++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/resources/Shaders/cullLights.comp.glsl b/resources/Shaders/cullLights.comp.glsl index ffa69d0e..465e9225 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -67,7 +67,7 @@ shared int GroupLightCount; shared int GroupLightIndexStartOffset; shared int GroupLightIndex[MAX_LIGHTS_PER_TILE]; shared Frustum GroupFrustum; -uint GroupIndex; +int GroupIndex; bool SphereInsidePlane(vec3 center, float radius, Plane plane) { @@ -94,9 +94,9 @@ bool SphereInsideFrustrum(vec3 center, float radius, Frustum frustum/*, float zN return result; } -void AppendLight(uint li) +void AppendLight(int li) { - uint index; + int index; index = atomicAdd(GroupLightCount, 1); if( index < MAX_LIGHTS_PER_TILE ) { @@ -107,7 +107,7 @@ void AppendLight(uint li) layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in; void main () { - GroupIndex = gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.y; + GroupIndex = int(gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.y); if(gl_LocalInvocationIndex == 0) { GroupLightCount = 0; @@ -118,7 +118,7 @@ void main () memoryBarrierShared(); barrier(); - for(uint i = gl_LocalInvocationIndex; i < PointLights.List.length(); i += TILE_SIZE*TILE_SIZE) + for(int i = int(gl_LocalInvocationIndex); i < PointLights.List.length(); i += TILE_SIZE*TILE_SIZE) { PointLight light = PointLights.List[i]; diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 13b4b892..1bf5e1b4 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -283,6 +283,12 @@ void Renderer::TEMPCreateLights() void Renderer::CullLights() { GLERROR("CullLights Error: Pre"); + m_LightOffset = 0; + + 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); m_LightCullProgram->Bind(); glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix())); From 5602b32507a6a3f35b7f7493c837476bde44088d Mon Sep 17 00:00:00 2001 From: viktorljung Date: Wed, 16 Dec 2015 13:36:38 +0100 Subject: [PATCH 04/18] Forward+ Fixes --- include/Engine/Rendering/Renderer.h | 22 +++++++------------ resources/Shaders/ForwardPlus.frag.glsl | 20 +++++++++++------- resources/Shaders/GridFrustum.comp.glsl | 9 ++++++-- resources/Shaders/cullLights.comp.glsl | 19 ++++++++++++----- src/Engine/Rendering/Renderer.cpp | 28 +++++++++++++------------ 5 files changed, 56 insertions(+), 42 deletions(-) diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 59bf3d45..63b41b32 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -18,14 +18,6 @@ #define NUM_LIGHTS 3 -enum lightType -{ - Point, - Spot, - Directional, - Area -}; - #include "../Core/EventBroker.h" #include "EPicking.h" @@ -94,22 +86,22 @@ private: PointLight m_PointLights[NUM_LIGHTS]; struct LightGrid { - int Amount; - int Start; + float Start; + float Amount; glm::vec2 Padding; }; LightGrid m_LightGrid[80*45]; int m_LightOffset = 0; - int m_LightIndex[80*45*200]; + float m_LightIndex[80*45*200]; //-------------------------SSBO------------------------// GLuint m_FrustumSSBO = 0; - GLuint m_LightSSBO = 1; - GLuint m_LightGridSSBO = 2; - GLuint m_LightOffsetSSBO = 3; - GLuint m_LightIndexSSBO = 4; + GLuint m_LightSSBO = 0; + GLuint m_LightGridSSBO = 0; + GLuint m_LightOffsetSSBO = 0; + GLuint m_LightIndexSSBO = 0; void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index 1f49102e..e3a3f05c 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -23,8 +23,8 @@ layout (std430, binding = 1) buffer LightBuffer } PointLights; struct LightGrid { - int Amount; - int Start; + float Start; + float Amount; vec2 Padding; }; @@ -35,7 +35,7 @@ layout (std430, binding = 2) buffer LightGridBuffer layout (std430, binding = 4) buffer LightIndexBuffer { - int LightIndex[]; + float LightIndex[]; }; @@ -98,11 +98,14 @@ void main() LightResult totalLighting; totalLighting.Diffuse = scene_ambient; - + + + int start = int(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Start); + int amount = int(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount); //for(int i = 0; i < 3; i++) - for(int i = LightGrids.Data[int(tilePos.x + tilePos.y*80)].Start; i < LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount; i++) + for(int i = start; i < start + amount; i++) { - int l = LightIndex[i]; + int l = int(LightIndex[i]); LightResult result = CalcPointLight(V * PointLights.List[l].Position, PointLights.List[l].Radius, PointLights.List[l].Color, PointLights.List[l].Intensity, viewVec, position, normal); @@ -111,12 +114,15 @@ void main() } fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color; + //fragmentColor = texel * Input.DiffuseColor * Color; if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) { fragmentColor = vec4(0.5, 0, 0, 0); } else { - //fragmentColor = vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Start/3600, 0, 0, 1); + //fragmentColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/3.0, 0, 0, 1); + + } } diff --git a/resources/Shaders/GridFrustum.comp.glsl b/resources/Shaders/GridFrustum.comp.glsl index 27559370..523852d5 100644 --- a/resources/Shaders/GridFrustum.comp.glsl +++ b/resources/Shaders/GridFrustum.comp.glsl @@ -67,7 +67,12 @@ void main () - - Frustums.Data[gl_GlobalInvocationID.x + gl_GlobalInvocationID.y*80] = f; + + if ( gl_GlobalInvocationID.x < ScreenDimensions.x / TILE_SIZE && gl_GlobalInvocationID.y < ScreenDimensions.y / TILE_SIZE ) { // innanför skärmen? + 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 index 465e9225..012d72a7 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -43,8 +43,8 @@ layout (std430, binding = 1) buffer LightBuffer } PointLights; struct LightGrid { - int Amount; - int Start; + float Start; + float Amount; vec2 Padding; }; @@ -60,7 +60,7 @@ layout (std430, binding = 3) buffer LightOffsetBuffer layout (std430, binding = 4) buffer LightIndexBuffer { - int LightIndex[]; + float LightIndex[]; }; shared int GroupLightCount; @@ -107,7 +107,7 @@ void AppendLight(int li) layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in; void main () { - GroupIndex = int(gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.y); + GroupIndex = int(gl_WorkGroupID.x + (gl_WorkGroupID.y * 80)); if(gl_LocalInvocationIndex == 0) { GroupLightCount = 0; @@ -146,6 +146,15 @@ void main () LightGrid g; g.Start = GroupLightIndexStartOffset; g.Amount = GroupLightCount; - LightGrids.Data[GroupIndex]; + g.Padding = vec2(1111, 1111); + LightGrids.Data[GroupIndex] = g; + } + + memoryBarrierShared(); + barrier(); + + for (uint i = gl_LocalInvocationIndex; i < GroupLightCount; i += TILE_SIZE * TILE_SIZE ) + { + LightIndex[GroupLightIndexStartOffset + i] = GroupLightIndex[i]; } } \ No newline at end of file diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 1bf5e1b4..b838bdbc 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -209,44 +209,35 @@ 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); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); 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); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); 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); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); 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); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_LightOffsetSSBO); 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); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - GLERROR("m_LightIndexSSBO"); } @@ -274,9 +265,9 @@ void Renderer::CalculateFrustum() void Renderer::TEMPCreateLights() { for (int i = 0; i < NUM_LIGHTS; i++) { - m_PointLights[i].Position = glm::vec4(5.f * (i-1), 0.f, 0.f, 1.f); + m_PointLights[i].Position = glm::vec4(5.f * (i-1), -1.5f, 0.f, 1.f); m_PointLights[i].Color = glm::vec4(1.f, 0.5f, 0.f + i*0.1f, 1.f); - m_PointLights[i].Radius = 10.f; + m_PointLights[i].Radius = 2.f; } } @@ -287,7 +278,18 @@ void Renderer::CullLights() 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); + + 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); + + 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); + + 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); m_LightCullProgram->Bind(); From 6a3c14540d1d75bc7f83d1bde2c2bdb62b67eed1 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 17 Dec 2015 10:38:13 +0100 Subject: [PATCH 05/18] fixes --- include/Engine/Rendering/Renderer.h | 2 + resources/Schema/Entities/Test.xml | 13 ++++-- resources/Shaders/ForwardPlus.frag.glsl | 13 +++--- resources/Shaders/GridFrustum.comp.glsl | 58 ++++++++++++------------- resources/Shaders/cullLights.comp.glsl | 15 ++----- src/Engine/Rendering/Renderer.cpp | 13 +----- 6 files changed, 51 insertions(+), 63 deletions(-) diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 63b41b32..fad41c5f 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -67,6 +67,7 @@ private: glm::vec3 Normal; float d; }; + struct Frustum { Plane Planes[4]; }; @@ -90,6 +91,7 @@ private: float Amount; glm::vec2 Padding; }; + LightGrid m_LightGrid[80*45]; int m_LightOffset = 0; diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 78494ce1..f8be48a7 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -5,11 +5,18 @@ - - Models/DummyScene.obj - + + + + + + + Models/Core/UnitPlane.obj + + + diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index e3a3f05c..685a8d22 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -7,6 +7,7 @@ uniform vec4 Color; uniform sampler2D texture0; +#define TILE_SIZE 16 struct PointLight { vec4 Position; @@ -48,7 +49,7 @@ in VertexData{ out vec4 fragmentColor; -vec4 scene_ambient = vec4(0.6,0.6,0.6,1); +vec4 scene_ambient = vec4(0.0,0.0,0.0,1); struct LightResult { vec4 Diffuse; @@ -98,10 +99,10 @@ void main() LightResult totalLighting; totalLighting.Diffuse = scene_ambient; + int currentTile = int(floor(gl_FragCoord.x/TILE_SIZE) + (floor(gl_FragCoord.y/TILE_SIZE) * 80)); - - int start = int(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Start); - int amount = int(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount); + int start = int(LightGrids.Data[currentTile].Start); + int amount = int(LightGrids.Data[currentTile].Amount); //for(int i = 0; i < 3; i++) for(int i = start; i < start + amount; i++) { @@ -114,11 +115,11 @@ void main() } fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color; - + fragmentColor += vec4(LightGrids.Data[currentTile].Amount/3.0, 0, 0, 1); //fragmentColor = texel * Input.DiffuseColor * Color; if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) { - fragmentColor = vec4(0.5, 0, 0, 0); + //fragmentColor = vec4(0.5, 0, 0, 0); } else { //fragmentColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/3.0, 0, 0, 1); diff --git a/resources/Shaders/GridFrustum.comp.glsl b/resources/Shaders/GridFrustum.comp.glsl index 523852d5..9e0f5a8e 100644 --- a/resources/Shaders/GridFrustum.comp.glsl +++ b/resources/Shaders/GridFrustum.comp.glsl @@ -16,7 +16,7 @@ struct Frustum { layout (std430, binding = 0) buffer FrustumBuffer { - Frustum Data[3600]; + Frustum Data[]; } Frustums; vec4 ConvertToView(vec4 ScreenCoords) @@ -43,36 +43,32 @@ Plane ComputePlane( vec3 p0, vec3 p1, vec3 p2 ) 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); + //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); + 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])); - } - - 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]); - - - - - if ( gl_GlobalInvocationID.x < ScreenDimensions.x / TILE_SIZE && gl_GlobalInvocationID.y < ScreenDimensions.y / TILE_SIZE ) { // innanför skärmen? - Frustums.Data[gl_GlobalInvocationID.x + gl_GlobalInvocationID.y*80] = f; - - } - - + vec3 ViewVectors[4]; + for(int i = 0; i < 4; i++) { + ViewVectors[i] = vec3(ConvertToView(ScreenCoords[i])); } + + 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]); + + + + + if ( gl_GlobalInvocationID.x < ScreenDimensions.x / TILE_SIZE && gl_GlobalInvocationID.y < ScreenDimensions.y / TILE_SIZE ) { // inside the screen + 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 index 012d72a7..ecb0e8e6 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -25,7 +25,7 @@ struct Frustum { layout (std430, binding = 0) buffer FrustumBuffer { - Frustum Data[3600]; + Frustum Data[]; } Frustums; struct PointLight { @@ -111,11 +111,9 @@ void main () if(gl_LocalInvocationIndex == 0) { GroupLightCount = 0; - GroupFrustum = Frustums.Data[GroupIndex]; } - memoryBarrierShared(); barrier(); for(int i = int(gl_LocalInvocationIndex); i < PointLights.List.length(); i += TILE_SIZE*TILE_SIZE) @@ -124,7 +122,7 @@ void main () //if pointlight //Pos i view antagligen - if(SphereInsideFrustrum(vec3(V * light.Position), light.Radius, GroupFrustum)) + if(SphereInsideFrustrum( vec3(V * light.Position), light.Radius, GroupFrustum)) { //TODO: Fix transparent and opaque list, and depth test. AppendLight( i ); @@ -137,20 +135,15 @@ void main () } - memoryBarrierShared(); barrier(); if(gl_LocalInvocationIndex == 0) { GroupLightIndexStartOffset = atomicAdd(LightOffset[0], GroupLightCount); - LightGrid g; - g.Start = GroupLightIndexStartOffset; - g.Amount = GroupLightCount; - g.Padding = vec2(1111, 1111); - LightGrids.Data[GroupIndex] = g; + LightGrids.Data[GroupIndex].Start = GroupLightIndexStartOffset; + LightGrids.Data[GroupIndex].Amount = GroupLightCount; } - memoryBarrierShared(); barrier(); for (uint i = gl_LocalInvocationIndex; i < GroupLightCount; i += TILE_SIZE * TILE_SIZE ) diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index b838bdbc..24e82cfd 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -265,7 +265,7 @@ void Renderer::CalculateFrustum() void Renderer::TEMPCreateLights() { for (int i = 0; i < NUM_LIGHTS; i++) { - m_PointLights[i].Position = glm::vec4(5.f * (i-1), -1.5f, 0.f, 1.f); + m_PointLights[i].Position = glm::vec4(5.f * (i-1), 1.f, 0.f, 1.f); m_PointLights[i].Color = glm::vec4(1.f, 0.5f, 0.f + i*0.1f, 1.f); m_PointLights[i].Radius = 2.f; } @@ -280,17 +280,6 @@ void Renderer::CullLights() glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - 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); - - 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); - - 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); m_LightCullProgram->Bind(); glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix())); From 4a817613e32cd6623fc6613ac2f9e1b66ced3f80 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 17 Dec 2015 17:55:44 +0100 Subject: [PATCH 06/18] Forward+ semi working --- include/Engine/Rendering/Renderer.h | 2 +- resources/Shaders/ForwardPlus.frag.glsl | 6 +++--- resources/Shaders/GridFrustum.comp.glsl | 12 ++++++------ resources/Shaders/cullLights.comp.glsl | 16 +++++++++------- src/Engine/Rendering/Renderer.cpp | 18 +++++++++++------- 5 files changed, 30 insertions(+), 24 deletions(-) diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index fad41c5f..82471c6d 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -15,7 +15,7 @@ #define TILE_SIZE 16 -#define NUM_LIGHTS 3 +#define NUM_LIGHTS 25 #include "../Core/EventBroker.h" diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index 685a8d22..59456322 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -49,7 +49,7 @@ in VertexData{ out vec4 fragmentColor; -vec4 scene_ambient = vec4(0.0,0.0,0.0,1); +vec4 scene_ambient = vec4(0.3,0.3,0.3,1); struct LightResult { vec4 Diffuse; @@ -115,11 +115,11 @@ void main() } fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color; - fragmentColor += vec4(LightGrids.Data[currentTile].Amount/3.0, 0, 0, 1); + fragmentColor += vec4(0.0, LightGrids.Data[currentTile].Amount/3.0, 0, 1); //fragmentColor = texel * Input.DiffuseColor * Color; if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) { - //fragmentColor = vec4(0.5, 0, 0, 0); + fragmentColor += vec4(0.5, 0, 0, 0); } else { //fragmentColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/3.0, 0, 0, 1); diff --git a/resources/Shaders/GridFrustum.comp.glsl b/resources/Shaders/GridFrustum.comp.glsl index 9e0f5a8e..6e567e14 100644 --- a/resources/Shaders/GridFrustum.comp.glsl +++ b/resources/Shaders/GridFrustum.comp.glsl @@ -24,7 +24,7 @@ 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; + //view = view / view.w; return view; } @@ -46,7 +46,7 @@ void main () //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); + ScreenCoords[0] = vec4(gl_GlobalInvocationID.x * TILE_SIZE, (gl_GlobalInvocationID.y + 1) * TILE_SIZE, -1.0, 1.0); 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); @@ -59,10 +59,10 @@ void main () 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]); + f.Planes[0] = ComputePlane(EyePos, ViewVectors[2], ViewVectors[0]); // left plane + f.Planes[1] = ComputePlane(EyePos, ViewVectors[1], ViewVectors[3]); // right plane + f.Planes[2] = ComputePlane(EyePos, ViewVectors[0], ViewVectors[1]); // top plane + f.Planes[3] = ComputePlane(EyePos, ViewVectors[3], ViewVectors[2]); // bottom plane diff --git a/resources/Shaders/cullLights.comp.glsl b/resources/Shaders/cullLights.comp.glsl index ecb0e8e6..a0da2520 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -8,7 +8,7 @@ -#define NUM_LIGHTS 3 +#define NUM_LIGHTS 25 #define MAX_LIGHTS_PER_TILE 1024 #define NUM_TILES 3600 #define TILE_SIZE 16 @@ -71,12 +71,11 @@ int GroupIndex; bool SphereInsidePlane(vec3 center, float radius, Plane plane) { - return dot(plane.Normal, center) - plane.d < -radius; + return dot(plane.Normal, center) + plane.d > -radius; } bool SphereInsideFrustrum(vec3 center, float radius, Frustum frustum/*, float zNear, float zFar*/) { - bool result = true; //Check depth here //if ( sphere.c.z - sphere.r > zNear || sphere.c.z + sphere.r < zFar ) @@ -84,14 +83,14 @@ bool SphereInsideFrustrum(vec3 center, float radius, Frustum frustum/*, float zN // result = false; //} - for (int i =0; i < 4 && result; i++) + for (int i =0; i < 4; i++) { - if(SphereInsidePlane(center, radius, frustum.Planes[i])) + if(! SphereInsidePlane(center, radius, frustum.Planes[i])) { - result = false; + return false; } } - return result; + return true; } void AppendLight(int li) @@ -115,6 +114,7 @@ void main () } barrier(); + memoryBarrierShared(); for(int i = int(gl_LocalInvocationIndex); i < PointLights.List.length(); i += TILE_SIZE*TILE_SIZE) { @@ -136,6 +136,7 @@ void main () } barrier(); + memoryBarrierShared(); if(gl_LocalInvocationIndex == 0) { @@ -145,6 +146,7 @@ void main () } barrier(); + for (uint i = gl_LocalInvocationIndex; i < GroupLightCount; i += TILE_SIZE * TILE_SIZE ) { diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 24e82cfd..e048b082 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -5,7 +5,7 @@ void Renderer::Initialize() InitializeWindow(); // Create default camera m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f); - m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10)); + m_DefaultCamera->SetPosition(glm::vec3(0, 1, 10)); if (m_Camera == nullptr) { m_Camera = m_DefaultCamera; } @@ -254,6 +254,8 @@ 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); @@ -264,11 +266,13 @@ void Renderer::CalculateFrustum() void Renderer::TEMPCreateLights() { - for (int i = 0; i < NUM_LIGHTS; i++) { - m_PointLights[i].Position = glm::vec4(5.f * (i-1), 1.f, 0.f, 1.f); - m_PointLights[i].Color = glm::vec4(1.f, 0.5f, 0.f + i*0.1f, 1.f); - m_PointLights[i].Radius = 2.f; - } + for (int z = 0; z < 5; z++) + for (int x = 0; x < 5; x++) + { + m_PointLights[x + z*5].Position = glm::vec4(x*2.f, 0.2f, z * 2.f, 1.f); + m_PointLights[x + z*5].Color = glm::vec4(1.f, 0.5f, 1.f, 1.f); + m_PointLights[x + z*5].Radius = 0.5f; + } } void Renderer::CullLights() @@ -282,7 +286,7 @@ void Renderer::CullLights() m_LightCullProgram->Bind(); - glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(m_LightCullProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix())); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); From 6cf7c12d3447b2f8418af505362a300119f93814 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 18 Dec 2015 11:09:54 +0100 Subject: [PATCH 07/18] Forward+ working --- include/Engine/Rendering/Renderer.h | 2 +- resources/Schema/Entities/Test.xml | 2 +- resources/Shaders/ForwardPlus.frag.glsl | 6 +++--- resources/Shaders/GridFrustum.comp.glsl | 6 ++++-- resources/Shaders/cullLights.comp.glsl | 3 +-- src/Engine/Rendering/Renderer.cpp | 16 ++++++++-------- 6 files changed, 18 insertions(+), 17 deletions(-) diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 82471c6d..2f0dae08 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -15,7 +15,7 @@ #define TILE_SIZE 16 -#define NUM_LIGHTS 25 +#define NUM_LIGHTS 5000 #include "../Core/EventBroker.h" diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index f8be48a7..cf428a77 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -10,7 +10,7 @@ - + Models/Core/UnitPlane.obj diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index 59456322..568195ce 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -57,7 +57,7 @@ struct LightResult { }; float CalcAttenuation(float radius, float dist) { - return 1.0 - smoothstep(radius * 1.0, radius, dist); + return 1.0 - smoothstep(radius * 0.3, radius, dist); } vec4 CalcSpecular(vec4 lightColor, vec4 viewVec, vec4 lightVec, vec4 normal) { @@ -115,11 +115,11 @@ void main() } fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color; - fragmentColor += vec4(0.0, LightGrids.Data[currentTile].Amount/3.0, 0, 1); + //fragmentColor += vec4(0.0, LightGrids.Data[currentTile].Amount/3.0, 0, 1); //fragmentColor = texel * Input.DiffuseColor * Color; if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) { - fragmentColor += vec4(0.5, 0, 0, 0); + //fragmentColor += vec4(0.5, 0, 0, 0); } else { //fragmentColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/3.0, 0, 0, 1); diff --git a/resources/Shaders/GridFrustum.comp.glsl b/resources/Shaders/GridFrustum.comp.glsl index 6e567e14..bb2a4fb7 100644 --- a/resources/Shaders/GridFrustum.comp.glsl +++ b/resources/Shaders/GridFrustum.comp.glsl @@ -24,7 +24,7 @@ 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; + view = view / view.w; return view; } @@ -51,12 +51,14 @@ void main () 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])); } - vec3 EyePos = vec3(0,0,0); + vec3 EyePos = vec3(0.0, 0.0 ,0.0); Frustum f; f.Planes[0] = ComputePlane(EyePos, ViewVectors[2], ViewVectors[0]); // left plane diff --git a/resources/Shaders/cullLights.comp.glsl b/resources/Shaders/cullLights.comp.glsl index a0da2520..69eb5903 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -8,7 +8,6 @@ -#define NUM_LIGHTS 25 #define MAX_LIGHTS_PER_TILE 1024 #define NUM_TILES 3600 #define TILE_SIZE 16 @@ -71,7 +70,7 @@ int GroupIndex; bool SphereInsidePlane(vec3 center, float radius, Plane plane) { - return dot(plane.Normal, center) + plane.d > -radius; + return dot(plane.Normal, center) - plane.d > -radius; } bool SphereInsideFrustrum(vec3 center, float radius, Frustum frustum/*, float zNear, float zFar*/) diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index e048b082..c32fc4f8 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -4,7 +4,7 @@ void Renderer::Initialize() { InitializeWindow(); // Create default camera - m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f); + m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(90.0f), 0.01f, 5000.f); m_DefaultCamera->SetPosition(glm::vec3(0, 1, 10)); if (m_Camera == nullptr) { m_Camera = m_DefaultCamera; @@ -266,13 +266,13 @@ void Renderer::CalculateFrustum() void Renderer::TEMPCreateLights() { - for (int z = 0; z < 5; z++) - for (int x = 0; x < 5; x++) - { - m_PointLights[x + z*5].Position = glm::vec4(x*2.f, 0.2f, z * 2.f, 1.f); - m_PointLights[x + z*5].Color = glm::vec4(1.f, 0.5f, 1.f, 1.f); - m_PointLights[x + z*5].Radius = 0.5f; - } + for (int i = 0; i < NUM_LIGHTS; i++) + { + glm::vec3 pos = glm::vec3(cos(i) * i/10.f , 0.5f, sin(i) * i/10.f); + m_PointLights[i].Position = glm::vec4(pos, 1.f); + m_PointLights[i].Color = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand()%255 / 255.f, 1.f); + m_PointLights[i].Radius = 5.0f; + } } void Renderer::CullLights() From 3636ad45afd36b1be9d851bb50e8ac7e15c44f48 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 18 Dec 2015 11:29:11 +0100 Subject: [PATCH 08/18] Changed to correct branch --- assets | 2 +- include/Engine/Rendering/Renderer.h | 2 +- resources/Schema/Entities/Test.xml | 21 --------------------- src/Engine/Rendering/Renderer.cpp | 2 +- 4 files changed, 3 insertions(+), 24 deletions(-) diff --git a/assets b/assets index b3746822..c8e631f4 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit b37468222e45ec0b2116f1543c578cb9784d43f2 +Subproject commit c8e631f449515cdbe3647b96ce472839748e28f9 diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 2f0dae08..d8928b18 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -15,7 +15,7 @@ #define TILE_SIZE 16 -#define NUM_LIGHTS 5000 +#define NUM_LIGHTS 1000 #include "../Core/EventBroker.h" diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index cf428a77..aed1510c 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -17,27 +17,6 @@ - - - - - - - - Models/ScaleWidget.obj - - - - - - - - - - Models/RotationWidget.obj - - - diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index c32fc4f8..8721127a 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -271,7 +271,7 @@ void Renderer::TEMPCreateLights() glm::vec3 pos = glm::vec3(cos(i) * i/10.f , 0.5f, sin(i) * i/10.f); m_PointLights[i].Position = glm::vec4(pos, 1.f); m_PointLights[i].Color = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand()%255 / 255.f, 1.f); - m_PointLights[i].Radius = 5.0f; + m_PointLights[i].Radius = glm::length(pos) / 5.f; } } From ab6af30a28cbc8b72ec00171298d351f8821eac3 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 18 Dec 2015 12:02:02 +0100 Subject: [PATCH 09/18] Base classes for decoupled forward+ renderer and a fix where if you had to many lights in a tile(200-300+) the list would fill up before the end of frustums. --- include/Engine/Rendering/LightCullingPass.h | 28 +++++++++++++++++++ .../Engine/Rendering/LightCullingPassState.h | 0 resources/Shaders/cullLights.comp.glsl | 2 +- src/Engine/Rendering/LightCullingPass.cpp | 0 .../Rendering/LightCullingPassState.cpp | 0 src/Engine/Rendering/Renderer.cpp | 6 ---- 6 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 include/Engine/Rendering/LightCullingPass.h create mode 100644 include/Engine/Rendering/LightCullingPassState.h create mode 100644 src/Engine/Rendering/LightCullingPass.cpp create mode 100644 src/Engine/Rendering/LightCullingPassState.cpp diff --git a/include/Engine/Rendering/LightCullingPass.h b/include/Engine/Rendering/LightCullingPass.h new file mode 100644 index 00000000..cf661e1f --- /dev/null +++ b/include/Engine/Rendering/LightCullingPass.h @@ -0,0 +1,28 @@ +#ifndef LightCullingPass_h__ +#define LightCullingPass_h__ + +#include "IRenderer.h" +#include "LightCullingPassState.h" +#include "ShaderProgram.h" + + +class LightCullingPass +{ +public: + LightCullingPass(); + ~LightCullingPass(); + + + void GenerateNewFrustum(); +private: + void CullLights(); + + void InitializeTextures(); + void InitializeSSBOs(); + void InitializeShaderPrograms(); + + +}; + + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/LightCullingPassState.h b/include/Engine/Rendering/LightCullingPassState.h new file mode 100644 index 00000000..e69de29b diff --git a/resources/Shaders/cullLights.comp.glsl b/resources/Shaders/cullLights.comp.glsl index 69eb5903..bdd3d758 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -8,7 +8,7 @@ -#define MAX_LIGHTS_PER_TILE 1024 +#define MAX_LIGHTS_PER_TILE 200 #define NUM_TILES 3600 #define TILE_SIZE 16 diff --git a/src/Engine/Rendering/LightCullingPass.cpp b/src/Engine/Rendering/LightCullingPass.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/Engine/Rendering/LightCullingPassState.cpp b/src/Engine/Rendering/LightCullingPassState.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 8721127a..28745305 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -218,8 +218,6 @@ void Renderer::InitializeSSBOs() 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); @@ -233,7 +231,6 @@ void Renderer::InitializeSSBOs() 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); @@ -254,8 +251,6 @@ 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); @@ -284,7 +279,6 @@ void Renderer::CullLights() glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - m_LightCullProgram->Bind(); glUniformMatrix4fv(glGetUniformLocation(m_LightCullProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix())); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); From ef4cbfece887cfd54c5361fddbd6027cb3c87ea8 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 18 Dec 2015 13:20:55 +0100 Subject: [PATCH 10/18] Added PointLight Component in XML files --- resources/Schema/Components.xsd | 1 + resources/Schema/Components/PointLight.xml | 6 ++++++ resources/Schema/Components/PointLight.xsd | 19 +++++++++++++++++++ resources/Schema/Entities/Test.xml | 22 ++++++++++++++++++++++ resources/Schema/Types/Entity.xsd | 1 + 5 files changed, 49 insertions(+) create mode 100644 resources/Schema/Components/PointLight.xml create mode 100644 resources/Schema/Components/PointLight.xsd diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index 12fb870e..b3bffdd5 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -6,4 +6,5 @@ + \ No newline at end of file diff --git a/resources/Schema/Components/PointLight.xml b/resources/Schema/Components/PointLight.xml new file mode 100644 index 00000000..a1dd5f54 --- /dev/null +++ b/resources/Schema/Components/PointLight.xml @@ -0,0 +1,6 @@ + + + 1.0 + 0.8 + 0.3 + \ No newline at end of file diff --git a/resources/Schema/Components/PointLight.xsd b/resources/Schema/Components/PointLight.xsd new file mode 100644 index 00000000..68e05a84 --- /dev/null +++ b/resources/Schema/Components/PointLight.xsd @@ -0,0 +1,19 @@ + + + + + + + + It's a point light! + + + + + + + + + + + \ No newline at end of file diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index aed1510c..9c275e35 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -17,6 +17,28 @@ + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.obj + + + diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index 92f7dc31..9acfc79a 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -15,6 +15,7 @@ + From 069a6756b96eb70167b2948a45418e0dcff72d9e Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 18 Dec 2015 14:31:16 +0100 Subject: [PATCH 11/18] LightcullingPass for forward+ is now separate from Renderer.cpp. --- include/Engine/Rendering/LightCullingPass.h | 59 ++++++++++- include/Engine/Rendering/PickingPass.h | 6 +- include/Engine/Rendering/Renderer.h | 54 +--------- resources/Shaders/ForwardPlus.frag.glsl | 1 + src/Engine/Rendering/LightCullingPass.cpp | 107 ++++++++++++++++++++ src/Engine/Rendering/Renderer.cpp | 105 +------------------ 6 files changed, 177 insertions(+), 155 deletions(-) diff --git a/include/Engine/Rendering/LightCullingPass.h b/include/Engine/Rendering/LightCullingPass.h index cf661e1f..f0ed5d6b 100644 --- a/include/Engine/Rendering/LightCullingPass.h +++ b/include/Engine/Rendering/LightCullingPass.h @@ -1,6 +1,9 @@ #ifndef LightCullingPass_h__ #define LightCullingPass_h__ +#define TILE_SIZE 16 +#define NUM_LIGHTS 1000 + #include "IRenderer.h" #include "LightCullingPassState.h" #include "ShaderProgram.h" @@ -9,19 +12,67 @@ class LightCullingPass { public: - LightCullingPass(); + LightCullingPass(IRenderer* renderer); ~LightCullingPass(); - void GenerateNewFrustum(); -private: void CullLights(); - void InitializeTextures(); + GLuint FrustumSSBO() const { return m_FrustumSSBO; } + GLuint LightSSBO() const { return m_LightSSBO; } + GLuint LightGridSSBO() const { return m_LightGridSSBO; } + GLuint LightOffsetSSBO() const { return m_LightOffsetSSBO; } + GLuint LightIndexSSBO() const { return m_LightIndexSSBO; } +private: + void InitializeSSBOs(); void InitializeShaderPrograms(); + const IRenderer* m_Renderer; + GLuint m_FrustumSSBO = 0; + GLuint m_LightSSBO = 0; + GLuint m_LightGridSSBO = 0; + GLuint m_LightOffsetSSBO = 0; + GLuint m_LightIndexSSBO = 0; + + ShaderProgram* m_CalculateFrustumProgram; + ShaderProgram* m_LightCullProgram; + + struct Plane { + glm::vec3 Normal; + float d; + }; + + struct Frustum { + Plane Planes[4]; + }; + Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution + + void TEMPCreateLights(); + + //This should be a component + 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 { + float Start; + float Amount; + glm::vec2 Padding; + }; + + LightGrid m_LightGrid[80*45]; //TODO: Renderer: Make this change with resolution + + int m_LightOffset = 0; + + float m_LightIndex[80*45*200]; //TODO: Renderer: Make this change with resolution }; diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h index e1bc42db..0c1261ce 100644 --- a/include/Engine/Rendering/PickingPass.h +++ b/include/Engine/Rendering/PickingPass.h @@ -1,6 +1,8 @@ #ifndef PickingPass_h__ #define PickingPass_h__ + + #include "IRenderer.h" #include "PickingPassState.h" #include "FrameBuffer.h" @@ -9,6 +11,8 @@ #include "../Core/EventBroker.h" #include "EPicking.h" + + class PickingPass { public: @@ -20,7 +24,6 @@ public: void Draw(RenderQueueCollection& rq); - //Getters const ShaderProgram& PickingProgram() const { return *m_PickingProgram; } const std::unordered_map& PickingColorsToEntity() const { return m_PickingColorsToEntity; } @@ -28,7 +31,6 @@ public: 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; diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index d8928b18..048e6f7e 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -12,11 +12,7 @@ #include "../Core/World.h" #include "PickingPass.h" #include "DrawScenePass.h" - - -#define TILE_SIZE 16 -#define NUM_LIGHTS 1000 - +#include "LightCullingPass.h" #include "../Core/EventBroker.h" #include "EPicking.h" @@ -46,12 +42,12 @@ private: DrawScenePass* m_DrawScenePass; PickingPass* m_PickingPass; + LightCullingPass* m_LightCullingPass; //----------------------Functions----------------------// void InitializeWindow(); void InitializeShaders(); void InitializeTextures(); - void InitializeSSBOs(); void InitializeRenderPasses(); //TODO: Renderer: Get InputUpdate out of renderer void InputUpdate(double dt); @@ -59,58 +55,18 @@ private: void DrawScreenQuad(GLuint textureToDraw); //----------------------Forward+-----------------------// - void CalculateFrustum(); - void CullLights(); void DrawForwardPlus(RenderQueueCollection& rq); //Frustum - struct Plane { - glm::vec3 Normal; - float d; - }; - - struct Frustum { - Plane Planes[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 { - float Start; - float Amount; - glm::vec2 Padding; - }; - - LightGrid m_LightGrid[80*45]; - - int m_LightOffset = 0; - - float m_LightIndex[80*45*200]; + //-------------------------SSBO------------------------// - GLuint m_FrustumSSBO = 0; - GLuint m_LightSSBO = 0; - GLuint m_LightGridSSBO = 0; - GLuint m_LightOffsetSSBO = 0; - GLuint m_LightIndexSSBO = 0; + 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_ForwardPlusProgram; }; diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index 568195ce..79d5411c 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -115,6 +115,7 @@ void main() } fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color; + //fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse) * texel * Color; //fragmentColor += vec4(0.0, LightGrids.Data[currentTile].Amount/3.0, 0, 1); //fragmentColor = texel * Input.DiffuseColor * Color; if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) diff --git a/src/Engine/Rendering/LightCullingPass.cpp b/src/Engine/Rendering/LightCullingPass.cpp index e69de29b..85f27a37 100644 --- a/src/Engine/Rendering/LightCullingPass.cpp +++ b/src/Engine/Rendering/LightCullingPass.cpp @@ -0,0 +1,107 @@ +#include "Rendering/LightCullingPass.h" + +LightCullingPass::LightCullingPass(IRenderer* renderer) +{ + m_Renderer = renderer; + TEMPCreateLights(); + InitializeSSBOs(); + InitializeShaderPrograms(); + GenerateNewFrustum(); +} + +LightCullingPass::~LightCullingPass() +{ + +} + +void LightCullingPass::GenerateNewFrustum() +{ + GLERROR("CalculateFrustum Error: Pre"); + + m_CalculateFrustumProgram->Bind(); + + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); + glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "P"), 1, false, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "ScreenDimensions"), m_Renderer->Resolution().Width, m_Renderer->Resolution().Height); + glDispatchCompute(5, 3, 1); //TODO: Renderer: This needs change so resolution will be right. + + GLERROR("CalculateFrustum Error: End"); +} + +void LightCullingPass::CullLights() +{ + GLERROR("CullLights Error: Pre"); + m_LightOffset = 0; + + 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); + + m_LightCullProgram->Bind(); + glUniformMatrix4fv(glGetUniformLocation(m_LightCullProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Renderer->Camera()->ViewMatrix())); + 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_Renderer->Resolution().Width / TILE_SIZE, m_Renderer->Resolution().Height / TILE_SIZE, 1); + + GLERROR("CullLights Error: End"); +} + +void LightCullingPass::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 LightCullingPass::InitializeShaderPrograms() +{ + 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(); +} + +void LightCullingPass::TEMPCreateLights() +{ + for (int i = 0; i < NUM_LIGHTS; i++) { + glm::vec3 pos = glm::vec3(cos(i) * i/10.f, 0.5f, sin(i) * i/10.f); + m_PointLights[i].Position = glm::vec4(pos, 1.f); + m_PointLights[i].Color = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand()%255 / 255.f, 1.f); + m_PointLights[i].Radius = glm::length(pos) / 5.f; + } +} diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 28745305..e61c1d7c 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -9,14 +9,11 @@ void Renderer::Initialize() if (m_Camera == nullptr) { m_Camera = m_DefaultCamera; } - TEMPCreateLights(); InitializeRenderPasses(); glfwSwapInterval(m_VSYNC); InitializeShaders(); InitializeTextures(); - InitializeSSBOs(); - CalculateFrustum(); m_ScreenQuad = ResourceManager::Load("Models/Core/ScreenQuad.obj"); m_UnitQuad = ResourceManager::Load("Models/Core/UnitQuad.obj"); @@ -73,16 +70,6 @@ void Renderer::InitializeShaders() 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(); - m_ForwardPlusProgram = ResourceManager::Load("#ForwardPlusProgram"); m_ForwardPlusProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); m_ForwardPlusProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ForwardPlus.frag.glsl"))); @@ -156,7 +143,7 @@ void Renderer::Draw(RenderQueueCollection& rq) { m_PickingPass->Draw(rq); //DrawScreenQuad(m_PickingPass->PickingTexture()); - CullLights(); + m_LightCullingPass->CullLights(); //m_DrawScenePass->Draw(rq); DrawForwardPlus(rq); @@ -203,93 +190,11 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin GLERROR("Texture initialization failed"); } -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); - 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::InitializeRenderPasses() { m_DrawScenePass = new DrawScenePass(this); m_PickingPass = new PickingPass(this, m_EventBroker); -} - -void Renderer::CalculateFrustum() -{ - GLERROR("CalculateFrustum Error: Pre"); - - 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(5, 3, 1); - - GLERROR("CalculateFrustum Error: End"); -} - -void Renderer::TEMPCreateLights() -{ - for (int i = 0; i < NUM_LIGHTS; i++) - { - glm::vec3 pos = glm::vec3(cos(i) * i/10.f , 0.5f, sin(i) * i/10.f); - m_PointLights[i].Position = glm::vec4(pos, 1.f); - m_PointLights[i].Color = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand()%255 / 255.f, 1.f); - m_PointLights[i].Radius = glm::length(pos) / 5.f; - } -} - -void Renderer::CullLights() -{ - GLERROR("CullLights Error: Pre"); - m_LightOffset = 0; - - 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); - - m_LightCullProgram->Bind(); - glUniformMatrix4fv(glGetUniformLocation(m_LightCullProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix())); - 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: End"); - + m_LightCullingPass = new LightCullingPass(this); } void Renderer::DrawForwardPlus(RenderQueueCollection& rq) @@ -304,9 +209,9 @@ void Renderer::DrawForwardPlus(RenderQueueCollection& rq) m_ForwardPlusProgram->Bind(); GLuint ShaderHandle = m_ForwardPlusProgram->GetHandle(); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO()); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO()); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightCullingPass->LightIndexSSBO()); //TODO: Render: Add code for more jobs than modeljobs. for (auto &job : rq.Forward) { auto modelJob = std::dynamic_pointer_cast(job); From e510f2b88c9fb7e96de583ce258d97e76fca6593 Mon Sep 17 00:00:00 2001 From: Tleety Date: Wed, 6 Jan 2016 11:32:42 +0100 Subject: [PATCH 12/18] Forward plus render pass now removed from Renderer.cpp to it's own class. --- include/Engine/Rendering/DrawFinalPass.h | 38 ++++++++ include/Engine/Rendering/DrawFinalPassState.h | 15 ++++ include/Engine/Rendering/Renderer.h | 13 +-- src/Engine/Rendering/DrawFinalPass.cpp | 65 ++++++++++++++ src/Engine/Rendering/DrawFinalPassState.cpp | 17 ++++ src/Engine/Rendering/DrawScenePass.cpp | 9 +- src/Engine/Rendering/Renderer.cpp | 86 +------------------ 7 files changed, 146 insertions(+), 97 deletions(-) create mode 100644 include/Engine/Rendering/DrawFinalPass.h create mode 100644 include/Engine/Rendering/DrawFinalPassState.h create mode 100644 src/Engine/Rendering/DrawFinalPass.cpp create mode 100644 src/Engine/Rendering/DrawFinalPassState.cpp diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h new file mode 100644 index 00000000..1a201daf --- /dev/null +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -0,0 +1,38 @@ +#ifndef DrawFinalPass_h__ +#define DrawFinalPass_h__ + +#include "IRenderer.h" +#include "DrawFinalPassState.h" +#include "LightCullingPass.h" +#include "FrameBuffer.h" +#include "ShaderProgram.h" +#include "Util/UnorderedMapVec2.h" +#include "Texture.h" + +class DrawFinalPass +{ +public: + DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass); + ~DrawFinalPass() { } + void InitializeTextures(); + void InitializeFrameBuffers(); + void InitializeShaderPrograms(); + + void Draw(RenderQueueCollection& rq); + + //Getters + + +private: + void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; + + Texture* m_WhiteTexture; + + const IRenderer* m_Renderer; + const LightCullingPass* m_LightCullingPass; + + ShaderProgram* m_ForwardPlusProgram; + +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/DrawFinalPassState.h b/include/Engine/Rendering/DrawFinalPassState.h new file mode 100644 index 00000000..72d8e392 --- /dev/null +++ b/include/Engine/Rendering/DrawFinalPassState.h @@ -0,0 +1,15 @@ +#ifndef DrawFinalPassState_h__ +#define DrawFinalPassState_h__ + +#include "Rendering/RenderState.h" + +class DrawFinalPassState : public RenderState +{ +public: + DrawFinalPassState(); + ~DrawFinalPassState(); +private: + +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 83eb8066..501718e7 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -13,6 +13,7 @@ #include "PickingPass.h" #include "DrawScenePass.h" #include "LightCullingPass.h" +#include "DrawFinalPass.h" #include "../Core/EventBroker.h" #include "EPicking.h" @@ -45,6 +46,7 @@ private: PickingPass* m_PickingPass; LightCullingPass* m_LightCullingPass; ImGuiRenderPass* m_ImGuiRenderPass; + DrawFinalPass* m_DrawFinalPass; //----------------------Functions----------------------// void InitializeWindow(); @@ -56,21 +58,10 @@ private: //void PickingPass(RenderQueueCollection& rq); void DrawScreenQuad(GLuint textureToDraw); - //----------------------Forward+-----------------------// - void DrawForwardPlus(RenderQueueCollection& rq); - //Frustum - - - //-------------------------SSBO------------------------// - - void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// ShaderProgram* m_BasicForwardProgram; ShaderProgram* m_DrawScreenQuadProgram; - - ShaderProgram* m_ForwardPlusProgram; - }; #endif \ No newline at end of file diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp new file mode 100644 index 00000000..359981d3 --- /dev/null +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -0,0 +1,65 @@ +#include "Rendering/DrawFinalPass.h" + +DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass) +{ + m_Renderer = renderer; + m_LightCullingPass = lightCullingPass; + InitializeTextures(); + InitializeShaderPrograms(); +} + +void DrawFinalPass::InitializeTextures() +{ + m_WhiteTexture = ResourceManager::Load("Textures/Core/Blank.png"); +} + +void DrawFinalPass::InitializeShaderPrograms() +{ + m_ForwardPlusProgram = ResourceManager::Load("#ForwardPlusProgram"); + m_ForwardPlusProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); + m_ForwardPlusProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ForwardPlus.frag.glsl"))); + m_ForwardPlusProgram->Compile(); + m_ForwardPlusProgram->Link(); +} + +void DrawFinalPass::Draw(RenderQueueCollection& rq) +{ + GLERROR("DrawFinalPass::Draw: Pre"); + + DrawFinalPassState state; + m_ForwardPlusProgram->Bind(); + GLuint shaderHandle = m_ForwardPlusProgram->GetHandle(); + + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO()); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO()); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightCullingPass->LightIndexSSBO()); + + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix())); + + //TODO: Render: Add code for more jobs than modeljobs. + for (auto &job : rq.Forward) { + auto modelJob = std::dynamic_pointer_cast(job); + if(modelJob) { + //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); + glUniform4fv(glGetUniformLocation(shaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); + + if(modelJob->DiffuseTexture != nullptr) { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); + } else { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + } + + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); + + continue; + } + } + GLERROR("DrawFinalPass::Draw: END"); + +} diff --git a/src/Engine/Rendering/DrawFinalPassState.cpp b/src/Engine/Rendering/DrawFinalPassState.cpp new file mode 100644 index 00000000..7bfb99b5 --- /dev/null +++ b/src/Engine/Rendering/DrawFinalPassState.cpp @@ -0,0 +1,17 @@ +#include "Rendering/DrawFinalPassState.h" + + +DrawFinalPassState::DrawFinalPassState() +{ + BindFramebuffer(0); + + Enable(GL_DEPTH_TEST); + Enable(GL_CULL_FACE); + ClearColor(glm::vec4(200.f / 255, 0.f / 255, 200.f / 255, 0.f)); + Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} + +DrawFinalPassState::~DrawFinalPassState() +{ + +} diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index 34fc6d12..19de3d58 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -14,15 +14,12 @@ 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 = 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) @@ -61,6 +58,12 @@ void DrawScenePass::Draw(RenderQueueCollection& rq) continue; } + auto spriteJob = std::dynamic_pointer_cast(job); + if(spriteJob) + { + //Hello im a sprite, please draw me. + } + } GLERROR("DrawScenePass::Draw: End"); } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 66b88092..9a0c1c2e 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -72,47 +72,12 @@ void Renderer::InitializeShaders() m_DrawScreenQuadProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl"))); m_DrawScreenQuadProgram->Compile(); m_DrawScreenQuadProgram->Link(); - - m_ForwardPlusProgram = ResourceManager::Load("#ForwardPlusProgram"); - m_ForwardPlusProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); - m_ForwardPlusProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ForwardPlus.frag.glsl"))); - m_ForwardPlusProgram->Compile(); - m_ForwardPlusProgram->Link(); } void Renderer::InputUpdate(double dt) { static DebugCameraInputController firstPersonInputController(m_EventBroker, -1); - glm::vec3 m_Position = m_Camera->Position(); - if (glfwGetKey(m_Window, GLFW_KEY_O) == GLFW_PRESS) - { - m_Position = glm::vec3(0.f, 0.f, 5.f); - } - if (glfwGetKey(m_Window, GLFW_KEY_W) == GLFW_PRESS) - { - m_Position += m_Camera->Forward() * m_CameraMoveSpeed * (float)dt; - } - if (glfwGetKey(m_Window, GLFW_KEY_S) == GLFW_PRESS) - { - m_Position -= m_Camera->Forward() * m_CameraMoveSpeed * (float)dt; - } - if (glfwGetKey(m_Window, GLFW_KEY_D) == GLFW_PRESS) - { - m_Position += m_Camera->Right() * m_CameraMoveSpeed * (float)dt; - } - if (glfwGetKey(m_Window, GLFW_KEY_A) == GLFW_PRESS) - { - m_Position -= m_Camera->Right() * m_CameraMoveSpeed * (float)dt; - } - if (glfwGetKey(m_Window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) - { - m_CameraMoveSpeed = 5.f; - } - else { - m_CameraMoveSpeed = 0.5f; - } - firstPersonInputController.Update(dt); m_Camera->SetOrientation(firstPersonInputController.Orientation()); m_Camera->SetPosition(firstPersonInputController.Position()); @@ -132,7 +97,7 @@ void Renderer::Draw(RenderQueueCollection& rq) m_LightCullingPass->CullLights(); //m_DrawScenePass->Draw(rq); - DrawForwardPlus(rq); + m_DrawFinalPass->Draw(rq); glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f); GLERROR("Renderer::Draw m_DrawScenePass->Draw"); m_ImGuiRenderPass->Draw(); @@ -183,50 +148,5 @@ void Renderer::InitializeRenderPasses() m_DrawScenePass = new DrawScenePass(this); m_PickingPass = new PickingPass(this, m_EventBroker); m_LightCullingPass = new LightCullingPass(this); -} - -void Renderer::DrawForwardPlus(RenderQueueCollection& rq) -{ - GLERROR("Renderer::DrawForwardPlus: Pre"); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - glClearColor(200.f / 255, 0.f / 255, 200.f / 255, 0.f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_ForwardPlusProgram->Bind(); - GLuint ShaderHandle = m_ForwardPlusProgram->GetHandle(); - - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO()); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO()); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightCullingPass->LightIndexSSBO()); - //TODO: Render: Add code for more jobs than modeljobs. - for (auto &job : rq.Forward) { - auto modelJob = std::dynamic_pointer_cast(job); - if (modelJob) { - - //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); - glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); - - //TODO: Renderer: bättre textur felhantering samt fler texturer stöd - if (modelJob->DiffuseTexture != nullptr) { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); - } else { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); - } - - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); - glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); - - continue; - } - } - GLERROR("Renderer::DrawForwardPlus: End"); -} - + m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass); +} \ No newline at end of file From 25a99a04c5fc365993eb916d50c203038f568432 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 8 Jan 2016 14:11:35 +0100 Subject: [PATCH 13/18] Added Visable bool and a better description to Pointlight component. --- resources/Schema/Components/PointLight.xml | 1 + resources/Schema/Components/PointLight.xsd | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/Schema/Components/PointLight.xml b/resources/Schema/Components/PointLight.xml index a1dd5f54..6b1382db 100644 --- a/resources/Schema/Components/PointLight.xml +++ b/resources/Schema/Components/PointLight.xml @@ -3,4 +3,5 @@ 1.0 0.8 0.3 + true \ No newline at end of file diff --git a/resources/Schema/Components/PointLight.xsd b/resources/Schema/Components/PointLight.xsd index 68e05a84..d1a9f52c 100644 --- a/resources/Schema/Components/PointLight.xsd +++ b/resources/Schema/Components/PointLight.xsd @@ -5,7 +5,7 @@ - It's a point light! + A pointlight that lights up geometry in a radius. @@ -13,6 +13,7 @@ + From dab4ba2164a893ce8ade9b3a325910d4bc854318 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 8 Jan 2016 14:12:09 +0100 Subject: [PATCH 14/18] Pointlights are now using the pointlight component and the Light renderqueue to draw. --- include/Engine/Rendering/LightCullingPass.h | 5 +-- include/Engine/Rendering/RenderQueue.h | 11 +++--- src/Engine/Rendering/LightCullingPass.cpp | 41 +++++++++++++++------ src/Engine/Rendering/RenderQueueFactory.cpp | 28 ++++++++++++++ src/Engine/Rendering/Renderer.cpp | 1 + 5 files changed, 67 insertions(+), 19 deletions(-) diff --git a/include/Engine/Rendering/LightCullingPass.h b/include/Engine/Rendering/LightCullingPass.h index f0ed5d6b..e08aacdf 100644 --- a/include/Engine/Rendering/LightCullingPass.h +++ b/include/Engine/Rendering/LightCullingPass.h @@ -17,6 +17,7 @@ public: void GenerateNewFrustum(); void CullLights(); + void FillLightList(RenderQueueCollection& rq); GLuint FrustumSSBO() const { return m_FrustumSSBO; } GLuint LightSSBO() const { return m_LightSSBO; } @@ -49,8 +50,6 @@ private: }; Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution - void TEMPCreateLights(); - //This should be a component struct PointLight { glm::vec4 Position = glm::vec4(0.f); @@ -60,7 +59,7 @@ private: float Falloff = 0.3f; float Padding = 1337; }; - PointLight m_PointLights[NUM_LIGHTS]; + std::vector m_PointLights; struct LightGrid { float Start; diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 2942c743..44d5e172 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -82,11 +82,12 @@ struct SpriteJob : RenderJob struct PointLightJob : RenderJob { - glm::vec3 Position; - glm::vec3 SpecularColor = glm::vec3(1, 1, 1); - glm::vec3 DiffuseColor = glm::vec3(1, 1, 1); - float Radius = 1.f; - float Intensity = 0.8f; + glm::vec4 Position; + glm::vec4 Color; + float Radius; + float Intensity; + float Falloff; + float padding = 123; void CalculateHash() override { diff --git a/src/Engine/Rendering/LightCullingPass.cpp b/src/Engine/Rendering/LightCullingPass.cpp index 85f27a37..5a3e7609 100644 --- a/src/Engine/Rendering/LightCullingPass.cpp +++ b/src/Engine/Rendering/LightCullingPass.cpp @@ -3,7 +3,6 @@ LightCullingPass::LightCullingPass(IRenderer* renderer) { m_Renderer = renderer; - TEMPCreateLights(); InitializeSSBOs(); InitializeShaderPrograms(); GenerateNewFrustum(); @@ -35,6 +34,14 @@ void LightCullingPass::CullLights() 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, m_LightSSBO); + if (m_PointLights.size() > 0) { + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(PointLight) * m_PointLights.size(), &(m_PointLights[0]), GL_DYNAMIC_COPY); + } else { + GLfloat zero = 0.f; + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLfloat), &zero , GL_DYNAMIC_COPY); + + } glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); m_LightCullProgram->Bind(); @@ -49,6 +56,25 @@ void LightCullingPass::CullLights() GLERROR("CullLights Error: End"); } +void LightCullingPass::FillLightList(RenderQueueCollection& rq) +{ + m_PointLights.clear(); + for(auto &job : rq.Lights) { + auto pointLightjob = std::dynamic_pointer_cast(job); + if (pointLightjob) { + PointLight p; + p.Color = pointLightjob->Color; + p.Falloff = pointLightjob->Falloff; + p.Intensity = pointLightjob->Intensity; + p.Position = glm::vec4(glm::vec3(pointLightjob->Position), 1.f); + p.Radius = pointLightjob->Radius; + p.Padding = 123.f; + m_PointLights.push_back(p); + continue; + } + } +} + void LightCullingPass::InitializeSSBOs() { glGenBuffers(1, &m_FrustumSSBO); @@ -59,7 +85,9 @@ void LightCullingPass::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); + if(m_PointLights.size() > 0) { + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(PointLight) * m_PointLights.size(), &(m_PointLights[0]), GL_DYNAMIC_COPY); + } glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightSSBO"); @@ -96,12 +124,3 @@ void LightCullingPass::InitializeShaderPrograms() m_LightCullProgram->Link(); } -void LightCullingPass::TEMPCreateLights() -{ - for (int i = 0; i < NUM_LIGHTS; i++) { - glm::vec3 pos = glm::vec3(cos(i) * i/10.f, 0.5f, sin(i) * i/10.f); - m_PointLights[i].Position = glm::vec4(pos, 1.f); - m_PointLights[i].Color = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand()%255 / 255.f, 1.f); - m_PointLights[i].Radius = glm::length(pos) / 5.f; - } -} diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 8d5bb420..015c6477 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -111,6 +111,34 @@ void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue) void RenderQueueFactory::FillLights(World* world, RenderQueue* renderQueue) { + auto pointLights = world->GetComponents("PointLight"); + if(pointLights == nullptr) { + return; + } + for(auto& pointlightC : *pointLights) { + bool visible = pointlightC["Visible"]; + if(!visible) { + continue; + } + auto transformC = world->GetComponent(pointlightC.EntityID, "Transform"); + if(&transformC == nullptr) { + return; + } + + glm::vec4 color = pointlightC["Color"]; + float radius = (double)pointlightC["Radius"]; + float intensity = (double)pointlightC["Intensity"]; + float falloff = (double)pointlightC["Falloff"]; + + PointLightJob job; + job.Position = transformC["Position"]; + job.Color = color; + job.Radius = radius; + job.Intensity = intensity; + job.Falloff = falloff; + + renderQueue->Add(job); + } } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 752dd8c0..8d3863e2 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -92,6 +92,7 @@ void Renderer::Draw(RenderQueueCollection& rq) { m_PickingPass->Draw(rq); //DrawScreenQuad(m_PickingPass->PickingTexture()); + m_LightCullingPass->FillLightList(rq); m_LightCullingPass->CullLights(); //m_DrawScenePass->Draw(rq); From 9f871bbe7cb26c1785676d0e61515d80bdcfb844 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 8 Jan 2016 14:31:44 +0100 Subject: [PATCH 15/18] Lights now use the absolute position instead of it's local position. --- src/Engine/Rendering/RenderQueueFactory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 015c6477..429d773c 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -132,7 +132,7 @@ void RenderQueueFactory::FillLights(World* world, RenderQueue* renderQueue) float falloff = (double)pointlightC["Falloff"]; PointLightJob job; - job.Position = transformC["Position"]; + job.Position = glm::vec4(AbsolutePosition(world, transformC.EntityID), 1.f); job.Color = color; job.Radius = radius; job.Intensity = intensity; From 6e6460a00053887e1f4e76e5717d4dd367688aaf Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 8 Jan 2016 16:15:18 +0100 Subject: [PATCH 16/18] Commented out the bugged models --- resources/Schema/Entities/Test.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 528c7e95..809bca51 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -10,7 +10,7 @@ - + +