Skip to content

Commit 87c8709

Browse files
committed
1.[ADD]:when adding light, scene will conducted MVP transform on the light pos 2.[BUG STILL REMAIN & UPDATE]:update shadow detection part with square distance calculation
1 parent b392eee commit 87c8709

1 file changed

Lines changed: 17 additions & 9 deletions

File tree

src/Scene.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,18 @@ void SoftRasterizer::Scene::setProjectionMatrix(float fovy, float zNear,
291291
std::vector<SoftRasterizer::light_struct> SoftRasterizer::Scene::loadLights() {
292292
std::vector<SoftRasterizer::light_struct> res(m_lights.size());
293293
std::transform(m_lights.begin(), m_lights.end(), res.begin(),
294-
[](const decltype(m_lights)::value_type &light) {
295-
return *light.second;
294+
[&](const decltype(m_lights)::value_type &light) {
295+
SoftRasterizer::light_struct lightObj = *(light.second);
296+
auto MVP = m_projection * m_view * light.second->getModelMatrix();
297+
lightObj.position = Tools::to_vec3(MVP * glm::vec4(light.second->position, 1.0f));
298+
return lightObj;
296299
});
297300
return res;
298301
}
299302

300303
void SoftRasterizer::Scene::initCameraLight() {
301304
m_cameraLight.reset();
302-
m_cameraLight = std::make_shared<light_struct>(m_eye, glm::vec3(0.f));
305+
m_cameraLight = std::make_shared<light_struct>(m_eye, glm::vec3(0.f), /*axis=*/glm::vec3(0, 1, 0));
303306

304307
addLight("sys_camera", m_cameraLight);
305308
}
@@ -435,9 +438,7 @@ glm::vec3 SoftRasterizer::Scene::whittedRayTracing(
435438
[&](const tbb::blocked_range<std::size_t> &range,
436439
glm::vec3 local_sum) -> glm::vec3 {
437440
for (std::size_t i = range.begin(); i < range.end(); ++i) {
438-
glm::vec3 lightDir = lights[i].position - hitPoint;
439-
float distance = glm::dot(lightDir, lightDir);
440-
lightDir = glm::normalize(lightDir);
441+
glm::vec3 lightDir = glm::normalize(lights[i].position - hitPoint);
441442

442443
// Diffuse reflection (Lambertian)
443444
float diff = std::max(0.f, glm::dot(N, lightDir));
@@ -452,9 +453,16 @@ glm::vec3 SoftRasterizer::Scene::whittedRayTracing(
452453
// Shadow test
453454
Ray shadow_ray(shadowCoord, lightDir);
454455
Intersection shadow_result = traceScene(shadow_ray);
455-
bool is_shadow =
456-
shadow_result.intersected &&
457-
(std::pow(shadow_result.intersect_time, 2.f) < distance);
456+
if (!shadow_result.intersected) {
457+
return glm::vec3{ 0.f };
458+
}
459+
460+
double distance2Light = glm::length2(lights[i].position - hitPoint);
461+
double shadowDistance = glm::length2(shadow_result.coords - shadowCoord);
462+
bool is_shadow = std::abs(shadowDistance - distance2Light) > 1e-2f;
463+
464+
//spdlog::info("ShadowSquare = {}, distance = {}, delta = {}",
465+
// shadowDistance, distance2Light, shadowDistance - distance2Light);
458466

459467
// Compute light contribution
460468
glm::vec3 ambient =

0 commit comments

Comments
 (0)