Removing limit for point lights

This commit is contained in:
Dynamitos
2024-02-01 17:08:13 +01:00
parent f9a89f6592
commit 36aec0fa06
8 changed files with 76 additions and 16 deletions
+21 -1
View File
@@ -13,9 +13,29 @@ struct ComputeShaderInput
[shader("compute")] [shader("compute")]
void computeFrustums(ComputeShaderInput in) void computeFrustums(ComputeShaderInput in)
{ {
const float3 topLeft = float3(-1, -1, -1);
const float3 topRight = float3(1, -1, -1);
const float3 bottomLeft = float3(-1, 1, -1);
const float3 origin = float3(0, 0, 0);
float3 xStep = (topRight - topLeft) / pDispatchParams.numThreads.x;
float3 yStep = (bottomLeft - topLeft) / pDispatchParams.numThreads.y;
float3 corners[4] = {
topLeft + (in.dispatchThreadID.x + 0) * xStep + (in.dispatchThreadID.y + 0) * yStep,
topLeft + (in.dispatchThreadID.x + 1) * xStep + (in.dispatchThreadID.y + 0) * yStep,
topLeft + (in.dispatchThreadID.x + 0) * xStep + (in.dispatchThreadID.y + 1) * yStep,
topLeft + (in.dispatchThreadID.x + 1) * xStep + (in.dispatchThreadID.y + 1) * yStep
};
Frustum frustum;
frustum.basePlane.n = float3(0, 0, -1);
frustum.basePlane.d = 0;
frustum.sides[0] = computePlane(origin, corners[0], corners[2]);
frustum.sides[1] = computePlane(origin, corners[3], corners[1]);
frustum.sides[2] = computePlane(origin, corners[1], corners[0]);
frustum.sides[3] = computePlane(origin, corners[2], corners[3]);
if(in.dispatchThreadID.x < pDispatchParams.numThreads.x && in.dispatchThreadID.y < pDispatchParams.numThreads.y) if(in.dispatchThreadID.x < pDispatchParams.numThreads.x && in.dispatchThreadID.y < pDispatchParams.numThreads.y)
{ {
uint index = in.dispatchThreadID.x + (in.dispatchThreadID.y * pDispatchParams.numThreads.x); uint index = in.dispatchThreadID.x + (in.dispatchThreadID.y * pDispatchParams.numThreads.x);
//pDispatchParams.frustums[index] = frustum; pDispatchParams.frustums[index] = frustum;
} }
} }
+1 -3
View File
@@ -99,7 +99,7 @@ void cullLights(ComputeShaderInput in)
{ {
PointLight light = pLightEnv.pointLights[i]; PointLight light = pLightEnv.pointLights[i];
//TODO: why doesn't this check go through? //TODO: why doesn't this check go through?
//if(light.insideFrustum(groupFrustum, nearClipVS, maxDepthVS)) if(light.insideFrustum(groupFrustum, nearClipVS, maxDepthVS))
{ {
tAppendLight(i); tAppendLight(i);
if(!light.insidePlane(minPlane)) if(!light.insidePlane(minPlane))
@@ -131,6 +131,4 @@ void cullLights(ComputeShaderInput in)
{ {
pCullingParams.tLightIndexList[tLightIndexStartOffset + k] = tLightList[k]; pCullingParams.tLightIndexList[tLightIndexStartOffset + k] = tLightList[k];
} }
} }
@@ -8,6 +8,12 @@ DirectionalLightActor::DirectionalLightActor(PScene scene)
attachComponent<Component::DirectionalLight>(); attachComponent<Component::DirectionalLight>();
} }
DirectionalLightActor::DirectionalLightActor(PScene scene, Vector color, Vector direction)
: Actor(scene)
{
attachComponent<Component::DirectionalLight>(Vector4(color, 0), Vector4(direction, 0));
}
DirectionalLightActor::~DirectionalLightActor() DirectionalLightActor::~DirectionalLightActor()
{ {
+1
View File
@@ -8,6 +8,7 @@ class DirectionalLightActor : public Actor
{ {
public: public:
DirectionalLightActor(PScene scene); DirectionalLightActor(PScene scene);
DirectionalLightActor(PScene scene, Vector color, Vector direction);
virtual ~DirectionalLightActor(); virtual ~DirectionalLightActor();
Component::DirectionalLight& getDirectionalLightComponent(); Component::DirectionalLight& getDirectionalLightComponent();
const Component::DirectionalLight& getDirectionalLightComponent() const; const Component::DirectionalLight& getDirectionalLightComponent() const;
+6
View File
@@ -8,6 +8,12 @@ PointLightActor::PointLightActor(PScene scene)
attachComponent<Component::PointLight>(); attachComponent<Component::PointLight>();
} }
PointLightActor::PointLightActor(PScene scene, Vector position, Vector color, float attenuation)
: Actor(scene)
{
attachComponent<Component::PointLight>(Vector4(position, 1), Vector4(color, attenuation));
}
PointLightActor::~PointLightActor() PointLightActor::~PointLightActor()
{ {
+1
View File
@@ -8,6 +8,7 @@ class PointLightActor : public Actor
{ {
public: public:
PointLightActor(PScene scene); PointLightActor(PScene scene);
PointLightActor(PScene scene, Vector position, Vector color, float attenuation);
virtual ~PointLightActor(); virtual ~PointLightActor();
Component::PointLight& getPointLightComponent(); Component::PointLight& getPointLightComponent();
const Component::PointLight& getPointLightComponent() const; const Component::PointLight& getPointLightComponent() const;
+38 -10
View File
@@ -20,18 +20,18 @@ LightEnvironment::LightEnvironment(Gfx::PGraphics graphics)
}); });
directionalLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{ directionalLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{
.sourceData = { .sourceData = {
.size = sizeof(Component::DirectionalLight) * MAX_DIRECTIONAL_LIGHTS, .size = sizeof(Component::DirectionalLight) * INIT_DIRECTIONAL_LIGHTS,
.data = nullptr, .data = nullptr,
}, },
.numElements = MAX_DIRECTIONAL_LIGHTS, .numElements = INIT_DIRECTIONAL_LIGHTS,
.dynamic = true, .dynamic = true,
}); });
pointLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{ pointLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{
.sourceData = { .sourceData = {
.size = sizeof(Component::PointLight) * MAX_POINT_LIGHTS, .size = sizeof(Component::PointLight) * INIT_POINT_LIGHTS,
.data = nullptr, .data = nullptr,
}, },
.numElements = MAX_POINT_LIGHTS, .numElements = INIT_POINT_LIGHTS,
.dynamic = true, .dynamic = true,
}); });
} }
@@ -66,14 +66,42 @@ void LightEnvironment::commit()
.size = sizeof(LightEnv), .size = sizeof(LightEnv),
.data = (uint8*) & lightEnv, .data = (uint8*) & lightEnv,
}); });
directionalLights->updateContents(DataSource{ if(directionalLights->getNumElements() < dirs.size())
.size = sizeof(Component::DirectionalLight) * dirs.size(), {
.data = (uint8*)dirs.data(), directionalLights = graphics->createShaderBuffer({
.sourceData = {
.size = sizeof(Component::DirectionalLight) * dirs.size(),
.data = (uint8*)dirs.data(),
},
.numElements = dirs.size(),
.dynamic = true,
}); });
pointLights->updateContents(DataSource{ }
.size = sizeof(Component::PointLight) * points.size(), else
.data = (uint8*)points.data(), {
directionalLights->updateContents(DataSource{
.size = sizeof(Component::DirectionalLight) * dirs.size(),
.data = (uint8*)dirs.data(),
});
}
if(pointLights->getNumElements() < points.size())
{
pointLights = graphics->createShaderBuffer({
.sourceData = {
.size = sizeof(Component::PointLight) * points.size(),
.data = (uint8*)points.data()
},
.numElements = points.size(),
.dynamic = true
}); });
}
else
{
pointLights->updateContents(DataSource{
.size = sizeof(Component::PointLight) * points.size(),
.data = (uint8*)points.data(),
});
}
set->updateBuffer(0, lightEnvBuffer); set->updateBuffer(0, lightEnvBuffer);
set->updateBuffer(1, directionalLights); set->updateBuffer(1, directionalLights);
set->updateBuffer(2, pointLights); set->updateBuffer(2, pointLights);
+2 -2
View File
@@ -18,8 +18,8 @@ public:
const Gfx::PDescriptorLayout getDescriptorLayout() const; const Gfx::PDescriptorLayout getDescriptorLayout() const;
Gfx::PDescriptorSet getDescriptorSet(); Gfx::PDescriptorSet getDescriptorSet();
private: private:
#define MAX_DIRECTIONAL_LIGHTS 4 #define INIT_DIRECTIONAL_LIGHTS 4
#define MAX_POINT_LIGHTS 256 #define INIT_POINT_LIGHTS 256
struct LightEnv struct LightEnv
{ {
uint32 numDirectionalLights; uint32 numDirectionalLights;