diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b227f110..b0ddf870 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -63,15 +63,12 @@ private: void CalculateFrustum(); void CullLights(); //Frustum - struct Plane - { + struct Plane { glm::vec3 Normal; float d; }; - - struct Frustum - { - Plane plane[4]; + struct Frustum { + Plane Planes[4]; }; Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution @@ -100,11 +97,11 @@ private: int m_LightIndex[80*45*200]; //-------------------------SSBO------------------------// - GLuint m_FrustumSSBO; - GLuint m_LightSSBO; - GLuint m_LightGridSSBO; - GLuint m_LightOffsetSSBO; - GLuint m_LightIndexSSBO; + GLuint m_FrustumSSBO = 0; + GLuint m_LightSSBO = 1; + GLuint m_LightGridSSBO = 2; + GLuint m_LightOffsetSSBO = 3; + GLuint m_LightIndexSSBO = 4; void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// diff --git a/resources/Shaders/GridFrustum.comp.glsl b/resources/Shaders/GridFrustum.comp.glsl index 64f4d467..27559370 100644 --- a/resources/Shaders/GridFrustum.comp.glsl +++ b/resources/Shaders/GridFrustum.comp.glsl @@ -14,29 +14,11 @@ struct Frustum { Plane Planes[4]; }; -layout (std430, binding = 1) buffer FrustumBuffer +layout (std430, binding = 0) buffer FrustumBuffer { - Frustum Data[80*45]; + Frustum Data[3600]; } Frustums; - -struct PlaneNormals { - vec3 Normal1; - float pad1; - vec3 Normal2; - float Pad2; -}; - -struct FrustumNormals { - PlaneNormals Planes[4]; -}; - -layout (std430, binding = 2) buffer PlaneNormalBuffer -{ - FrustumNormals Data[80*45]; -} FrustumNorm; - - vec4 ConvertToView(vec4 ScreenCoords) { vec2 normalizedScreenCoords = ScreenCoords.xy / ScreenDimensions; @@ -75,33 +57,6 @@ void main () ViewVectors[i] = vec3(ConvertToView(ScreenCoords[i])); } - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal1 = (ViewVectors[2]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal2 = (ViewVectors[0]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal1 = (ViewVectors[1]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal2 = (ViewVectors[3]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal1 = (ViewVectors[0]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal2 = (ViewVectors[1]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal1 = (ViewVectors[3]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal2 = (ViewVectors[2]); - /* - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal1 = vec3(ScreenCoords[2]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal2 = vec3(ScreenCoords[0]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal1 = vec3(ScreenCoords[1]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal2 = vec3(ScreenCoords[3]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal1 = vec3(ScreenCoords[0]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal2 = vec3(ScreenCoords[1]); - - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal1 = vec3(ScreenCoords[3]); - FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal2 = vec3(ScreenCoords[2]); - -*/ - - vec3 EyePos = vec3(0,0,0); Frustum f; diff --git a/resources/Shaders/cullLights.comp.glsl b/resources/Shaders/cullLights.comp.glsl index 72d36ec1..e9fa9a95 100644 --- a/resources/Shaders/cullLights.comp.glsl +++ b/resources/Shaders/cullLights.comp.glsl @@ -6,66 +6,30 @@ //in uvec3 gl_GlobalInvocationID; //in uint gl_LocalInvocationIndex; + + #define NUM_LIGHTS 3 #define MAX_LIGHTS_PER_TILE 200 #define NUM_TILES 3600 -struct PointLight { - vec4 Position; - vec4 Color; - float Radius; - float Intensity; - vec2 Pad; -}; - -layout (std430, binding = 0) buffer PointLightBuffer -{ - PointLight PointLights[NUM_LIGHTS]; -}; - struct Plane { vec3 Normal; float d; }; - struct Frustum { Plane Planes[4]; }; -layout (std430, binding = 1) buffer FrustumBuffer +layout (std430, binding = 0) buffer FrustumBuffer { - Frustum Frustums[80*45]; -}; + Frustum Data[3600]; +} Frustums; -layout (std430, binding = 3) buffer LightIndexBuffer -{ - float LightIndexList[MAX_LIGHTS_PER_TILE*NUM_TILES]; -}; - -struct LightGrid -{ - int Amount; - int Start; - vec2 padding; -}; - -layout (std430, binding = 4) buffer LightGridBuffer -{ - LightGrid LightGrids[NUM_TILES]; -}; - -layout (std430, binding = 5) buffer LightOffsetCounter -{ - int GlobalLightOffsetCounter; -}; layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in; void main () { - if(gl_LocalInvocationIndex == 0) { - LightIndexList[int(gl_WorkGroupID.x) + int(gl_WorkGroupID.y)*80] = int(gl_WorkGroupID.x); + if(1 == 1) { } - - } \ No newline at end of file diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 36f260c5..e9a35cba 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -90,9 +90,9 @@ void Renderer::InitializeShaders() m_CalculateFrustumProgram.Compile(); m_CalculateFrustumProgram.Link(); - m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); - m_CalculateFrustumProgram.Compile(); - m_CalculateFrustumProgram.Link(); + m_LightCullProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); + m_LightCullProgram.Compile(); + m_LightCullProgram.Link(); } void Renderer::InputUpdate(double dt) @@ -357,9 +357,11 @@ void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better lo void Renderer::InitializeSSBOs() { + printf("Size: %i\n", sizeof(m_Frustums)); glGenBuffers(1, &m_FrustumSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_FrustumSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_Frustums), &m_Frustums, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_FrustumSSBO"); @@ -367,6 +369,7 @@ void Renderer::InitializeSSBOs() glGenBuffers(1, &m_LightSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_PointLights), &m_PointLights, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightSSBO"); @@ -375,6 +378,7 @@ void Renderer::InitializeSSBOs() glGenBuffers(1, &m_LightGridSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightGridSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightGrid), &m_LightGrid, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightGridSSBO"); @@ -383,6 +387,7 @@ void Renderer::InitializeSSBOs() glGenBuffers(1, &m_LightOffsetSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightOffsetSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_LightOffsetSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightOffsetSSBO"); @@ -391,6 +396,7 @@ void Renderer::InitializeSSBOs() glGenBuffers(1, &m_LightIndexSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightIndexSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightIndex), &m_LightIndex, GL_DYNAMIC_COPY); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightIndexSSBO"); @@ -399,12 +405,18 @@ void Renderer::InitializeSSBOs() void Renderer::CalculateFrustum() { + GLERROR("CalculateFrustum Error-1"); m_CalculateFrustumProgram.Bind(); + + GLERROR("CalculateFrustum Error1"); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); + GLERROR("CalculateFrustum Error2"); glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix())); + GLERROR("CalculateFrustum Error3"); glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height); - glDispatchCompute(m_Resolution.Width / TILE_SIZE, m_Resolution.Height / TILE_SIZE, 1); - GLERROR("CalculateFrustum Error"); + GLERROR("CalculateFrustum Error4"); + glDispatchCompute(5, 3, 1); + GLERROR("CalculateFrustum Error5"); }