2.3.7 Radiosity

2.3.7.1 Introduction

Radiosity is a lighting technique to simulate the diffuse exchange of radiation between the objects of a scene. With a raytracer like POV-Ray, normally only the direct influence of light sources on the objects can be calculated, all shadowed parts look totally flat. Radiosity can help to overcome this limitation. More details on the technical aspects can be found in the reference section.

To enable radiosity, you have to add a radiosity block to the global_settings in your POV-Ray scene file. Radiosity is more accurate than simplistic ambient light but it takes much longer to compute, so it can be useful to switch off radiosity during scene development. You can use a declared constant or an INI-file constant and an #if statement to do this:

  #declare RAD = off;

  global_settings {
     #if(RAD)
        radiosity {
           ...
        }
     #end
  }

Most important for radiosity are the ambient and diffuse finish components of the objects. Their effect differs quite much from a conventionally lit scene.

2.3.7.2 Radiosity with conventional lighting

The pictures here introduce combined conventional/radiosity lighting. Later on you can also find examples for pure radiosity illumination.

The following settings are default, the result will be the same with an empty radiosity block:

  global_settings {
    radiosity {
      pretrace_start 0.08
      pretrace_end   0.04
      count 35

      nearest_count 5
      error_bound 1.8
      recursion_limit 3

      low_error_factor 0.5
      gray_threshold 0.0
      minimum_reuse 0.015
      brightness 1

      adc_bailout 0.01/2
    }
  }

The following pictures are rendered with default settings and are made to introduce the sample scene.

All objects except the sky have an ambient finish of 0.

The ambient 1 finish of the blue sky makes it functioning as some kind of diffuse light source. This leads to a bluish touch of the whole scene in the radiosity version.


no radiosity

radiosity (default settings)

difference w/o radiosity

You can see that radiosity much affects the shadowed parts when applied combined with conventional lighting.

Changing brightness changes the intensity of radiosity effects. brightness 0 would be the same as without radiosity. brightness 1 should work correctly in most cases, if effects are too strong you can reduce this. Larger values lead to quite strange results in most cases.


brightness 0.5

brightness 1.0

brightness 2.0

Changing the recursion_limit value leads to the following results, second line are difference to default (recursion_limit 3):


recursion_limit 1

recursion_limit 2

recursion_limit 5

recursion_limit 1 (difference)

recursion_limit 2 (difference)

recursion_limit 5 (difference)

You can see that higher values than the default of 3 do not lead to much better results in such a quite simple scene. In most cases values of 1 or 2 are sufficient.

The error_bound value mainly affects the structures of the shadows. Values larger than the default of 1.8 do not have much effects, they make the shadows even flatter. Extremely low values can lead to very good results, but the rendering time can become very long. For the following samples recursion_limit 1 is used.


error_bound 0.01

error_bound 0.5

error_bound 1.0

error_bound 0.01 (difference)

error_bound 0.5 (difference)

error_bound 1.0 (difference)

Somewhat related to error_bound is low_error_factor. It reduces error_bound during the last pretrace step. Changing this can be useful to eliminate artefacts.


low_error_factor 0.01

low_error_factor 0.5

low_error_factor 1.0

low_error_factor 0.01 (difference)
 
low_error_factor 1.0 (difference)

The next samples use recursion_limit 1 and error_bound 0.2. These 3 pictures illustrate the effect of count. It is a general quality and accuracy parameter leading to higher quality and slower rendering at higher values.


count 2

count 35 (default)

count 300

Another parameter that affects quality is nearest_count. You can use values from 1 to 20, default is 5:


nearest_count 1

nearest_count 5

nearest_count 10

Again higher values lead to less artefacts and smoother appearance but slower rendering.

minimum_reuse influences whether previous radiosity samples are reused during calculation. It also affects quality and smoothness.


minimum_reuse 0.2

minimum_reuse 0.015

minimum_reuse 0.005

minimum_reuse 0.2 (difference)
 
minimum_reuse 0.005 (difference)

Another important value is pretrace_end. It specifies how many pretrace steps are calculated and thereby strongly influences the speed. Usually lower values lead to better quality, but it is important to keep this in good relation to error_bound.


pretrace_end 0.2

pretrace_end 0.04

pretrace_end 0.002

Strongly related to pretrace_end is always_sample. Normally even in the final trace additional radiosity samples are taken. You can avoid this by adding always_sample off. That is especially useful if you load previously calculated radiosity data with load_file.


always_sample on

always_sample off

always_sample off (difference)

The effect of max_sample is similar to brightness. It does not reduce the radiosity effect in general but weakens samples with brightness above the specified value.


max_sample 0.5

max_sample 0.8

default

You can strongly affect things with the objects' finishes. In fact that is the most important thing about radiosity. Normal objects should have ambient finish 0 which is not default in POV-Ray and therefore needs to be specified. Objects with ambient > 0 actually emit light.

Default finish values used until now are diffuse 0.65 ambient 0.


diffuse 0.65 ambient 0.2

diffuse 0.4 ambient 0

diffuse 1.0 ambient 0

Finally you can vary the sky in outdoor radiosity scenes. In all these examples it is implemented with a sphere object. finish { ambient 1 diffuse 0 } was used until now. The following pictures show some variations:


ambient 0 diffuse 1

