Skip to content

Commit d9879fe

Browse files
committed
Merge branch 'diligent' into particles
2 parents 95857d1 + 7df7ddc commit d9879fe

26 files changed

Lines changed: 246 additions & 268 deletions

Engine/Shaders/PbrHeaderPipeline/pbr_calculation.glsl

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ uniform LightSizes
9191
{
9292
int omniSize;
9393
int dirSize;
94-
int areaSize;
94+
int spotSize;
9595
int padding;
9696
};
9797

@@ -102,6 +102,16 @@ struct Cluster
102102
uint count;
103103
uint lightIndices[MAX_CLUSTER_SIZE];
104104
};
105+
struct SpotData {
106+
vec4 direction;
107+
vec4 diffuse;
108+
vec4 specular;
109+
vec4 position;
110+
float innerCutoff;
111+
float outerCutoff;
112+
vec2 padding;
113+
};
114+
105115

106116
readonly buffer omniData{
107117
OmniData omniData_data[];
@@ -111,6 +121,10 @@ readonly buffer dirData{
111121
DirectionalData dirData_data[];
112122
};
113123

124+
readonly buffer spotData{
125+
SpotData spotData_data[];
126+
};
127+
114128
readonly buffer clusters{
115129
Cluster clusters_data[];
116130
};
@@ -350,6 +364,51 @@ vec3 pbrCalculation(vec3 FragPos, vec3 N, vec3 albedo, vec4 aoSpecular,float rou
350364
}
351365
}
352366

367+
for (int i = 0; i < spotSize; i++) {
368+
vec3 lightPos = vec3(spotData_data[i].position);
369+
vec3 lightDir = normalize(vec3(spotData_data[i].direction));
370+
vec3 toFrag = FragPos - lightPos;
371+
float distanceToLight = length(toFrag);
372+
vec3 L = normalize(-toFrag); // from frag to light
373+
374+
// Spotlight cone factor
375+
float theta = dot(L, normalize(-lightDir));
376+
float innerCutoff = cos(radians(spotData_data[i].innerCutoff)); // inner cone
377+
float outerCutoff = cos(radians(spotData_data[i].outerCutoff)); // outer cone
378+
float epsilon = innerCutoff - outerCutoff;
379+
float intensity = clamp((theta - outerCutoff) / epsilon, 0.0, 1.0);
380+
381+
if (intensity > 0.0) {
382+
vec3 H = normalize(V + L);
383+
384+
// PBR terms
385+
float NDF = DistributionGGX(N, H, roughness);
386+
float G = GeometrySmith(N, V, L, roughness);
387+
vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
388+
389+
vec3 numerator = NDF * G * F;
390+
float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.0001;
391+
vec3 specular = numerator / denominator;
392+
393+
vec3 kS = F * specularMap;
394+
vec3 kD = (vec3(1.0) - kS) * (1.0 - metallic);
395+
396+
// Attenuation
397+
float attenuation = 1.0 / (1.0 + 0.09 * distanceToLight + 0.032 * distanceToLight * distanceToLight);
398+
attenuation *= clamp(1.0 - distanceToLight / 50.0, 0.0, 1.0);
399+
400+
vec3 radiance = vec3(spotData_data[i].diffuse);
401+
402+
// Shadow check (optional)
403+
float shadow = 0.0;
404+
// shadow = SpotShadowCalculation(...); // If implemented
405+
406+
float NdotL = max(dot(N, L), 0.0);
407+
Lo += (kD * albedo / PI + specular) * radiance * NdotL * attenuation * intensity * (1.0 - shadow);
408+
}
409+
410+
}
411+
353412
vec3 fragViewPos = vec3(view * vec4(FragPos, 1.0));
354413
float zView = abs(fragViewPos.z);
355414
uint zTile = uint(log(zView / zNear) * gridSize.z / log(zFar / zNear));

Engine/include/GlobalData/Defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ constexpr int MAX_DIR_LIGHTS = 1024;
1717
constexpr int MAX_OMNI_LIGHTS = 1024;
1818
constexpr int MAX_OMNI_SHADOW = 512;
1919
constexpr int MAX_AREA_LIGHTS = 1024;
20+
constexpr int MAX_SPOT_LIGHTS = 1024;
2021
constexpr int MAX_CLUSTER_SIZE = 100;
2122
constexpr int MAX_BONE_INFLUENCE = 4;
2223
constexpr int MAX_BONES = 128;

