Occlusion
Ambient Occlusion
Occlusion is a fast and simple method to simulate the effects of
global illumination. Occlusion is the extent to which the area
above a point is covered by other geometry. This is achieved by
tracing a number of probe rays inside the hemispherical area above
the point and testing to what extent this region is blocked.
Typical use of this shader is ambient occlusion, where
the shader is used to scale the contribution of ambient lighting
(which in turn may come from a diffuse environment map shader). For
this use the shader should be assigned to the ambient
parameters of materials like mib_illum_phong.
Another use of occlusion is reflective occlusion, where
the shader is used to scale the contribution from a reflection map.
For this use, the shader is generally plugged into an environment
or reflection shader slot of a material, and the actual environment
map image is plugged into the bright parameter. An
alternative is to allow the return value of the occlusion shader to
modulate the strength attribute of a reflection map shader.
A third use is to create files for external compositing, where
the occlusion shader is assigned as the primary material shader on
every object in the scene. The output can be used to modulate other
render passes to achieve proper compositing in post-production.
The shader may also be used as a light shader. The
light source must be an area light of the user type. This
generates an "ambient" lightsource with built in occlusion.
This shader only depends on base ray tracing features provided
by mental ray, and does neither use nor benefit from advanced
computations like final gathering or global illumination.
mib_amb_occlusion
color "mib_amb_occlusion" (
integer "samples" default 16,
color "bright" default 1 1 1 1,
color "dark" default 0 0 0 0,
scalar "spread" default 0.8,
scalar "max_distance" default 0,
boolean "reflective" default off,
integer "output_mode" default 0,
boolean "occlusion_in_alpha" default off
# Version 2 parameters
scalar "falloff" default 1.0,
integer "id_inclexcl" default 0,
integer "id_nonself" default 0,
)
version 2
apply texture, light
- samples
- is the number of probe rays that will be sent. More rays yield
a smoother image. Occlusion mapping will never be as smooth as
well-tuned final gathering or photons, but is computationally
cheap.
- bright
- is the color used when no occluding objects are found.
- dark
- is the color used when total occlusion occurs. In most
practical cases it is set to black. For partial occlusion, a
gradual mix between the bright and darkcolors
is returned.
- spread
- defines how large an area of the hemisphere above the point is
sampled. The value defines a cone around the sampling direction
which is narrower for small values and wider for large values. It
ranges from 0.0, for a cone that is a single direction, to 1.0 for
a cone that covers the entire hemisphere.
- max_distance
- is the range within which geometry is probed. If it is zero,
the entire scene is sampled. If it is a nonzero value, only objects
within this distance will be considered (which makes sampling much
faster) where objects outside this range do not occlude at all and
objects that are closer occlude more strongly as the distance
approaches zero.
- reflective
- if turned off sampling is performed in a cone area based around
the surface normal. If reflective is on, the samples are
instead distributed around the reflection direction. This generates
reflective occlusion which can enhance the realism of
reflection mapping greatly.
- output_mode
- defines what the returned color is: 0 enables standard
occlusion behaviour; 1 enables environment sampling. This changes
the behavior of the shader slightly. As directions are probed for
occlusion, the current environment is also sampled and weighted
based on how occluded that particular direction is. In mode 1 the
output of the function is the gathered weighted environment colors
multiplied by the bright color, and as a convenience the
dark color is added.
- Setting output_mode to 2 enables bent normals. The
average unoccluded world space normal direction is calculated and
returned encoded as a color where red is x, green is y and blue is
z. Setting output_mode to 3 is the same as 2 but the normals
are encoded in the camera coordinate space instead.
- occlusion_in_alpha
- if turned on, the scalar occlusion value is put in the returned
colors alpha component, regardless of what output_mode is
set to. The other color components remain as before.
- falloff
- only matters when max_distance is nonzero and
defines the speed at which the occlusion is attenuated by distance.
Technically, it is a power function applied to the normalized
distance from 0 to max_distance. The default value of
1.0 is a linear falloff. Values below 1.0 makes the falloff more
rapid. Practically this means that for lower values occlusion is
stronger for short distances (in small corners and crevices) and
softer over larger distances.
- id_inclexcl
- defines an object instance label number to be included (or
excluded) from being considered occluding by the shader. Set to 0
the parameter has no effect. A positive integer means that only
object instances with a label that matches this number
will cause occlusion. A negative reverses the condition and
includes all object instances except those with a matching
label.
- id_nonself
- works similar to id_inclexcl in that it is an object
instance label determining which objects do not self-occlude. Set
to 0 it has no effect. Set to a positive integer will prevent any
object with that label from occluding other objects with the same
label. This is useful for "matte" or "stand-in" objects that
represents existing geometry in a photographic background since any
inter-occlusion between such objects are already present in the
background photo. Simple exclusion by id_inclexcl cannot
be used in this case because occlusion cast by "stand-in"
background geometry onto foreground geometry and vice versa is both
desired - only background-to-background occlusion needs to be
prohibited.
Fast Occlusion
This shader is an alternative version to mib_amb_occlusion with
similar funcionality, but it is fully utilizing the ambient
occlusion facilities built into mental ray. This offers optimal
rendering performance and the possibility to benefit from the
ambient occlusion cache, if enabled.
Note, this shader can not be used as a light shader.
mib_fast_occlusion
color "mib_fast_occlusion" (
integer "samples" default 0,
color "bright" default 1 1 1 1,
color "dark" default 0 0 0 0,
scalar "spread" default 0,
scalar "spread_exp" default 1,
scalar "max_distance" default 0,
boolean "reflective" default off,
integer "output_mode" default 0,
boolean "occlusion_in_alpha" default off,
integer "cache_points" default 0
)
version 1
apply texture
- samples
- is the number of probe rays that will be sent. More rays yield
a smoother image. If the ambient occlusion cache is enabled, this
attribute will be ignored: the number of points to use for cache
interpolation is controlled by the cache_points attribute,
see below.
- bright
- is the color used when no occluding objects are found and
dark is the color used when total occlusion occurs. In most
practical cases it is set to black. For partial occlusion, a
gradual mix between the two colors is returned.
- spread
- defines how large an area of the hemisphere above the point is
sampled. Unlike the mib_amb_occlusion
shader, this value is the cosine of the angle between the normal
and the maximum direction. Its value ranges from 0.0 for a cone
that covers the entire hemisphere to 1.0 for a cone that is a
single direction.
- spread_exp
- is the exponent of the spreading angle. It controls how the
rays shot from the sampling point concentrate around the normal. A
higher value means more density around the normal.
Currently not supported by mental ray but provided for future
extensions.
- max_distance
- is the range within which geometry is probed. If it is zero,
the entire scene is sampled. If it is a nonzero value, only objects
within this distance will be considered (which makes sampling much
faster) where objects outside this range do not occlude at all and
objects that are closer occlude more strongly as the distance
approaches zero.
- reflective
- if turned off sampling is performed in a cone area based around
the surface normal. If reflective is on, the samples are
instead distributed around the reflection direction. This generates
reflective occlusion which can enhance the realism of
reflection mapping greatly.
- output_mode
- defines what the returned color is: 0 enables standard
occlusion behaviour; 1 enables environment sampling. This changes
the behavior of the shader slightly. As directions are probed for
occlusion, the current environment is also sampled and weighted
based on how occluded that particular direction is. In mode 1 the
output of the function is the gathered weighted environment colors
multiplied by the bright color, and as a convenience the
dark color is added.
- Setting output_mode to 2 enables bent normals. The
average unoccluded world space normal direction is calculated and
returned encoded as a color where red is x, green is y and blue is
z. Setting output_mode to 3 is the same as 2 but the
normals are encoded in the camera coordinate space instead.
- occlusion_in_alpha
- if turned on, the scalar occlusion value is put in the returned
colors alpha component, regardless of what output_mode
is set to. The other color components remain as before.
- cache_points
- is used to control the number of ambient occlusion points to
lookup for interpolation in the ambient occlusion cache. If the
latter is not enabled this attribute will be ignored. A value of 0
means the number of ambient occlusion points will be determined by
mental ray settings, any value greater then 0 will override the
setting for the current object. Values smaller than 64 give more
precise results but artifacts can appear. Higher values tend to
produce a blurry image.
Ambient Occlusion using Final Gathering
The mental ray final gathering algorithm always computes a
scalar occlusion value. This utitily shader simply returns this
value as a grayscale result.
mib_fg_occlusion
color "mib_fg_occlusion" (
color "result_when_fg_is_off" default 1 1 1 1
)
version 1
- result_when_fg_is_off
- becomes the return value when final gathering is off. When
final gathering is on, the occlusion value is returned as a
grayscale value, and the parameter is never evaluated at all or
used in any way.
- Hence, connecting mib_amb_occlusion to the
result_when_fg_is_off parameter, the result will be
occlusion calculated by final gathering when it is on, and
occlusion calculated by mib_amb_occlusion when
final gathering is off.
Bent Normals
"Bent normal" is a term used for the average un-occluded
direction vector from a surface point. For completely un-occluded
surfaces this is the same as the normal vector, but for surfaces
occluded by other geometry it points in the direction in which the
least amount of occluding geometry is found. Bent normals are used
as an acceleration technique for ambient occlusion, allowing very
fast rendering that look like global illumination or final
gathering lit by an environment at a small fraction of the
rendering time.
Ambient occlusion as done by the mib_amb_occlusion shader is
a ray tracing technique that casts potentially large numbers of
probe rays to determine to which extent a surface point is
occluded. The speed of this operation depends on the number of rays
(samples), the reach of the rays
(max_distance) and the complexity of the scene.
When rendering an animation (or multiple views of the same
scene), any object that does not move, does not change shape, or
has no moving occluding object nearby will yield the same result
for every frame. Therefore one can "bake" (render to a file) the
ambient occlusion solution once in a first rendering pass,
and re-use this result in subsequent rendering passes for any
number of frames, with potentially huge performance gains. If one
also "bakes" the average un-occluded direction (the bent normal) to
a texture, the entire process of lighting the object based on an
environment is moved to this second rendering pass, without having
to trace a single ray.
By setting the output_mode parameter to 2, 3, or 4 on
the ambient occlusion shader mib_amb_occlusion, bent
normals are returned with the vector being encoded as a color where
x is red, y is green, and z is blue. If
occlusion_in_alpha is enabled, the scalar occlusion
value is returned in the alpha channel. This color can be baked
into a texture, for example with the help of mib_lightmap_write
by connecting mib_amb_occlusion to its
input parameter and rendering.
Once the texture file is generated, mib_bent_normal_env can
be assigned to a surface shader (for example to the
ambient parameter of mib_illum_phong to
look up an environment to light the object based on the baked bent
normal texture, which is placed in the bent_normals
parameter of mib_bent_normal_env.
This allows an extremely low-overhead simulation of global
illumination-like effects for rigid objects and is especially
suitable for animations. The technique does not work on deformable
objects since their occlusion, shape, and normals can vary from
frame to frame. For deformable objects, it is better to apply the
occlusion shader directly, without baking its output.
mib_bent_normal_env
color "mib_bent_normal_env" (
color "bent_normals" default 0 0 0 1,
boolean "occlusion_in_alpha" default on,
color "occlusion" default 1 1 1,
scalar "strength" default 0.2,
shader "environment",
integer "coordinate_space" default 2,
integer "env_samples" default 1,
scalar "samples_spread" default 0.0,
transform "matrix" default 1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
)
- bent_normals
- is the bent normal data output by the occlusion shader. It
should be baked to the object. This is usually attached to a node
that does the texture lookup such as mib_texture_lookup.
The texture mapping used for generating the texture must match with
the one used for lookup.
- occlusion_in_alpha
- specifies whether the scalar occlusion value is already baked
into the alpha channel of the "bent normals" pass. This uses
slightly less memory but many "bake to texture" functions of OEM
integrations of mental ray do not bake the alpha channel.
- occlusion
- is the separate occlusion channel, to be used if it was not
already baked into the alpha channel.
- strength
- is a simple scalar multiplier for the effect.
- environment
- is the environment shader to look up. If none is provided, the
environment from the material is used. To avoid image noise, it is
often desirable to use a separate, highly blurred environment map
with no high-resolution detail.
- coordinate_space
- defines the coordinate space of the bent normal:
- 0 is "unmodified". The bent normal data is in internal
space.
- 1 is "by matrix". The bent normal data is transformed with the
passed transformation matrix.
- 2 is world space.
- 3 is camera space.
- 4 is object space. This is often the most useful mode. If the
map is both created and used in object space, it will automatically
follow the object as it moves through an animation.
- The coordinate space numbers match the output_mode parameter
values of the ambient occlusion shader, where 2 is world space, 3
is camera space, and 4 is object space.
- env_samples
- is the number of samples to take from the environment map.
Normally, a highly-blurred environment map is used where only one
sample is sufficient, but it is possible to multi-sample the
environment map by setting a non-zero value.
- sample_spread
- is the spread factor for each individual environment sample.
The range is from 0.0 (infinitely thin rays -- a single sample) to
1.0 (the entire hemisphere is sampled).
- matrix
- is an explicit transformation matrix applied to the normal data
when coordinate_space is 1. This allows arbitrary
transformations.
Copyright (©) 1986-2009 by
mental images GmbH