ambient 0 diffuse 0 (no sky)

yellow-blue gradient

2.3.7.3 Radiosity without conventional lighting

You can also leave out all light sources and have pure radiosity lighting. The situation then is similar to a cloudy day outside, when the light comes from no specific direction but from the whole sky.

The following 2 pictures show what changes with the scene used in part 1, when the light source is removed. (default radiosity, but recursion_limit 1 and error_bound 0.2)


with light source

without light source

You can see that when the light source is removed the whole picture becomes very blue, because the scene is illuminated by a blue sky, while on a cloudy day, the color of the sky should be somewhere between grey and white.

The following pictures show the sample scene used in this part with different settings for recursion_limit (everything else default settings).


recursion_limit 1

recursion_limit 2

recursion_limit 3

This looks much worse than in the first part, because the default settings are mainly selected for use with conventional light sources.

The next three pictures show the effect of error_bound. (recursion_limit is 1 here) Without light sources, this is even more important than with, good values much depend on the scenery and the other settings, lower values do not necessarily lead to better results.


error_bound 1.8

error_bound 0.4

error_bound 0.02

If there are artefacts it often helps to increase count, it does affect quality in general and often helps removing them (the following three pictures use error_bound 0.02).


count 2

count 50

count 200

The next sequence shows the effect of nearest_count, the difference is not very strong, but larger values always lead to better results (maximum is 20). From now on all the pictures use error_bound 0.2


nearest_count 2

nearest_count 5 (default)

nearest_count 10

The minimum_reuse is a geometric value related to the size of the render in pixel and affects whether previous radiosity calculations are reused at a new point. Lower values lead to more often and therefore more accurate calculations.


minimum_reuse 0.001

minimum_reuse 0.015 (default)

minimum_reuse 0.1

In most cases it is not necessary to change the low_error_factor. This factor reduces the error_bound value during the final pretrace step. pretrace_end was lowered to 0.01 in these pictures, the second line shows the difference to default. Changing this value can sometimes help to remove persistent artefacts.


low_error_factor 0.01

low_error_factor 0.5 (default)

low_error_factor 1.0

low_error_factor 0.01
 
low_error_factor 1.0

gray_threshold reduces the color in the radiosity calculations. as mentioned above the blue sky affects the color of the whole scene when radiosity is calculated. To reduce this coloring effect without affecting radiosity in general you can increase gray_threshold. 1.0 means no color in radiosity at all.


gray_threshold 0.0 (default)

gray_threshold 0.5

gray_threshold 1.0

Another important parameter is pretrace_end. Together with pretrace_start it specifies the pretrace steps that are done. Lower values lead to more pretrace steps and more accurate results but also to significantly slower rendering.


pretrace_end 0.2

pretrace_end 0.02

pretrace_end 0.004

It is worth experimenting with the things affecting radiosity to get some feeling for how things work. The next 3 images show some more experiments.


ambient 3 instead of ambient 0 for one object

ambient 0.5 instead of ambient 0 for all objects sky: ambient 0

error_bound 0.04 recursion_limit 2

Finally you can strongly change the appearance of the whole scene with the sky's texture. The following pictures give some example.


yellow-blue gradient from left to right

light-dark gradient from left to right

light-dark gradient from bottom to top

Really good results much depend on the single situation and how the scene is meant to look. Here is some "higher quality" render of this particular scene, but requirements can be much different in other situations.

  global_settings {
    radiosity {
      pretrace_start 0.08
      pretrace_end   0.01
      count 500

      nearest_count 10
      error_bound 0.02
      recursion_limit 1

      low_error_factor 0.2
      gray_threshold 0.0
      minimum_reuse 0.015
      brightness 1

      adc_bailout 0.01/2
    }
  }

Higher quality radiosity scene

2.3.7.4 Normals and Radiosity

When using a normal statement in combination with radiosity lighting, you will see that the shadowed parts of the objects are totally smooth, no matter how strong the normals are made.

The reason is that POV-Ray by default does not take the normal into account when calculating radiosity. You can change this by adding normal on to the radiosity block. This can slow things down quite a lot, but usually leads to more realistic results if normals are used.

When using normals you should also remember that they are only faked irregularities and do not generate real geometric disturbances of the surface. A more realistic approach is using an isosurface with a pigment function, but this usually leads to very slow renders, especially if radiosity is involved.


normal off (default)

normal on

isosurface

You can see that the isosurface version does not have a natural smooth circumference and a more realistic shadowline.

2.3.7.5 Performance considerations

Radiosity can be very slow. To some extend this is the price to pay for realistic lighting, but there are a lot of things that can be done to improve speed.

The radiosity settings should be set as fast as possible. In most cases this is a quality vs. speed compromise. Especially recursion_limit should be kept as low as possible. Sometimes 1 is sufficient, if not 2 or 3 should often be enough.

With high quality settings, radiosity data can take quite a lot of memory. Apart from that the other scene data is also used much more intensive than in a conventional scene. Therefore insufficient memory and swapping can slow down things even more.

Finally the scene geometry and textures are important too. Objects not visible in the camera usually only increase parsing time and memory use, but in a radiosity scene, also objects behind the camera can slow down the rendering process.

More about "reference section"

More about "finishes"

More about "normal statement"

More about "isosurface"