188.8.131.52 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 does not cast shadows anymore, it probably cannot 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 do not know the exact mechanism of this artifact but it is 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
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
is 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 is 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 is
does not 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 am sure that this problem could be fixed as well (although I may be wrong, of course).