Engine/include/GlobalData/GlobalShaderNames.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace Prisma::ShaderNames {
55
const std::string CONSTANT_OMNI_DATA = "omniData";
6+
const std::string CONSTANT_SPOT_DATA = "spotData";
67
const std::string CONSTANT_ANIMATION = "animations";
78
const std::string MUTABLE_OMNI_DATA_SHADOW = "omniShadow";
89
const std::string MUTABLE_DIR_SHADOW = "csmShadow";

Engine/include/Handlers/LightHandler.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@ class LightHandler : public InstanceData<LightHandler> {
1515
std::vector<LightType::LightOmni> lights;
1616
};
1717

18-
struct SSBODataArea {
19-
std::vector<LightType::LightArea> lights;
18+
struct SSBODataSpot {
19+
std::vector<LightType::LightSpot> lights;
2020
};
2121

2222
struct LightSizes {
2323
int omni = 0;
2424
int dir = 0;
25-
int area = 0;
25+
int spot = 0;
2626
int padding = 0;
2727
};
2828

2929
std::shared_ptr<SSBODataDirectional> m_dataDirectional;
3030
std::shared_ptr<SSBODataOmni> m_dataOmni;
31-
std::shared_ptr<SSBODataArea> m_dataArea;
31+
std::shared_ptr<SSBODataSpot> m_dataSpot;
3232

3333

3434
Diligent::RefCntAutoPtr<Diligent::IBuffer> m_omniLights;
@@ -37,11 +37,13 @@ class LightHandler : public InstanceData<LightHandler> {
3737

3838
Diligent::RefCntAutoPtr<Diligent::IBuffer> m_lightSizes;
3939

40+
Diligent::RefCntAutoPtr<Diligent::IBuffer> m_spotLights;
41+
4042
LightSizes m_sizes;
4143

4244
void updateDirectional();
4345

44-
void updateArea();
46+
void updateSpot();
4547

4648
void updateOmni();
4749

@@ -76,7 +78,7 @@ class LightHandler : public InstanceData<LightHandler> {
7678

7779
void update();
7880
Diligent::RefCntAutoPtr<Diligent::IBuffer> lightSizes() const;
79-
std::shared_ptr<SSBODataArea> dataArea() const;
81+
Diligent::RefCntAutoPtr<Diligent::IBuffer> spotLights();
8082

8183
Diligent::RefCntAutoPtr<Diligent::IBuffer> omniLights();
8284
Diligent::RefCntAutoPtr<Diligent::IBuffer> dirLights() const;

Engine/include/SceneData/SceneData.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Light;
1515
namespace LightType {
1616
struct LightDir;
1717
struct LightOmni;
18-
struct LightArea;
18+
struct LightSpot;
1919
}
2020

2121
struct SceneHandler {
@@ -43,7 +43,7 @@ struct Scene {
4343
std::vector<std::shared_ptr<AnimatedMesh>> animateMeshes;
4444
std::vector<std::shared_ptr<Light<LightType::LightDir>>> dirLights;
4545
std::vector<std::shared_ptr<Light<LightType::LightOmni>>> omniLights;
46-
std::vector<std::shared_ptr<Light<LightType::LightArea>>> areaLights;
46+
std::vector<std::shared_ptr<Light<LightType::LightSpot>>> spotLights;
4747
std::vector<std::shared_ptr<Sprite>> sprites;
4848
std::string name;
4949
};

Engine/include/SceneData/SceneExporterLayout.h

Lines changed: 20 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -295,20 +295,15 @@ void to_json(json& j, std::shared_ptr<Node> n) {
295295
j["farPlane"] = light->type().farPlane.x;
296296
j["shadow"] = light->hasShadow();
297297
j["intensity"] = light->intensity();
298-
} else if (std::dynamic_pointer_cast<Light<LightType::LightArea>>(n)) {
299-
j["type"] = "LIGHT_AREA";
300-
auto light = std::dynamic_pointer_cast<Light<LightType::LightArea>>(n);
301-
j["position"][0] = {light->type().position[0].x, light->type().position[0].y,
302-
light->type().position[0].z};
303-
j["position"][1] = {light->type().position[1].x, light->type().position[1].y,
304-
light->type().position[1].z};
305-
j["position"][2] = {light->type().position[2].x, light->type().position[2].y,
306-
light->type().position[2].z};
307-
j["position"][3] = {light->type().position[3].x, light->type().position[3].y,
308-
light->type().position[3].z};
298+
} else if (std::dynamic_pointer_cast<Light<LightType::LightSpot>>(n)) {
299+
j["type"] = "LIGHT_SPOT";
300+
auto light = std::dynamic_pointer_cast<Light<LightType::LightSpot>>(n);
301+
j["position"] = {light->type().position.x, light->type().position.y, light->type().position.z};
309302
j["diffuse"] = {light->type().diffuse.x, light->type().diffuse.y, light->type().diffuse.z};
310-
j["doubleSide"] = light->type().doubleSide;
311-
j["shadow"] = light->hasShadow();
303+
j["specular"] = {light->type().specular.x, light->type().specular.y, light->type().specular.z};
304+
j["direction"] = {light->type().direction.x, light->type().direction.y, light->type().direction.z};
305+
j["innerCutoff"] = light->type().innerCutoff;
306+
j["outerCutoff"] = light->type().outerCutoff;
312307
j["intensity"] = light->intensity();
313308
}
314309

@@ -353,8 +348,8 @@ void from_json(json& j, std::shared_ptr<Node> n) {
353348
child = std::make_shared<Light<LightType::LightDir>>();
354349
} else if (childJson["type"] == "LIGHT_OMNI") {
355350
child = std::make_shared<Light<LightType::LightOmni>>();
356-
} else if (childJson["type"] == "LIGHT_AREA") {
357-
child = std::make_shared<Light<LightType::LightArea>>();
351+
}else if (childJson["type"] == "LIGHT_SPOT") {
352+
child = std::make_shared<Light<LightType::LightSpot>>();
358353
} else if (childJson["type"] == "MESH_ANIMATE") {
359354
child = std::make_shared<AnimatedMesh>();
360355
}
@@ -548,36 +543,18 @@ void from_json(json& j, std::shared_ptr<Node> n) {
548543
float intensity = 1;
549544
j.at("intensity").get_to(intensity);
550545
light->intensity(intensity);
551-
} else if (type == "LIGHT_AREA") {
552-
auto light = std::dynamic_pointer_cast<Light<LightType::LightArea>>(n);
553-
LightType::LightArea lightType;
554-
lightType.position[0] = glm::vec4(j.at("position").at(0).get<std::vector<float>>().at(0),
555-
j.at("position").at(0).get<std::vector<float>>().at(1),
556-
j.at("position").at(0).get<std::vector<float>>().at(2), 1.0);
557-
lightType.position[1] = glm::vec4(j.at("position").at(1).get<std::vector<float>>().at(0),
558-
j.at("position").at(1).get<std::vector<float>>().at(1),
559-
j.at("position").at(1).get<std::vector<float>>().at(2), 1.0);
560-
lightType.position[2] = glm::vec4(j.at("position").at(2).get<std::vector<float>>().at(0),
561-
j.at("position").at(2).get<std::vector<float>>().at(1),
562-
j.at("position").at(2).get<std::vector<float>>().at(2), 1.0);
563-
lightType.position[3] = glm::vec4(j.at("position").at(3).get<std::vector<float>>().at(0),
564-
j.at("position").at(3).get<std::vector<float>>().at(1),
565-
j.at("position").at(3).get<std::vector<float>>().at(2), 1.0);
566-
lightType.diffuse = glm::vec4(j.at("diffuse").get<std::vector<float>>().at(0),
567-
j.at("diffuse").get<std::vector<float>>().at(1),
568-
j.at("diffuse").get<std::vector<float>>().at(2), 1.0);
569-
570-
bool hasShadow = false;
571-
j.at("shadow").get_to(hasShadow);
572-
573-
int doubleSide = 0;
574-
575-
j.at("doubleSide").get_to(doubleSide);
576-
lightType.doubleSide = doubleSide;
577-
light->hasShadow(hasShadow);
578-
light->type(lightType);
546+
} else if (type == "LIGHT_SPOT") {
547+
auto light = std::dynamic_pointer_cast<Light<LightType::LightSpot>>(n);
548+
LightType::LightSpot lightType;
549+
lightType.position = glm::vec4(j.at("position").get<std::vector<float>>().at(0), j.at("position").get<std::vector<float>>().at(1), j.at("position").get<std::vector<float>>().at(2), 1.0);
550+
lightType.diffuse = glm::vec4(j.at("diffuse").get<std::vector<float>>().at(0), j.at("diffuse").get<std::vector<float>>().at(1), j.at("diffuse").get<std::vector<float>>().at(2), 1.0);
551+
lightType.specular = glm::vec4(j.at("specular").get<std::vector<float>>().at(0), j.at("specular").get<std::vector<float>>().at(1), j.at("specular").get<std::vector<float>>().at(2), 1.0);
552+
lightType.direction = glm::vec4(j.at("direction").get<std::vector<float>>().at(0), j.at("direction").get<std::vector<float>>().at(1), j.at("direction").get<std::vector<float>>().at(2), 1.0);
553+
lightType.innerCutoff = j.at("innerCutoff").get<float>();
554+
lightType.outerCutoff = j.at("outerCutoff").get<float>();
579555
float intensity = 1;
580556
j.at("intensity").get_to(intensity);
557+
light->type(lightType);
581558
light->intensity(intensity);
582559
} else if (type == "MESH_ANIMATE") {
583560
auto mesh = std::dynamic_pointer_cast<AnimatedMesh>(n);

Engine/include/SceneObjects/Light.h

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,15 @@ struct LightOmni {
3131
float radius = 1;
3232
};
3333

34-
struct LightArea {
35-
glm::vec4 position[4] = {
36-
glm::vec4(1.0f, -1.0f, 0.0f, 1.0f), // Bottom-right
37-
glm::vec4(1.0f, 1.0f, 0.0f, 1.0f), // Top-right
38-
glm::vec4(-1.0f, 1.0f, 0.0f, 1.0f), // Top-left
39-
glm::vec4(-1.0f, -1.0f, 0.0f, 1.0f) // Bottom-left
40-
};
34+
struct LightSpot {
35+
glm::vec4 direction = glm::vec4(0, -1, 0, 0);
4136
glm::vec4 diffuse = glm::vec4(1, 1, 1, 0);
42-
uint64_t shadowMap = 0;
43-
int doubleSide = 1;
44-
float padding;
37+
glm::vec4 specular = glm::vec4(1, 1, 1, 0);
38+
glm::vec4 position = glm::vec4(0, 0, 0, 0);
39+
float innerCutoff=12.5;
40+
float outerCutoff=17.5;
41+
glm::vec2 padding;
42+
4543
};
4644
};
4745

Engine/src/Components/InstancingComponent.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ void Prisma::InstancingComponent::start() {
114114
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_VIEW_PROJECTION.c_str(), 1, SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
115115
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_LIGHT_SIZES.c_str(), 1, SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
116116
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_OMNI_DATA.c_str(), 1, SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
117+
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_SPOT_DATA.c_str(), 1, SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
118+
117119
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_DIR_DATA.c_str(), 1, SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
118120
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_CLUSTERS.c_str(), 1, SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
119121
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_CLUSTERS_DATA.c_str(), 1, SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
@@ -175,6 +177,9 @@ void Prisma::InstancingComponent::start() {
175177

176178
m_pResourceSignature->GetStaticVariableByName(SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_OMNI_DATA.c_str())->Set(LightHandler::getInstance().omniLights()->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE));
177179

180+
m_pResourceSignature->GetStaticVariableByName(SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_SPOT_DATA.c_str())->Set(LightHandler::getInstance().spotLights()->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE));
181+
182+
178183
m_pResourceSignature->GetStaticVariableByName(SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_DIR_DATA.c_str())->Set(LightHandler::getInstance().dirLights()->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE));
179184

180185
m_pResourceSignature->GetStaticVariableByName(SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_CLUSTERS.c_str())->Set(LightHandler::getInstance().clusters().clusters->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE));

Engine/src/Components/WaterComponent.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ void Prisma::WaterComponent::start() {
185185
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_VIEW_PROJECTION.c_str(), 1, SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
186186
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_LIGHT_SIZES.c_str(), 1, SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
187187
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_OMNI_DATA.c_str(), 1, SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
188+
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_SPOT_DATA.c_str(), 1, SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
189+
188190
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_DIR_DATA.c_str(), 1, SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
189191
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_CLUSTERS.c_str(), 1, SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
190192
{SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_CLUSTERS_DATA.c_str(), 1, SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
@@ -245,6 +247,8 @@ void Prisma::WaterComponent::start() {
245247

246248
m_pResourceSignature->GetStaticVariableByName(SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_OMNI_DATA.c_str())->Set(LightHandler::getInstance().omniLights()->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE));
247249

250+
m_pResourceSignature->GetStaticVariableByName(SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_SPOT_DATA.c_str())->Set(LightHandler::getInstance().spotLights()->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE));
251+
248252
m_pResourceSignature->GetStaticVariableByName(SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_DIR_DATA.c_str())->Set(LightHandler::getInstance().dirLights()->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE));
249253

250254
m_pResourceSignature->GetStaticVariableByName(SHADER_TYPE_PIXEL, ShaderNames::CONSTANT_CLUSTERS.c_str())->Set(LightHandler::getInstance().clusters().clusters->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE));

0 commit comments

Comments
 (0)