Participating Media

Fog, clouds, silty water, and similar media scatter some of the light that travels through it. In other words, these media participate in the light transport (see [Jensen 98]). A volume shader is needed to simulate participating media.

Volume Shader

The volume shader parti_volume can simulate homogeneous (uniform density) and nonhomogeneous participating media with isotropic (diffuse) or anisotropic scattering. parti_volume and parti_volume_photon use a two-lobed scattering model, which means that light scatters both forward and back in the incoming light direction. This scattering model is invented by Ch. Schlick and can model real scattering from dust, mist, rain-drops, etc.

Any medium (other than a vacuum) is assumed to contain suspended particles which scatter light traveling through it. Scattering plays an important role in the shading of volumes, and it is the size of the particles in relation to the wavelength of light which determines the type of scattering. If the particle radii are much smaller than the wavelength of light, there is no discernible scattering and the light is absorbed. Particles only slightly smaller than the wavelength of light produce what is known as Rayleigh scattering (cigarette smoke and dust). Particles roughly the same size as the wavelength of light give rise to Mie scattering (water droplets or fog). The Mie model can account for both sparse and dense particle densities, referred to as Hazy Mie and Murky Mie respectively. When the particle size is much larger than the wavelength of light, geometric optics comes into effect (normal solid surfaces). Glassner suggests the following values:

functionrg1g2
Rayleigh0.50-0.460.46
Hazy Mie0.12-0.500.70
Murky Mie0.19-0.650.91
parti_volume
color "parti_volume" (
    integer         "mode",
    color           "scatter",
    scalar          "extinction",
    scalar          "r",
    scalar          "g1",
    scalar          "g2",
    scalar          "nonuniform",
    scalar          "height",
    scalar          "min_step_len",
    scalar          "max_step_len",
    scalar          "light_dist",
    integer         "min_level",
    boolean         "no_globil_where_direct",
    array light     "lights")
mode
in mode 0, the participating medium fills the entire volume. In mode 1, there is only participation medium below the given height, and there is clear air or vacuum above.
scatter
is the color of the scattering medium. This determines the color of the direct and indirect light that is scattered by the medium. It also acts as a multiplier of the photon energy for the photons in the photon volume map. Its dependency with the extintion coefficient is inverse.
extinction
is the extinction coefficient of the medium. It determines how much light is absorbed or scattered in the medium. 0 means clear air or vacuum. The higher the coefficient, the denser the medium (and the more photon scattering). Note that a high extinction coefficient doesnt allow photons to enter deep into the volume, as they are already scattered after a short distance.
r
g1
g2
control scattering. If both g1 and g2 are zero (the default), isotropic scattering is modeled: all scattering directions have equal probability. This is sometimes also called diffuse scattering. Anisotropic reflection is modeled by a two-lobed scattering model. Each lobe can be either backscattering ( -1 < g < 0), diffuse (isotropic, g = 0), or forward scattering ( 0 < g < 1). The first lobe is weighted by r, the second lobe by 1 - r.
nonuniform
determines if the medium is homogeneous (uniform density) or nonhomogeneous (cloud-like density variation). It is a number between 0 and 1. A value of 0 makes the medium is completely homogeneous and depends only on the extinction parameter. A value of 1 creates a cloud-like Blinn density variation. Values between 0 and 1 give a mix between the two extremes.
height
determines the height above which there is clear air or vacuum if the mode parameter is 1.
min_step_len
max_step_len
are used to determine the step length for ray marching. Usually keep the min value at 10 percent of max. The smaller the max is, the more accurately, though slowly, the volume steps will be sampled for visibility. The same parameter is used in parti_volume_photon for volume photon lookup.
light_dist
is used for optimization of the sampling of area light sources. It is used if the area light source has the optional lower sampling, as in for example
rectangle  0.5 0.0 0.0  0.0 0.0 0.5   10 10 3 2 2 
For efficiency, parti_volume always uses the lower number of samples (here 2 2). This is usually sufficient since the direct illumination is computed at many points along each ray during ray marching. However, the higher number of samples (here 10 10) should be used near an area light source. The light_dist parameter determines how far away from a light source the higher number of samples have to be used.
min_level
is ignored (it is used by the corresponding volume photon shader).
no_globil_where_direct
tells the shader to not calculate global illumination in the volume effect but just the direct illumination. The parameter is for optimization if such contribution is not required. When set to 1 (on) the parameters relative to the directionality of the scattering effect, r, g1, and g2 are not taken into account for the indirect illumination, they are however evaluated for direct illumination.
lights
is an array of light instances. If no lights are specified then the light list in the geometry instance is used. If no instance light list is specified then all lights in the scene are used.

Transparent Material

Deprecated This is a material shader for a helper enclosing surface of a participating medium or volume that is not a mental ray hull object. It simply continues to trace the incoming ray in the same direction without any interaction with the current object. Such a volume container should be invisible itself.

transmat
color "transmat" ()

There are no parameters.


Copyright © 1986, 2015 NVIDIA ARC GmbH. All rights reserved.