我目前正在实现一个自定义光线追踪渲染器,我坚持直接照明的问题这里我的结果:
最大值(normalOnLight.dot(sphereNormal),0.0)
我不明白最后一个结果,我认为第一个和第二个是正确的,但不是最后一个(点..)灯是点灯。
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;
}
我的点结果是否正确?因为我认为我的 lightNormalOnSphere 和 sphereNormal 是正确的。