fixes
This commit is contained in:
@@ -67,6 +67,7 @@ private:
|
|||||||
glm::vec3 Normal;
|
glm::vec3 Normal;
|
||||||
float d;
|
float d;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Frustum {
|
struct Frustum {
|
||||||
Plane Planes[4];
|
Plane Planes[4];
|
||||||
};
|
};
|
||||||
@@ -90,6 +91,7 @@ private:
|
|||||||
float Amount;
|
float Amount;
|
||||||
glm::vec2 Padding;
|
glm::vec2 Padding;
|
||||||
};
|
};
|
||||||
|
|
||||||
LightGrid m_LightGrid[80*45];
|
LightGrid m_LightGrid[80*45];
|
||||||
|
|
||||||
int m_LightOffset = 0;
|
int m_LightOffset = 0;
|
||||||
|
|||||||
@@ -5,11 +5,18 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Orientation X="0" Y="0" Z="0"/>
|
<Orientation X="0" Y="0" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/DummyScene.obj</Resource>
|
|
||||||
</c:Model>
|
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="100" Y="100" Z="100"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitPlane.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
</Components>
|
||||||
|
</Entity>
|
||||||
<Entity>
|
<Entity>
|
||||||
<Components>
|
<Components>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ uniform vec4 Color;
|
|||||||
|
|
||||||
uniform sampler2D texture0;
|
uniform sampler2D texture0;
|
||||||
|
|
||||||
|
#define TILE_SIZE 16
|
||||||
|
|
||||||
struct PointLight {
|
struct PointLight {
|
||||||
vec4 Position;
|
vec4 Position;
|
||||||
@@ -48,7 +49,7 @@ in VertexData{
|
|||||||
|
|
||||||
out vec4 fragmentColor;
|
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 {
|
struct LightResult {
|
||||||
vec4 Diffuse;
|
vec4 Diffuse;
|
||||||
@@ -98,10 +99,10 @@ void main()
|
|||||||
|
|
||||||
LightResult totalLighting;
|
LightResult totalLighting;
|
||||||
totalLighting.Diffuse = scene_ambient;
|
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[currentTile].Start);
|
||||||
int start = int(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Start);
|
int amount = int(LightGrids.Data[currentTile].Amount);
|
||||||
int amount = int(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount);
|
|
||||||
//for(int i = 0; i < 3; i++)
|
//for(int i = 0; i < 3; i++)
|
||||||
for(int i = start; i < start + amount; 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 += Input.DiffuseColor * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color;
|
||||||
|
fragmentColor += vec4(LightGrids.Data[currentTile].Amount/3.0, 0, 0, 1);
|
||||||
//fragmentColor = texel * Input.DiffuseColor * Color;
|
//fragmentColor = texel * Input.DiffuseColor * Color;
|
||||||
if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 )
|
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 {
|
} else {
|
||||||
//fragmentColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/3.0, 0, 0, 1);
|
//fragmentColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/3.0, 0, 0, 1);
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ struct Frustum {
|
|||||||
|
|
||||||
layout (std430, binding = 0) buffer FrustumBuffer
|
layout (std430, binding = 0) buffer FrustumBuffer
|
||||||
{
|
{
|
||||||
Frustum Data[3600];
|
Frustum Data[];
|
||||||
} Frustums;
|
} Frustums;
|
||||||
|
|
||||||
vec4 ConvertToView(vec4 ScreenCoords)
|
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;
|
layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in;
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
if(gl_GlobalInvocationID.x * TILE_SIZE < ScreenDimensions.x && gl_GlobalInvocationID.y * TILE_SIZE < ScreenDimensions.y) {
|
//Top-Left = 0 | Top-Right = 1
|
||||||
//Top-Left = 0 | Top-Right = 1
|
//Bottom-Left = 2 | Bottom-Right = 3
|
||||||
//Bottom-Left = 2 | Bottom-Right = 3
|
vec4 ScreenCoords[4];
|
||||||
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); // 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[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[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);
|
||||||
ScreenCoords[3] = vec4((gl_GlobalInvocationID.x + 1) * TILE_SIZE, (gl_GlobalInvocationID.y) * TILE_SIZE, -1.0, 1.0);
|
|
||||||
|
|
||||||
vec3 ViewVectors[4];
|
vec3 ViewVectors[4];
|
||||||
for(int i = 0; i < 4; i++) {
|
for(int i = 0; i < 4; i++) {
|
||||||
ViewVectors[i] = vec3(ConvertToView(ScreenCoords[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 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;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@ struct Frustum {
|
|||||||
|
|
||||||
layout (std430, binding = 0) buffer FrustumBuffer
|
layout (std430, binding = 0) buffer FrustumBuffer
|
||||||
{
|
{
|
||||||
Frustum Data[3600];
|
Frustum Data[];
|
||||||
} Frustums;
|
} Frustums;
|
||||||
|
|
||||||
struct PointLight {
|
struct PointLight {
|
||||||
@@ -111,11 +111,9 @@ void main ()
|
|||||||
if(gl_LocalInvocationIndex == 0)
|
if(gl_LocalInvocationIndex == 0)
|
||||||
{
|
{
|
||||||
GroupLightCount = 0;
|
GroupLightCount = 0;
|
||||||
|
|
||||||
GroupFrustum = Frustums.Data[GroupIndex];
|
GroupFrustum = Frustums.Data[GroupIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
memoryBarrierShared();
|
|
||||||
barrier();
|
barrier();
|
||||||
|
|
||||||
for(int i = int(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)
|
||||||
@@ -124,7 +122,7 @@ void main ()
|
|||||||
|
|
||||||
//if pointlight
|
//if pointlight
|
||||||
//Pos i view antagligen
|
//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.
|
//TODO: Fix transparent and opaque list, and depth test.
|
||||||
AppendLight( i );
|
AppendLight( i );
|
||||||
@@ -137,20 +135,15 @@ void main ()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memoryBarrierShared();
|
|
||||||
barrier();
|
barrier();
|
||||||
|
|
||||||
if(gl_LocalInvocationIndex == 0)
|
if(gl_LocalInvocationIndex == 0)
|
||||||
{
|
{
|
||||||
GroupLightIndexStartOffset = atomicAdd(LightOffset[0], GroupLightCount);
|
GroupLightIndexStartOffset = atomicAdd(LightOffset[0], GroupLightCount);
|
||||||
LightGrid g;
|
LightGrids.Data[GroupIndex].Start = GroupLightIndexStartOffset;
|
||||||
g.Start = GroupLightIndexStartOffset;
|
LightGrids.Data[GroupIndex].Amount = GroupLightCount;
|
||||||
g.Amount = GroupLightCount;
|
|
||||||
g.Padding = vec2(1111, 1111);
|
|
||||||
LightGrids.Data[GroupIndex] = g;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memoryBarrierShared();
|
|
||||||
barrier();
|
barrier();
|
||||||
|
|
||||||
for (uint i = gl_LocalInvocationIndex; i < GroupLightCount; i += TILE_SIZE * TILE_SIZE )
|
for (uint i = gl_LocalInvocationIndex; i < GroupLightCount; i += TILE_SIZE * TILE_SIZE )
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ void Renderer::CalculateFrustum()
|
|||||||
void Renderer::TEMPCreateLights()
|
void Renderer::TEMPCreateLights()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < NUM_LIGHTS; i++) {
|
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].Color = glm::vec4(1.f, 0.5f, 0.f + i*0.1f, 1.f);
|
||||||
m_PointLights[i].Radius = 2.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);
|
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY);
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
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();
|
m_LightCullProgram->Bind();
|
||||||
glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix()));
|
glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "V"), 1, false, glm::value_ptr(m_Camera->ViewMatrix()));
|
||||||
|
|||||||
Reference in New Issue
Block a user