Fixed BlinnPhong shading

This commit is contained in:
Dynamitos
2023-02-27 13:52:57 +01:00
parent f46262b66e
commit f1062e5bcb
15 changed files with 131 additions and 316 deletions
+1 -1
View File
@@ -126,7 +126,7 @@ void BasePass::beginFrame(const Component::Camera& cam)
viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix();
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 0);
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1);
viewParams.screenDimensions = Vector2(static_cast<float>(viewport->getSizeX()), static_cast<float>(viewport->getSizeY()));
uniformUpdate.size = sizeof(ViewParameter);
uniformUpdate.data = (uint8*)&viewParams;
+1 -1
View File
@@ -21,7 +21,7 @@ void DebugPass::beginFrame(const Component::Camera& cam)
viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix();
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 0);
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1);
viewParams.screenDimensions = Vector2(static_cast<float>(viewport->getSizeX()), static_cast<float>(viewport->getSizeY()));
uniformUpdate.size = sizeof(ViewParameter);
uniformUpdate.data = (uint8*)&viewParams;
@@ -110,7 +110,7 @@ void DepthPrepass::beginFrame(const Component::Camera& cam)
viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix();
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 0);
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1);
viewParams.screenDimensions = Vector2(static_cast<float>(viewport->getSizeX()), static_cast<float>(viewport->getSizeY()));
uniformUpdate.size = sizeof(ViewParameter);
uniformUpdate.data = (uint8*)&viewParams;
@@ -25,25 +25,11 @@ void LightCullingPass::beginFrame(const Component::Camera& cam)
BulkResourceData uniformUpdate;
viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix();
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 0);
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1);
viewParams.screenDimensions = Vector2(static_cast<float>(viewportWidth), static_cast<float>(viewportHeight));
uniformUpdate.size = sizeof(ViewParameter);
uniformUpdate.data = (uint8*)&viewParams;
viewParamsBuffer->updateContents(uniformUpdate);
const LightEnv& lightEnv = passData.lightEnv;
uniformUpdate.size = sizeof(DirectionalLight) * MAX_DIRECTIONAL_LIGHTS;
uniformUpdate.data = (uint8*)&lightEnv.directionalLights;
directLightBuffer->updateContents(uniformUpdate);
uniformUpdate.size = sizeof(PointLight) * MAX_POINT_LIGHTS;
uniformUpdate.data = (uint8*)&lightEnv.pointLights;
pointLightBuffer->updateContents(uniformUpdate);
uniformUpdate.size = sizeof(uint32);
uniformUpdate.data = (uint8*)&lightEnv.numDirectionalLights;
numDirLightBuffer->updateContents(uniformUpdate);
uniformUpdate.data = (uint8*)&lightEnv.numPointLights;
numPointLightBuffer->updateContents(uniformUpdate);
BulkResourceData counterReset;
uint32 reset = 0;
@@ -68,10 +54,10 @@ void LightCullingPass::beginFrame(const Component::Camera& cam)
cullingDescriptorSet->updateBuffer(9, frustumBuffer);
lightEnvDescriptorSet->updateBuffer(0, directLightBuffer);
lightEnvDescriptorSet->updateBuffer(1, numDirLightBuffer);
lightEnvDescriptorSet->updateBuffer(2, pointLightBuffer);
lightEnvDescriptorSet->updateBuffer(3, numPointLightBuffer);
lightEnvDescriptorSet->updateBuffer(0, passData.lightEnv.directionalLights);
lightEnvDescriptorSet->updateBuffer(1, passData.lightEnv.numDirectional);
lightEnvDescriptorSet->updateBuffer(2, passData.lightEnv.pointLights);
lightEnvDescriptorSet->updateBuffer(3, passData.lightEnv.numPoints);
lightEnvDescriptorSet->writeChanges();
//std::cout << "LightCulling beginFrame()" << std::endl;
//co_return;
@@ -202,28 +188,6 @@ void LightCullingPass::publishOutputs()
resources->registerBufferOutput("LIGHTCULLING_OLIGHTLIST", oLightIndexList);
resources->registerBufferOutput("LIGHTCULLING_TLIGHTLIST", tLightIndexList);
structInfo = {
.resourceData = {
.size = sizeof(DirectionalLight) * MAX_DIRECTIONAL_LIGHTS,
.data = nullptr,
},
.stride = sizeof(DirectionalLight),
.bDynamic = true,
};
directLightBuffer = graphics->createStructuredBuffer(structInfo);
structInfo.resourceData.size = sizeof(PointLight) * MAX_POINT_LIGHTS;
pointLightBuffer = graphics->createStructuredBuffer(structInfo);
UniformBufferCreateInfo uniformInfo = {
.resourceData = {
.size = sizeof(uint32),
.data = nullptr
},
.bDynamic = true
};
numDirLightBuffer = graphics->createUniformBuffer(uniformInfo);
numPointLightBuffer = graphics->createUniformBuffer(uniformInfo);
resources->registerBufferOutput("DIRECTIONAL_LIGHTS", directLightBuffer);
resources->registerUniformOutput("NUM_DIRECTIONAL_LIGHTS", numDirLightBuffer);
resources->registerBufferOutput("POINT_LIGHTS", pointLightBuffer);
@@ -60,10 +60,6 @@ private:
Gfx::PStructuredBuffer tLightIndexList;
Gfx::PTexture2D oLightGrid;
Gfx::PTexture2D tLightGrid;
Gfx::PStructuredBuffer directLightBuffer;
Gfx::PUniformBuffer numDirLightBuffer;
Gfx::PStructuredBuffer pointLightBuffer;
Gfx::PUniformBuffer numPointLightBuffer;
Gfx::PDescriptorSet lightEnvDescriptorSet;
Gfx::PDescriptorSet cullingDescriptorSet;
Gfx::PDescriptorLayout lightEnvDescriptorLayout;
@@ -83,7 +83,7 @@ void SkyboxRenderPass::beginFrame(const Component::Camera& cam)
viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix();
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 0);
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1);
viewParams.screenDimensions = Vector2(static_cast<float>(viewport->getSizeX()), static_cast<float>(viewport->getSizeY()));
uniformUpdate.size = sizeof(ViewParameter);
uniformUpdate.data = (uint8*)&viewParams;
+27 -4
View File
@@ -18,6 +18,29 @@ Scene::Scene(Gfx::PGraphics graphics)
: graphics(graphics)
, physics(registry)
{
StructuredBufferCreateInfo structInfo = {
.resourceData = {
.size = sizeof(DirectionalLight) * MAX_DIRECTIONAL_LIGHTS,
.data = nullptr,
},
.stride = sizeof(DirectionalLight),
.bDynamic = true,
};
lightEnv.directionalLights = graphics->createStructuredBuffer(structInfo);
structInfo.resourceData.size = sizeof(PointLight) * MAX_POINT_LIGHTS;
lightEnv.pointLights = graphics->createStructuredBuffer(structInfo);
UniformBufferCreateInfo uniformInfo = {
.resourceData = {
.size = sizeof(uint32),
.data = nullptr
},
.bDynamic = true
};
lightEnv.numDirectional = graphics->createUniformBuffer(uniformInfo);
lightEnv.numPoints = graphics->createUniformBuffer(uniformInfo);
}
Scene::~Scene()
@@ -84,12 +107,12 @@ Array<MeshBatch> Scene::getStaticMeshes()
LightEnv Scene::getLightBuffer() const
{
LightEnv result;
result.directionalLights[0].color = Vector4(0.4, 0.3, 0.5, 1.0);
result.directionalLights[0].direction = Vector4(0.5, -0.5, 0, 0);
result.directionalLights[0].intensity = Vector4(1.0, 0.9, 0.7, 0.5);
result.numDirectionalLights = 1;
result.numPointLights = 0;
result.numDirectionalLights = 0;
result.pointLights[0].positionWS = Vector4(0, 50, 0, 0);
result.pointLights[0].colorRange = Vector4(0.2, 0.4, 0.7, 100);
result.numPointLights = 1;
return result;
}
+6 -6
View File
@@ -15,7 +15,6 @@ struct DirectionalLight
{
Vector4 color;
Vector4 direction;
Vector4 intensity;
};
struct PointLight
@@ -29,10 +28,10 @@ struct PointLight
#define MAX_POINT_LIGHTS 256
struct LightEnv
{
DirectionalLight directionalLights[MAX_DIRECTIONAL_LIGHTS];
PointLight pointLights[MAX_POINT_LIGHTS];
uint32 numDirectionalLights;
uint32 numPointLights;
Gfx::PStructuredBuffer directionalLights;
Gfx::PUniformBuffer numDirectional;
Gfx::PStructuredBuffer pointLights;
Gfx::PUniformBuffer numPoints;
};
class Scene
@@ -83,7 +82,8 @@ private:
Vector4 actorLocation;
};
Array<PrimitiveSceneData> sceneData;
Gfx::PStructuredBuffer sceneDataBuffer;
Gfx::PStructuredBuffer sceneDataBuffer;
LightEnv lightEnv;
PhysicsSystem physics;
Gfx::PGraphics graphics;
};