Forward+ Debugging commit, dont try it.
This commit is contained in:
@@ -63,15 +63,12 @@ private:
|
|||||||
void CalculateFrustum();
|
void CalculateFrustum();
|
||||||
void CullLights();
|
void CullLights();
|
||||||
//Frustum
|
//Frustum
|
||||||
struct Plane
|
struct Plane {
|
||||||
{
|
|
||||||
glm::vec3 Normal;
|
glm::vec3 Normal;
|
||||||
float d;
|
float d;
|
||||||
};
|
};
|
||||||
|
struct Frustum {
|
||||||
struct Frustum
|
Plane Planes[4];
|
||||||
{
|
|
||||||
Plane plane[4];
|
|
||||||
};
|
};
|
||||||
Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution
|
Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution
|
||||||
|
|
||||||
@@ -100,11 +97,11 @@ private:
|
|||||||
int m_LightIndex[80*45*200];
|
int m_LightIndex[80*45*200];
|
||||||
|
|
||||||
//-------------------------SSBO------------------------//
|
//-------------------------SSBO------------------------//
|
||||||
GLuint m_FrustumSSBO;
|
GLuint m_FrustumSSBO = 0;
|
||||||
GLuint m_LightSSBO;
|
GLuint m_LightSSBO = 1;
|
||||||
GLuint m_LightGridSSBO;
|
GLuint m_LightGridSSBO = 2;
|
||||||
GLuint m_LightOffsetSSBO;
|
GLuint m_LightOffsetSSBO = 3;
|
||||||
GLuint m_LightIndexSSBO;
|
GLuint m_LightIndexSSBO = 4;
|
||||||
|
|
||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
||||||
//--------------------ShaderPrograms-------------------//
|
//--------------------ShaderPrograms-------------------//
|
||||||
|
|||||||
@@ -14,29 +14,11 @@ struct Frustum {
|
|||||||
Plane Planes[4];
|
Plane Planes[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
layout (std430, binding = 1) buffer FrustumBuffer
|
layout (std430, binding = 0) buffer FrustumBuffer
|
||||||
{
|
{
|
||||||
Frustum Data[80*45];
|
Frustum Data[3600];
|
||||||
} Frustums;
|
} 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)
|
vec4 ConvertToView(vec4 ScreenCoords)
|
||||||
{
|
{
|
||||||
vec2 normalizedScreenCoords = ScreenCoords.xy / ScreenDimensions;
|
vec2 normalizedScreenCoords = ScreenCoords.xy / ScreenDimensions;
|
||||||
@@ -75,33 +57,6 @@ void main ()
|
|||||||
ViewVectors[i] = vec3(ConvertToView(ScreenCoords[i]));
|
ViewVectors[i] = vec3(ConvertToView(ScreenCoords[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal1 = (ViewVectors[2]);
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal2 = (ViewVectors[0]);
|
|
||||||
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal1 = (ViewVectors[1]);
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal2 = (ViewVectors[3]);
|
|
||||||
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal1 = (ViewVectors[0]);
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal2 = (ViewVectors[1]);
|
|
||||||
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal1 = (ViewVectors[3]);
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal2 = (ViewVectors[2]);
|
|
||||||
/*
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal1 = vec3(ScreenCoords[2]);
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[0].Normal2 = vec3(ScreenCoords[0]);
|
|
||||||
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal1 = vec3(ScreenCoords[1]);
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[1].Normal2 = vec3(ScreenCoords[3]);
|
|
||||||
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal1 = vec3(ScreenCoords[0]);
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[2].Normal2 = vec3(ScreenCoords[1]);
|
|
||||||
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal1 = vec3(ScreenCoords[3]);
|
|
||||||
FrustumNorm.Data[gl_GlobalInvocationID.x + (80 * gl_GlobalInvocationID.y)].Planes[3].Normal2 = vec3(ScreenCoords[2]);
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
vec3 EyePos = vec3(0,0,0);
|
vec3 EyePos = vec3(0,0,0);
|
||||||
|
|
||||||
Frustum f;
|
Frustum f;
|
||||||
|
|||||||
@@ -6,66 +6,30 @@
|
|||||||
//in uvec3 gl_GlobalInvocationID;
|
//in uvec3 gl_GlobalInvocationID;
|
||||||
//in uint gl_LocalInvocationIndex;
|
//in uint gl_LocalInvocationIndex;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define NUM_LIGHTS 3
|
#define NUM_LIGHTS 3
|
||||||
#define MAX_LIGHTS_PER_TILE 200
|
#define MAX_LIGHTS_PER_TILE 200
|
||||||
#define NUM_TILES 3600
|
#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 {
|
struct Plane {
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
float d;
|
float d;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Frustum {
|
struct Frustum {
|
||||||
Plane Planes[4];
|
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;
|
layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in;
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
if(gl_LocalInvocationIndex == 0) {
|
if(1 == 1) {
|
||||||
LightIndexList[int(gl_WorkGroupID.x) + int(gl_WorkGroupID.y)*80] = int(gl_WorkGroupID.x);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -90,9 +90,9 @@ void Renderer::InitializeShaders()
|
|||||||
m_CalculateFrustumProgram.Compile();
|
m_CalculateFrustumProgram.Compile();
|
||||||
m_CalculateFrustumProgram.Link();
|
m_CalculateFrustumProgram.Link();
|
||||||
|
|
||||||
m_CalculateFrustumProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/cullLights.comp.glsl")));
|
m_LightCullProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/cullLights.comp.glsl")));
|
||||||
m_CalculateFrustumProgram.Compile();
|
m_LightCullProgram.Compile();
|
||||||
m_CalculateFrustumProgram.Link();
|
m_LightCullProgram.Link();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::InputUpdate(double dt)
|
void Renderer::InputUpdate(double dt)
|
||||||
@@ -357,9 +357,11 @@ void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better lo
|
|||||||
|
|
||||||
void Renderer::InitializeSSBOs()
|
void Renderer::InitializeSSBOs()
|
||||||
{
|
{
|
||||||
|
printf("Size: %i\n", sizeof(m_Frustums));
|
||||||
glGenBuffers(1, &m_FrustumSSBO);
|
glGenBuffers(1, &m_FrustumSSBO);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 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(m_Frustums), &m_Frustums, GL_DYNAMIC_COPY);
|
||||||
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||||
|
|
||||||
GLERROR("m_FrustumSSBO");
|
GLERROR("m_FrustumSSBO");
|
||||||
@@ -367,6 +369,7 @@ void Renderer::InitializeSSBOs()
|
|||||||
glGenBuffers(1, &m_LightSSBO);
|
glGenBuffers(1, &m_LightSSBO);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO);
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_PointLights), &m_PointLights, GL_DYNAMIC_COPY);
|
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);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||||
|
|
||||||
GLERROR("m_LightSSBO");
|
GLERROR("m_LightSSBO");
|
||||||
@@ -375,6 +378,7 @@ void Renderer::InitializeSSBOs()
|
|||||||
glGenBuffers(1, &m_LightGridSSBO);
|
glGenBuffers(1, &m_LightGridSSBO);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 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(m_LightGrid), &m_LightGrid, GL_DYNAMIC_COPY);
|
||||||
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||||
|
|
||||||
GLERROR("m_LightGridSSBO");
|
GLERROR("m_LightGridSSBO");
|
||||||
@@ -383,6 +387,7 @@ void Renderer::InitializeSSBOs()
|
|||||||
glGenBuffers(1, &m_LightOffsetSSBO);
|
glGenBuffers(1, &m_LightOffsetSSBO);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightOffsetSSBO);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightOffsetSSBO);
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY);
|
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, 0);
|
||||||
|
|
||||||
GLERROR("m_LightOffsetSSBO");
|
GLERROR("m_LightOffsetSSBO");
|
||||||
@@ -391,6 +396,7 @@ void Renderer::InitializeSSBOs()
|
|||||||
glGenBuffers(1, &m_LightIndexSSBO);
|
glGenBuffers(1, &m_LightIndexSSBO);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 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(m_LightIndex), &m_LightIndex, GL_DYNAMIC_COPY);
|
||||||
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||||
|
|
||||||
GLERROR("m_LightIndexSSBO");
|
GLERROR("m_LightIndexSSBO");
|
||||||
@@ -399,12 +405,18 @@ void Renderer::InitializeSSBOs()
|
|||||||
|
|
||||||
void Renderer::CalculateFrustum()
|
void Renderer::CalculateFrustum()
|
||||||
{
|
{
|
||||||
|
GLERROR("CalculateFrustum Error-1");
|
||||||
m_CalculateFrustumProgram.Bind();
|
m_CalculateFrustumProgram.Bind();
|
||||||
|
|
||||||
|
GLERROR("CalculateFrustum Error1");
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO);
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO);
|
||||||
|
GLERROR("CalculateFrustum Error2");
|
||||||
glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix()));
|
glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix()));
|
||||||
|
GLERROR("CalculateFrustum Error3");
|
||||||
glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height);
|
glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram.GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height);
|
||||||
glDispatchCompute(m_Resolution.Width / TILE_SIZE, m_Resolution.Height / TILE_SIZE, 1);
|
GLERROR("CalculateFrustum Error4");
|
||||||
GLERROR("CalculateFrustum Error");
|
glDispatchCompute(5, 3, 1);
|
||||||
|
GLERROR("CalculateFrustum Error5");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user