diff --git a/include/Engine/Rendering/LightCullingPass.h b/include/Engine/Rendering/LightCullingPass.h index c1baa714..2fc1cbfc 100644 --- a/include/Engine/Rendering/LightCullingPass.h +++ b/include/Engine/Rendering/LightCullingPass.h @@ -2,7 +2,7 @@ #define LightCullingPass_h__ #define TILE_SIZE 16 -#define NUM_LIGHTS 1000 +#define MAX_LIGHTS_PER_TILE 200 #include "IRenderer.h" #include "LightCullingPassState.h" @@ -17,6 +17,8 @@ public: ~LightCullingPass(); void GenerateNewFrustum(RenderScene& scene); + void OnResolutionChange(); + void SetSSBOSizes(); void CullLights(RenderScene& scene); void FillLightList(RenderScene& scene); @@ -41,6 +43,8 @@ private: ShaderProgram* m_CalculateFrustumProgram; ShaderProgram* m_LightCullProgram; + int m_NumberOfTiles = 0; + struct Plane { glm::vec3 Normal; float d; @@ -49,7 +53,7 @@ private: struct Frustum { Plane Planes[4]; }; - Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution + Frustum* m_Frustums; //This should be a component struct PointLight { @@ -68,11 +72,11 @@ private: glm::vec2 Padding; }; - LightGrid m_LightGrid[80*45]; //TODO: Renderer: Make this change with resolution + LightGrid* m_LightGrid; int m_LightOffset = 0; - float m_LightIndex[80*45*200]; //TODO: Renderer: Make this change with resolution + float* m_LightIndex; }; diff --git a/include/Engine/Rendering/PointLightJob.h b/include/Engine/Rendering/PointLightJob.h index ebd9a9b7..4c0a3875 100644 --- a/include/Engine/Rendering/PointLightJob.h +++ b/include/Engine/Rendering/PointLightJob.h @@ -7,13 +7,16 @@ #include "../GLM.h" #include "../Core/ComponentWrapper.h" #include "RenderJob.h" +#include "../Core/Transform.h" +#include "../Core/World.h" struct PointLightJob : RenderJob { - PointLightJob(ComponentWrapper transformComponent, ComponentWrapper pointLightComponent) + PointLightJob(ComponentWrapper transformComponent, ComponentWrapper pointLightComponent, World* m_World) : RenderJob() { Position = glm::vec4((glm::vec3)transformComponent["Position"], 1.0f); + Position = glm::vec4(Transform::AbsolutePosition(m_World, transformComponent.EntityID), 1.f); Color = (glm::vec4)pointLightComponent["Color"]; Radius = (double)pointLightComponent["Radius"]; Intensity = (double)pointLightComponent["Intensity"]; diff --git a/resources/Schema/Entities/EditorTestWorld.xml b/resources/Schema/Entities/EditorTestWorld.xml index 7fa8e96a..e44d238e 100755 --- a/resources/Schema/Entities/EditorTestWorld.xml +++ b/resources/Schema/Entities/EditorTestWorld.xml @@ -1,49 +1,57 @@ - + + - - - - - - - - - - - - - - - - Models/Core/UnitPlane.obj - - - - - - - - - - - An error - - - - - - - - - - - An error - - - - - - - - - \ No newline at end of file + + + + + + + + + Models/Core/UnitCube.obj + + + + + + + + + + + An error + + + + + + + + + + + An error + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/Shaders/CullLights.comp.glsl b/resources/Shaders/CullLights.comp.glsl index bdd3d758..c2675f20 100644 --- a/resources/Shaders/CullLights.comp.glsl +++ b/resources/Shaders/CullLights.comp.glsl @@ -9,10 +9,10 @@ #define MAX_LIGHTS_PER_TILE 200 -#define NUM_TILES 3600 #define TILE_SIZE 16 uniform mat4 V; +uniform vec2 ScreenDimensions; struct Plane { vec3 Normal; @@ -105,7 +105,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 * 80)); + GroupIndex = int(gl_WorkGroupID.x + (gl_WorkGroupID.y * int(ScreenDimensions.x/TILE_SIZE))); if(gl_LocalInvocationIndex == 0) { GroupLightCount = 0; diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index e54b23db..3d5b9bfd 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -4,7 +4,7 @@ uniform mat4 M; uniform mat4 V; uniform mat4 P; uniform vec4 Color; - +uniform vec2 ScreenDimensions; uniform sampler2D texture0; #define TILE_SIZE 16 @@ -99,7 +99,7 @@ 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 currentTile = int(floor(gl_FragCoord.x/TILE_SIZE) + (floor(gl_FragCoord.y/TILE_SIZE) * int(ScreenDimensions.x/TILE_SIZE))); int start = int(LightGrids.Data[currentTile].Start); int amount = int(LightGrids.Data[currentTile].Amount); diff --git a/resources/Shaders/GridFrustum.comp.glsl b/resources/Shaders/GridFrustum.comp.glsl index bb2a4fb7..504cc26e 100644 --- a/resources/Shaders/GridFrustum.comp.glsl +++ b/resources/Shaders/GridFrustum.comp.glsl @@ -1,7 +1,6 @@ #version 430 #define TILE_SIZE 16 -#define NUM_TILES 3600 uniform mat4 P; uniform vec2 ScreenDimensions; @@ -70,7 +69,7 @@ void main () 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; + Frustums.Data[gl_GlobalInvocationID.x + gl_GlobalInvocationID.y*int(ScreenDimensions.x/TILE_SIZE)] = f; } } \ No newline at end of file diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index 893978cd..b0ca4afe 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -36,6 +36,7 @@ void DrawFinalPass::Draw(RenderScene& scene) 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())); + glUniform2f(glGetUniformLocation(shaderHandle, "ScreenDimensions"), m_Renderer->Resolution().Width, m_Renderer->Resolution().Height); //TODO: Render: Add code for more jobs than modeljobs. for (auto &job : scene.ForwardJobs) { diff --git a/src/Engine/Rendering/LightCullingPass.cpp b/src/Engine/Rendering/LightCullingPass.cpp index bc0b65f1..e59a50c0 100644 --- a/src/Engine/Rendering/LightCullingPass.cpp +++ b/src/Engine/Rendering/LightCullingPass.cpp @@ -3,6 +3,7 @@ LightCullingPass::LightCullingPass(IRenderer* renderer) { m_Renderer = renderer; + SetSSBOSizes(); InitializeSSBOs(); InitializeShaderPrograms(); //GenerateNewFrustum(TODO); @@ -25,11 +26,31 @@ void LightCullingPass::GenerateNewFrustum(RenderScene& scene) glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "P"), 1, false, glm::value_ptr(scene.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. + glDispatchCompute((int)(m_Renderer->Resolution().Width/(TILE_SIZE*TILE_SIZE) + 1), (int)(m_Renderer->Resolution().Height/(TILE_SIZE*TILE_SIZE) + 1), 1); GLERROR("CalculateFrustum Error: End"); } + +void LightCullingPass::OnResolutionChange() +{ + SetSSBOSizes(); +} + + +void LightCullingPass::SetSSBOSizes() +{ + m_NumberOfTiles = (int)(m_Renderer->Resolution().Width*m_Renderer->Resolution().Height)/TILE_SIZE; + + //m_Frustums = new Frustum[s]; + //m_LightGrid = new LightGrid[s]; + //m_LightIndex = new float[s*200]; + + m_Frustums = new Frustum[m_NumberOfTiles]; + m_LightGrid = new LightGrid[m_NumberOfTiles]; + m_LightIndex = new float[m_NumberOfTiles*MAX_LIGHTS_PER_TILE]; +} + void LightCullingPass::CullLights(RenderScene& scene) { GLERROR("CullLights Error: Pre"); @@ -43,11 +64,11 @@ void LightCullingPass::CullLights(RenderScene& scene) } 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(); + glUniform2f(glGetUniformLocation(m_LightCullProgram->GetHandle(), "ScreenDimensions"), m_Renderer->Resolution().Width, m_Renderer->Resolution().Height); glUniformMatrix4fv(glGetUniformLocation(m_LightCullProgram->GetHandle(), "V"), 1, false, glm::value_ptr(scene.Camera->ViewMatrix())); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); @@ -83,7 +104,7 @@ 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); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Frustum)*m_NumberOfTiles, m_Frustums, GL_DYNAMIC_COPY); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_FrustumSSBO"); @@ -97,7 +118,7 @@ void LightCullingPass::InitializeSSBOs() glGenBuffers(1, &m_LightGridSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightGridSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightGrid), &m_LightGrid, GL_DYNAMIC_COPY); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(LightGrid)*m_NumberOfTiles, m_LightGrid, GL_DYNAMIC_COPY); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightGridSSBO"); @@ -110,7 +131,7 @@ void LightCullingPass::InitializeSSBOs() glGenBuffers(1, &m_LightIndexSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightIndexSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightIndex), &m_LightIndex, GL_DYNAMIC_COPY); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float)*m_NumberOfTiles*MAX_LIGHTS_PER_TILE, m_LightIndex, GL_DYNAMIC_COPY); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightIndexSSBO"); } diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 09cdb396..11eca86b 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -116,7 +116,7 @@ void RenderSystem::fillLight(std::list>& jobs, World* return; } - std::shared_ptr pointLightJob = std::shared_ptr(new PointLightJob(transformC, pointlightC)); + std::shared_ptr pointLightJob = std::shared_ptr(new PointLightJob(transformC, pointlightC, m_World)); jobs.push_back(pointLightJob); } }