9.8.4 Possible solutions?
1) So what did I do to get the second image at the beginning of this page?
I just made the objects shadowless. This gets rid of the problem of the
surface shadowing the wrong point.
This, of course, has severe problems. Since the object doesn't cast
shadows anymore, it probably can't be used in any real scene (although
making the rocks shadowless in the IRTC winning image mentioned above would
have perhaps helped the image a lot without making it too unrealistic).
With smooth triangle meshes it also introduces another artifact, which
can be seen in the second image at the beginning of the page. I don't know
the exact mechanism of this artifact but it's a direct consequence of the
mesh being shadowless (it may have something to do with the fact that
smooth triangles are double-illuminated in POV-Ray).
2) Perhaps a future version of POV-Ray or one of its patches may introduce
a way to stop self-shadowing (while still casting shadows on other objects).
This would alleviate the problem of the completely shadowless object since
this object could be used in real scenes and they will cast shadows on other
objects and they will not have the shadow line artifact.
However, this solution applies only to a few range of objects (mainly convex
objects). Objects where self-shadowing is essential (imagine a coffee cup,
for example) will still have problems.
3) I have proposed this sophisticated algorithm to get rid of the problem:
When doing shadow ray tests, do the following:
- Make the regular shadow ray test, which gets all the intersections
of the ray with all the surfaces that are between the current point and
the light source.
- Look if in the current point the unperturbed normal vector points
away from the light source and the perturbed normal vector points
towards the light source.
- If so, check if the closest intersection point of the shadow ray belongs
to the current object.
- If so, remove that intersection point from the list.
If we want to be more sure, we could also check if we are hitting the
"inside" of the surface at this closest intersection point and only then
remove it. This might be necessary for non-closed surfaces.
This algorithm will eliminate the shadowline artifact without eliminating
shadowing and self-shadowing of the object.
It has its defects, though:
- For example, if the camera is inside the
object in question (and all the light sources are outside), we would expect
to get a completely shadowed view of the surface. However, if the surface
has perturbed normal, we will see some illuminated parts of the surface.
However, I think that this problem is quite irrelevant in the vast majority
of scenes (and it should be possible to turn the fix off anyways).
- It has several problems which can happen with non-convex objects (thanks
to Ron Parker to pointing this out). The object can shadow itself with
more than one surface. If it shadows itself from the outside (eg. a coffee
cup), there's no problem, but if it "shadows itself" from the inside (eg. a
coffee cup upside down) this shadow will be seen in an unrealistic way in
the outermost surface of the object. There might not be any easy way to
detect, which one is the case.
- Another problem similar to the above is that if there's another object
inside this object we are calculating, that another object will itself also
"cast a shadow" on the surface (this might be possible to fix by ignoring
all the objects inside the current object; this is possible to do in a
rather simple way; however, it's doesn't work in all cases).
- We still get the same artifact in triangle meshes
as is shown in the second image at the beginning of the page. However, I'm
sure that this problem could be fixed as well (although I may be wrong,
of course).