1.4.3.4 Can I specify variable IOR for an object?
"Can I specify variable IOR for an object? Is there any patch that can do this? Is it possible?"
Short answer: No.
Long answer:
There are basically two ways of defining variable IOR for an object: IOR changing on the surface of the object and
IOR changing throughout inside the object.
The first one is physically incorrect. For uniform IOR it simulates physical IOR quite correctly since for objects
with uniform density the light bends at the surface of the object and nowhere else. However if the density of the
object is not uniform but changes throughout its volume, the light will bend inside the object, while travelling
through it, not only on the surface of the object.
This is why variable IOR on the surface of the object is incorrect and the possibility of making this was removed
in POV-Ray 3.1.
From this we can deduce that a constant IOR is kind of property of the surface of the object while variable IOR is
a property of the interior of the object (like media in POV-Ray). Of course the physically correct interpretation of
this phenomenon is that IOR is always a property of the whole object (ie. its interior), not only its surface (and
this is why IOR is now a property of the interior of the object in POV-Ray); however, the effect of a constant IOR has
effect only at the surface of the object and this is what POV-Ray does when bending the rays.
The correct simulation for variable IOR, thus, would be to bend the ray inside the object depending on the density
of the interior of the object at each point.
This is much harder to do than one may think. The reasons are similar to why non-uniform transformations are too
difficult to calculate reasonably (as far as I know there exists no renderer that calculates true non-uniform
transformations; mesh modellers just move the vertices, they do not actually transform the object; a true non-uniform
transformation would bend the triangles). Moreover: Non-uniform transformations can be faked if the object is made of
many polygons (you can move the vertices as most mesh modellers do), but you cannot fake a variable IOR in this way.
Variable IOR is (mostly) impossible to calculate analytically (ie. in a mathematically exact way) at least in a
reasonable time. The only way would be to calculate it numerically (usually by super-sampling).
Media in POV-Ray works in this way. It does not even try to analytically solve the color of the media, but
supersamples the media along the ray and averages the result. This can be pretty inaccurate as we can see with the
media method 1 (the only one which was supported in POV-Ray 3.1). However some tricks can be used to make the result
more accurate without having to spend too much time, for example antialiasing (which is used by the media method 3).
This is a quite easy calculation because the ray is straight, POV-Ray knows the start and end points of the ray and it
knows that it does not intersect with anything along the ray (so it does not have to make ray-object intersection
calculations while supersampling).
Variable IOR is, however, a completely different story. Here the program would have to shoot a LOT of rays along
the path of the bending light ray. For each ray it would have to make all the regular ray-object intersection
calculations. It is like having hundreds or thousands of transparent objects one inside another (with max_trace_level
set so high that the ray will go through all of them). You can easily test how slow this is. It is very
slow.
One could think that "hey, why not just shoot a few tens of rays and then use some kind of antialiasing to get
the fine details, like in media method 3".
Well, it might work (I have never seen it tested), but I do not think it will help much. The problem is the
inaccuracy of the supersampling (even when using antialiasing). In media it is not a big problem; if a very small
shadowed area in the media is not detected by the supersampling process, the result will not differ very much from the
correct one (since the shadowed area was so small it would have diminished the brightness of that ray just a bit but
no more) and it will probably still look good.
With IOR this is not anymore true. With IOR even very, very small areas may have very strong effect in the end
result, since IOR can drastically change the direction of the ray thus making the result completely different (even
very small changes can have great effect if the object behind the current refracting object is far away).
This can have disastrous effects. The ior may change drastically from pixel to pixel almost at random, not to talk
from frame to frame in an animation. To get a more or less accurate result lots of rays would be needed; just a
few rays is not enough. And shooting lots of rays is an extremely slow process.
|