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);
}
}