Hello again. I noticed that, when having two lights, it's like one of them over-writes the other's color (for the specular highlights). Here's what I mean:

If I remove one of the two lights, it is shown correctly.
Here is my shade function. Is there anything wrong?
Vector3 shade(HitInfo hitInfo, ref Scene scene) const
{
Vector3 finalColor = Vector3(0.0f, 0.0f, 0.0f); // the final color
// normalize the surface normal
hitInfo.surfaceNormal.normalize();
foreach(light; scene.lights)
{
Vector3 lightVector = light.position - hitInfo.hitPoint; // vector from the hit point to the light
lightVector.normalize();
HitInfo hitInfo2;
Ray ray = {hitInfo.hitPoint, light.position - hitInfo.hitPoint};
ray.d.normalize();
if( !scene.trace(ray, hitInfo2, 0.1f) )
{
// diffuse shading
if( hitInfo.surfaceNormal.dot(lightVector) > 0 )
{
finalColor = finalColor + light.I * color * hitInfo.surfaceNormal.dot(lightVector);
hitInfo.ray = -hitInfo.ray;
hitInfo.ray.normalize();
// specular shading
Vector3 H = (lightVector + hitInfo.ray) * 0.5f; // find the half vector, H
H.normalize();
float specularDotProduct = dot(hitInfo.surfaceNormal, H);
if( specularDotProduct > 0.0f )
finalColor = finalColor + light.I * std.math.pow(specularDotProduct, 10.0f);
}
}
else
{
// no color is added, shadow is shown
}
}
return finalColor;
}
By the way, I have triangles now! I will write an .obj loader soon, and I will have 3D meshes!!! ![]()