The light_source
is not really an object. Light sources have no visible shape of their own. They are just points or areas which emit light. They are categorized as objects so that they can be combined with regular objects using union
. Their full syntax is:
light_source {
<Location>,
COLOR [LIGHT_MODIFIERS...] }
spotlight
| shadowless
| cylinder
radius
Radius | falloff
Falloff | tightness
Tightness | point_at
<Spot>
area_light
<Axis_1>,
<Axis_2>,
Size_1,
Size_2 |
adaptive
Adaptive | jitter
Jitter
looks_like {
OBJECT }
| TRANSFORMATION
fade_distance
Fade_Distance | fade_power
Fade_Power |
media_attenuation
[Bool] | media_interaction
[Bool]
The different types of light sources and the optional modifiers are described in the following sections.
The first two items are common to all light sources. The <Location> vector gives the location of the light. The COLOR gives the color of the light. Only the red, green, and blue components are significant. Any transmit or filter values are ignored. Note that you vary the intensity of the light as well as the color using this parameter. A color such as rgb <0.5,0.5,0.5>
gives a white light that is half the normal intensity.
All of the keywords or items in the syntax specification above may appear in any order. Some keywords only have effect if specified with other keywords. The keywords are grouped into functional categories to make it clear which keywords work together. The GENERAL_LIGHT_MODIFIERS work with all types of lights and all options. Note that TRANSFORMATIONS such as translate
, rotate
etc. may be applied but no other OBJECT_MODIFIERS may be used.
There are four mutually exclusive light types. If no LIGHT_TYPE is specified it is a point light. The other choices are spotlight
, shadowless
, and cylinder
.
The simplest kid of light is a point light. A point light source sends light of the specified color uniformly in all directions. The default light type is a point source. The <Location> and COLOR is all that is required. For example:
light_source { <1000,1000,-1000>, rgb <1,0.75,0> //an orange light }
Normally light radiates outward equally in all directions from the source. However the spotlight
keyword can be used to create a cone of light that is bright in the center and falls of to darkness in a soft fringe effect at the edge. Although the cone of light fades to soft edges, objects illuminated by spotlights still cast hard shadows. The syntax is:
light_source {
<Location>,
COLOR spotlight
[LIGHT_MODIFIERS...] }
radius
Radius | falloff
Falloff | tightness
Tightness | point_at
<Spot>
The point_at
keyword tells the spotlight to point at a particular 3D coordinate. A line from the location of the spotlight to the point_at
coordinate forms the center line of the cone of light. The following illustration will be helpful in understanding how these values relate to each other.
The geometry of a spotlight.
The falloff
, radius
, and tightness
keywords control the way that light tapers off at the edges of the cone. These four keywords apply only when the spotlight
or cylinder
keywords are used.
The falloff
keyword specifies the overall size of the cone of light. This is the point where the light falls off to zero intensity. The float value you specify is the angle, in degrees, between the edge of the cone and center line. The radius
keyword specifies the size of the "hot-spot" at the center of the cone of light. The "hot-spot" is a brighter cone of light inside the spotlight cone and has the same center line. The radius
value specifies the angle, in degrees, between the edge of this bright, inner cone and the center line. The light inside the inner cone is of uniform intensity. The light between the inner and outer cones tapers off to zero.
For example with radius 10
and falloff 20
the light from the center line out to 10 degrees is full intensity. From 10 to 20 degrees from the center line the light falls off to zero intensity. At 20 degrees or greater there is no light. Note that if the radius and falloff values are close or equal the light intensity drops rapidly and the spotlight has a sharp edge. The default values for both radius
and falloff
is 70.
The values for these two parameters are half the opening angles of the corresponding cones, both angles have to be smaller than 90 degrees. The light smoothly falls off between the radius and the falloff angle like shown in the figures below (as long as the radius angle is not negative).
Intensity multiplier curve with a fixed falloff angle of 45 degrees.
Intensity multiplier curve with a fixed radius angle of 45 degrees.
The tightness
keyword is used to specify an additional exponential softening of the edges. The intensity of light at an angle from the center line is given by: intensity * cos(angle)tightness. The default value for tightness is 10. Lower tightness values will make the spotlight brighter, making the spot wider and the edges sharper. Higher values will dim the spotlight, making the spot tighter and the edges softer. Values from 1 to 100 are acceptable.
Intensity multiplier curve with fixed angle and falloff angles
of 30 and 60 degrees respectively and different tightness values.
You should note from the figures that the radius and falloff angles interact with the tightness parameter. Only negative radius angles will give the tightness value full control over the spotlight's appearance as you can see from the figure below. In that case the falloff angle has no effect and the lit area is only determined by the tightness parameter.
Intensity multiplier curve with a negative radius angle and different tightness values.
Spotlights may be used anyplace that a normal light source is used. Like any light sources, they are invisible. They may also be used in conjunction with area lights.
The cylinder
keyword specifies a cylindrical light source that is great for simulating laser beams. Cylindrical light sources work pretty much like spotlights except that the light rays are constrained by a cylinder and not a cone. The syntax is:
light_source {
<Location>,
COLOR cylinder
[LIGHT_MODIFIERS...] }
radius
Radius | falloff
Falloff | tightness
Tightness | point_at
<Spot>
The point_at
, radius
, falloff
and tightness
keywords control the same features as with the spotlight. See "Spotlights" for details.
You should keep in mind that the cylindrical light source is still a point light source. The rays are emitted from one point and are only constraint by a cylinder. The light rays are not parallel.
Area light sources occupy a finite, one- or two-dimensional area of space. They can cast soft shadows because an object can partially block their light. Point sources are either totally blocked or not blocked.
The area_light
keyword in POV-Ray creates sources that are rectangular in shape, sort of like a flat panel light. Rather than performing the complex calculations that would be required to model a true area light, it is approximated as an array of point light sources spread out over the area occupied by the light. The intensity of each individual point light in the array is dimmed so that the total amount of light emitted by the light is equal to the light color specified in the declaration. The syntax is:
light_source {
<Location>,
COLOR area_light
<Axis_1>,
<Axis_2>,
Size_1,
Size_2
adaptive
Adaptive] [ jitter
Jitter ]
}
The light's location and color are specified in the same way as a for a regular light source. Any type of light source may be an area light.
The area_light
command defines the size and orientation of the area light as well as the number of lights in the light source array. The vectors <Axis_1> and <Axis_2> specify the lengths and directions of the edges of the light. Since the area lights are rectangular in shape these vectors should be perpendicular to each other. The larger the size of the light the thicker the soft part of shadows will be. The integers Size_1 and Size_2 specify the number of rows and columns of point sources of the. The more lights you use the smoother your shadows will be but the longer they will take to render.
Note that it is possible to specify spotlight parameters along with the area light parameters to create area spotlights. Using area spotlights is a good way to speed up scenes that use area lights since you can confine the lengthy soft shadow calculations to only the parts of your scene that need them.
An interesting effect can be created using a linear light source. Rather than having a rectangular shape, a linear light stretches along a line sort of like a thin fluorescent tube. To create a linear light just create an area light with one of the array dimensions set to 1.
The jitter
command is optional. When used it causes the positions of the point lights in the array to be randomly jittered to eliminate any shadow banding that may occur. The jittering is completely random from render to render and should not be used when generating animations.
The adaptive
command is used to enable adaptive sampling of the light source. By default POV-Ray calculates the amount of light that reaches a surface from an area light by shooting a test ray at every point light within the array. As you can imagine this is very slow. Adaptive sampling on the other hand attempts to approximate the same calculation by using a minimum number of test rays. The number specified after the keyword controls how much adaptive sampling is used. The higher the number the more accurate your shadows will be but the longer they will take to render. If you're not sure what value to use a good starting point is adaptive 1
. The adaptive
keyword only accepts integer values and cannot be set lower than 0.
When performing adaptive sampling POV-Ray starts by shooting a test ray at each of the four corners of the area light. If the amount of light received from all four corners is approximately the same then the area light is assumed to be either fully in view or fully blocked. The light intensity is then calculated as the average intensity of the light received from the four corners. However, if the light intensity from the four corners differs significantly then the area light is partially blocked. The area light is split into four quarters and each section is sampled as described above. This allows POV-Ray to rapidly approximate how much of the area light is in view without having to shoot a test ray at every light in the array. Visually the sampling goes like shown below.
Area light adaptive samples.
While the adaptive sampling method is fast (relatively speaking) it can sometimes produces inaccurate shadows. The solution is to reduce the amount of adaptive sampling without completely turning it off. The number after the adaptive keyword adjusts the number of times that the area light will be split before the adaptive phase begins. For example if you use adaptive 0
a minimum of 4 rays will be shot at the light. If you use adaptive 1
a minimum of 9 rays will be shot (adaptive 2
gives 25 rays, adaptive 3
gives 81 rays, etc). Obviously the more shadow rays you shoot the slower the rendering will be so you should use the lowest value that gives acceptable results.
The number of rays never exceeds the values you specify for rows and columns of points. For example area_light x,y,4,4
specifies a 4 by 4 array of lights. If you specify adaptive 3
it would mean that you should start with a 9 by 9 array. In this case no adaptive sampling is done. The 4 by 4 array is used.
Using the shadowless
keyword you can stop a light source from casting shadows. These lights are sometimes called "fill lights". They are another way to simulate ambient light however shadowless lights have a definite source. The syntax is:
light_source {
<Location>,
COLOR shadowless
[LIGHT_MODIFIERS...] }
Shadowless may be used with area_light
but not spotlight
or cylinder
.
Normally the light source itself has no visible shape. The light simply radiates from an invisible point or area. You may give a light source any shape by adding a looks_like {
OBJECT }
statement.
There is an implied no_shadow
attached to the looks_like
object so that light is not blocked by the object. Without the automatic no_shadow
the light inside the object would not escape. The object would, in effect, cast a shadow over everything.
If you want the attached object to block light then you should attach it with a union
and not a looks_like
as follows:
union { light_source { <100, 200, -300> color White } object { My_Lamp_Shape } }
Presumably parts of the lamp shade are transparent to let some light out.
By default POV-Ray does not diminish light from any light source as it travels through space. In order to get a more realistic effect fade_distance
and fade_power
keywords followed by float values can be used to model the distance based falloff in light intensity.
The fade_distance
Fade_Distance is used to specify the distance at which the full light intensity arrives, i. e. the intensity which was given by the COLOR specification. The actual attenuation is described by the fade_power
Fade_Power, which determines the falloff rate. For example linear or quadratic falloff can be used by setting fade_power
to 1 or 2 respectively. The complete formula to calculate the factor by which the light is attenuated is
with d being the distance the light has traveled.
Light fading functions for different fading powers.
You should note two important facts: First, for Fade_Distance larger than one the light intensity at distances smaller than Fade_Distance actually increases. This is necessary to get the light source color if the distance traveled equals the Fade_Distance. Second, only light coming directly from light sources is attenuated. Reflected or refracted light is not attenuated by distance.
media_interaction off
keyword inside the light source statement. Note in POV-Ray 3.0 this feature was turned off and on with the atmosphere
keyword.media_attenuation on
for a given light source on. All light coming from this light source will now be diminished as it travels through the fog or media. This results in an distance-based, exponential intensity falloff ruled by the used fog or media. If there is no fog or media no change will be seen. Note in POV-Ray 3.0 this feature was turned off and on with the atmospheric_attenuation
keyword.