The final part of a POV-Ray texture is the finish
. It controls the properties of the surface of an object. It can make it shiny and reflective, or dull and flat. It can also specify what happens to light that passes through transparent pigments, what happens to light that is scattered by less-than-perfectly-smooth surfaces and what happens to light that is reflected by surfaces with thin-film interference properties. There are twelve different properties available in POV-Ray to specify the finish of a given object. These are controlled by the following keywords: ambient
, diffuse
, brilliance
, phong
, specular
, metallic
, reflection
, crand
and iridescence
. Let's design a couple of textures that make use of these parameters.
Since objects in POV-Ray are illuminated by light sources, the portions of those objects that are in shadow would be completely black were it not for the first two finish properties, ambient
and diffuse
. Ambient is used to simulate the light that is scattered around the scene that does not come directly from a light source. Diffuse determines how much of the light that is seen comes directly from a light source. These two keywords work together to control the simulation of ambient light. Let's use our gray sphere to demonstrate this. Let's also change our plane back to its original green and white checkered pattern.
plane {y,-1.5 pigment {checker Green, White} } sphere { <0,0,0>, 1 pigment {Gray75} finish { ambient .2 diffuse .6 }
In the above example, the default values for ambient and diffuse are used. We render this to see what the effect is and then make the following change to the finish.
ambient 0 diffuse 0
The sphere is black because we have specified that none of the light coming from any light source will be reflected by the sphere. Let's change diffuse
back to the default of 0.6.
Now we see the gray surface color where the light from the light source falls directly on the sphere but the shaded side is still absolutely black. Now let's change diffuse
to 0.3 and ambient
to 0.3.
The sphere now looks almost flat. This is because we have specified a fairly high degree of ambient light and only a low amount of the light coming from the light source is diffusely reflected towards the camera. The default values of ambient
and diffuse
are pretty good averages and a good starting point. In most cases, an ambient value of 0.1 ... 0.2 is sufficient and a diffuse value of 0.5 ... 0.7 will usually do the job. There are a couple of exceptions. If we have a completely transparent surface with high refractive and/or reflective values, low values of both ambient and diffuse may be best. Here is an example:
sphere { <0,0,0>, 1 pigment { White filter 1 } finish { ambient 0 diffuse 0 reflection .25 specular 1 roughness .001 } interior{ior 1.33} }
This is glass, obviously. Glass is a material that takes nearly all of its appearance from its surroundings. Very little of the surface is seen because it transmits or reflects practically all of the light that shines on it. See glass.inc
for some other examples.
If we ever need an object to be completely illuminated independently of the lighting situation in a given scene we can do this artificially by specifying an ambient
value of 1 and a diffuse
value of 0. This will eliminate all shading and simply give the object its fullest and brightest color value at all points. This is good for simulating objects that emit light like light bulbs and for skies in scenes where the sky may not be adequately lit by any other means.
Let's try this with our sphere now.
sphere { <0,0,0>, 1 pigment { White } finish { ambient 1 diffuse 0 } }
Rendering this we get a blinding white sphere with no visible highlights or shaded parts. It would make a pretty good streetlight.
In the glass example above, we noticed that there were bright little hotspots on the surface. This gave the sphere a hard, shiny appearance. POV-Ray gives us two ways to specify surface specular highlights. The first is called Phong highlighting. Usually, Phong highlights are described using two keywords: phong
and phong_size
. The float that follows phong
determines the brightness of the highlight while the float following phong_size
determines its size. Let's try this.
sphere { <0,0,0>, 1 pigment { Gray50 } finish { ambient .2 diffuse .6 phong .75 phong_size 25 } }
Rendering this we see a fairly broad, soft highlight that gives the sphere a kind of plastic appearance. Now let's change phong_size
to 150. This makes a much smaller highlight which gives the sphere the appearance of being much harder and shinier.
There is another kind of highlight that is calculated by a different means called specular highlighting. It is specified using the keyword specular
and operates in conjunction with another keyword called roughness
. These two keywords work together in much the same way as phong
and phong_size
to create highlights that alter the apparent shininess of the surface. Let's try using specular in our sphere.
sphere { <0,0,0>, 1 pigment { Gray50 } finish { ambient .2 diffuse .6 specular .75 roughness .1 } }
Looking at the result we see a broad, soft highlight similar to what we had when we used phong_size
of 25. Change roughness
to .001 and render again. Now we see a small, tight highlight similar to what we had when we used phong_size
of 150. Generally speaking, specular is slightly more accurate and therefore slightly more realistic than phong but you should try both methods when designing a texture. There are even times when both phong and specular may be used on a finish.
There is another surface parameter that goes hand in hand with highlights, reflection
. Surfaces that are very shiny usually have a degree of reflection to them. Let's take a look at an example.
sphere { <0,0,0>, 1 pigment { Gray50 } finish { ambient .2 diffuse .6 specular .75 roughness .001 reflection .5 } }
We see that our sphere now reflects the green and white checkered plane and the black background but the gray color of the sphere seems out of place. This is another time when a lower diffuse value is needed. Generally, the higher reflection
is the lower diffuse
should be. We lower the diffuse value to 0.3 and the ambient value to 0.1 and render again. That is much better. Let's make our sphere as shiny as a polished gold ball bearing.
sphere { <0,0,0>, 1 pigment { BrightGold } finish { ambient .1 diffuse .1 specular 1 roughness .001 reflection .75 } }
That is very close but there is something wrong with the highlight. To make the surface appear more like metal the keyword metallic
is used. We add it now to see the difference.
sphere { <0,0,0>, 1 pigment { BrightGold } finish { ambient .1 diffuse .1 specular 1 roughness .001 reflection .75 metallic } }
We see that the highlight has taken on the color of the surface rather than the light source. This gives the surface a more metallic appearance.
Iridescence is what we see on the surface of an oil slick when the sun shines on it. The rainbow effect is created by something called thin-film interference (read section "Iridescence" for details). For now let's just try using it. Iridescence is specified by the irid
statement and three values: amount, thickness
and turbulence
. The amount is the contribution to the overall surface color. Usually 0.1 to 0.5 is sufficient here. The thickness affects the "busyness" of the effect. Keep this between 0.25 and 1 for best results. The turbulence is a little different from pigment or normal turbulence. We cannot set octaves
, lambda
or omega
but we can specify an amount which will affect the thickness in a slightly different way from the thickness value. Values between 0.25 and 1 work best here too. Finally, iridescence will respond to the surface normal since it depends on the angle of incidence of the light rays striking the surface. With all of this in mind, let's add some iridescence to our glass sphere.
sphere { <0,0,0>, 1 pigment { White filter 1 } finish { ambient .1 diffuse .1 reflection .2 specular 1 roughness .001 irid { 0.35 thickness .5 turbulence .5 } } interior{ ior 1.5 fade_distance 5 fade_power 1 caustics 1 } }
We try to vary the values for amount, thickness and turbulence to see what changes they make. We also try to add a normal
block to see what happens.