I am currently implementing a custom ray tracing renderer and I am stick with problem of direct illumination Here my result :
max(normalOnLight.dot(sphereNormal), 0.0)
I do not understand the last result, i think the first and the second are right but not the last (the dot..) the light is a point light.
const Vec4<double> LambertianSampler::radiance(const Ray& ray, const Scene& scene) const
{
Context ctx;
ctx.setCamtoWorld(scene.getCamera()->getLookAt());
Vec4<double> maxColor(1.0, 1.0, 1.0, 1.0);
Vec4<double> ambient(0.4, 0.4, 0.4, 1.0);
Vec4<double> finaleRadiance = ambient;
for(const auto & light : scene.getLights())
{
for(const auto & shape : scene.getShapes())
{
shape->intersect(ray, ctx);
}
if(ctx.intersectionFound())
{
Vec3<double> lightPosition = light->getPos();
Vec4<double> lightColor = light->getRadiance();
Vec3<double> lightNormal = ctx.getPoint() - lightPosition;
lightNormal = Vec3<double>(std::fabs(lightNormal.x()), std::fabs(lightNormal.y()), std::fabs(lightNormal.z()));
lightNormal.normalize();
Vec3<double> sphereNormal = ctx.getNormal();
sphereNormal = Vec3<double>(std::fabs(sphereNormal.x()), std::fabs(sphereNormal.y()), std::fabs(sphereNormal.z())) ;
sphereNormal.normalize();
double dot = lightNormal.dot(sphereNormal);
finaleRadiance = maxColor*std::max(0.0,dot);
finaleRadiance = Vec4<double>(finaleRadiance.x(), finaleRadiance.y(), finaleRadiance.z(), 1.0);
//finaleRadiance = Vec4<double>(sphereNormal.x(), sphereNormal.y(), sphereNormal.z(), 1.0);
//finaleRadiance = Vec4<double>(lightNormal.x(), lightNormal.y(), lightNormal.z(), 1.0);
}
}
return finaleRadiance;
}
Do my dot result is right ? because i think my lightNormalOnSphere and sphereNormal are right i think ..
I fix my problem by remplace the :
lightNormal = Vec3<double>(std::fabs(lightNormal.x()), std::fabs(lightNormal.y()), std::fabs(lightNormal.z()));
by
lightNormal = Vec3<double>((lightNormal.x()+1)*0.5, (lightNormal.y()+1)*0.5, (lightNormal.z()+1)*0.5);