Phenomena
The supplied Phenomena are documented first since they are
sufficient for most practical usage. Expert users can create their
own Phenomena using these as templates or use the component shaders
as described in Advanced
Topics. These Phenomena use structures to group the input
parameters in logical groups, which are automatically grouped by
the user interface of different OEM integrations of mental ray.
Fast Simple Phenomenon
This Phenomenon automatically (unless explicitly specified)
generates the required lightmaps, fills in the lightmap data, and
shades the objects as a general, translucent object with subsurface
scattering. The scattering is divided into two parts, one for the
front side of the object and one for the back.
In a sense, the shader works by layering several light
contributions on top of each other (see misss_fast_shader)
to get a final result. What is important to keep in mind are these
rules of thumb:
- The bump map only affects the specular and
diffuse_color layers. The subsurface scattering happens
below the surface and is oblivious to the surface having
bumps.
- The overall_color affects all of the diffuse
contributions, but not the specularity:
The flow of color
misss_fast_simple_phen
material "misss_fast_simple_phen" (
color texture "lightmap",
color texture "depthmap",
string "lightmap_group",
scalar "lightmap_size",
integer "samples",
shader "bump",
struct "d" {
color "ambient",
color "overall_color",
color "diffuse_color",
scalar "diffuse_weight",
color "front_sss_color",
scalar "front_sss_weight",
scalar "front_sss_radius",
color "back_sss_color",
scalar "back_sss_weight",
scalar "back_sss_radius",
scalar "back_sss_depth"
},
struct "s" {
color "specular",
scalar "exponent"
},
struct "a" {
scalar "lightmap_gamma",
boolean "indirect",
scalar "scale_conversion",
scalar "scatter_bias",
scalar "falloff",
boolean "screen_composit"
},
integer "mode",
array light "lights")
- lightmap
depthmap
- are normally not specified. These are special parameters the
shaders use to communicate the name of the automatically created
lightmaps between themselves. Expert users can pass writable
textures and leave the lightmap_group and
lightmap_size parameters undefined. See Automatic lightmap
generation.
- lightmap_group
- is the scatter group name. A lightmap/depthmap pair will be
created internally and given this name. All objects that should
scatter light into each other should be in the same scatter group.
To conserve memory, use as few scatter groups as possible. A
person's hands, face, etc. can use the same scatter group; even
hands and faces of different people. In general, different scatter
groups should be used only when using the same group would cause
visible problems due to objects incorrectly scattering into each
other. Two characters shaking hands, for instance, would need to
have their hands in different scatter groups. (Also see the
technical note on Network
Rendering.
- lightmap_size
- is size of the lightmap expressed in percent of render size.
The lightmap is created in render space, and is related to final
rendered screen pixels. 50% or less is often quite enough (and is
the default), but if edge artifacts appear, increase this
value.
- samples
- sets how many samples from the lightmap are considered
(maximum) per rendered ray, ideally, a power of two. 32 is probably
the lowest useful value, 128 is plenty. However, if the scattering
radii are large the sample count may need to be increased to avoid
image noise.
- bump
- allows passing any shader that perturbs the normal for bumps.
The shader's color output (if any) will not be used.
- ambient
- is the ambient component or any additional diffuse light added
by any shader. This light will also be included in the lightmap and
get scattered like any other light source and is hence the perfect
place to add any HDRI light. The HDRI light can be based on
environment and occlusion maps.
- overall_color
- is the overall diffuse color. All diffuse colors that
follow below are multiplied with this global color to yield the
final result. This parameter is useful for tinting the final
computed diffuse color in a desired way or to apply maps that
attenuate all diffuse light. Moles in skin, for example, block
almost all underlying light (even scattered) and would make sense
applied here, as would dirt, textured-on eyebrows, and such.
- diffuse_color
diffuse_weight
- color and weight (a simple multiplier for easier tweaking) of
the normal Lambertian diffuse lighting, which is layered on top of
any underlying scattered diffuse light.
- front_sss_color
front_sss_weight
- are the color and weight for the front surface scattering.
- front_sss_radius
- is the scatter radius in the front surface. Light will scatter
this distance along the surface, in whatever units the model is
made, divided by the scale_conversion parameter along the
surface.
- back_sss_color
back_sss_weight
- are the color and weight for the back surface scattering, i.e.
light going through the object.
- back_sss_radius
back_sss_depth
- are the scatter radius and depth for which light from the back
surface is visible in the front surface. Normally, the radius and
depth are set to the same value (and if the depth is not specified,
it defaults to the radius) but can be set separately for increased
control.
- specular
exponent
- specular color and Phong exponent for the specular
highlight.
- lightmap_gamma
- is the gamma curve of the light stored in the lightmap. If this
is 1.0, normal Lambertian diffuse light is stored. If it is less
than 1.0, the curve is 'flattened' causing the light to spread out
towards areas perpendicular to the incoming light. If it is higher
than 1.0, the curve is 'narrowed' causing the light to concentrate
in areas directly facing the light source. In most cases, a value
between 0.4 and 0.8 is sufficient.
- indirect
- if true, includes any indirect lighting (photons, final
gathering, etc) in the lightmap to be scattered. This takes
additional render time and one should judge on a case-by-case basis
if the indirect light is significant enough that seeing it
scattered or not makes a big difference to justify the extra
rendering time.
- scale_conversion
- is a simple utility function allowing linear division of all
distances. Since scattering is distance dependent, loading a
material designed for a model made in inches will not work on a
model where the unit is meters, and vice versa. Here one can pass
the conversion factor.
- scatter_bias
- if set to 0.0 the scattering is completely uniform. Positive
values favor forward scattering, and negative values favor back
scattering. The allowed range is -1.0 to 1.0, but the useful range
is much smaller. A value of 0.1 (a slight favoring of forward
scattering) is a good start.
- falloff
- sets the shape of the distance falloff along the scatter
radius. Higher values yield a sharper falloff, and lower values a
smoother falloff, but also make the perceived scatter distance
shorter, so one must compensate by increasing the actual scatter
distance for a slightly 'softer' look. For high values (1.0 to
10.0), almost all samples within the scatter radius are weighted
equally. For low values (0.1 to 1.0), the samples near the edge of
the scatter radius are weighted less.
- screen_composit
- when turned on, chooses Screen compositing. When simply adding
together the contribution of many layers of light, it is very easy
to quickly blow out and over-expose into white, but the human eye
is inherently nonlinear and perceives intensities in a different
way. This option allows use of what is known in many compositing
applications as a screen transfer mode between the layers, which
yields a softer, more pleasing result. If it is turned off, normal
addition is used. If rendering in a high dynamic range and a proper
tone-operator is applied in the final output stage already
compressing the final luminance this should be turned off.
- mode
- is the mode selector for the light lists.
- lights
- is the direct light list.
Fast Skin Phenomenon
A more advanced Phenomenon for skin shading includes three-layer
scattering and skin-specific specularity functionality. It shares
many parameters with misss_fast_simple_phen.
The structure of the skin shader
Skin is simulated in layers as follows: A top reflective sheen
layer (for specularity and surface non-scattered Lambertian diffuse
reflections), a dual-layer subsurface scattering (simulating both
the scattering in the epidermis and the layers below, here
collectively named "subdermal"), and "through" scattering from the
backside.
misss_fast_skin_phen
material "misss_fast_skin_phen" (
color texture "lightmap",
color texture "depthmap",
string "lightmap_group",
scalar "lightmap_size",
integer "samples",
shader "bump",
struct "d" {
color "ambient",
color "overall_color",
color "diffuse_color",
scalar "diffuse_weight",
color "front_sss_color",
scalar "front_sss_weight",
scalar "front_sss_radius",
color "mid_sss_color",
scalar "mid_sss_weight",
scalar "mid_sss_radius",
color "back_sss_color",
scalar "back_sss_weight",
scalar "back_sss_radius",
scalar "back_sss_depth"
},
struct "s" {
scalar "overall_weight",
scalar "edge_factor",
color "primary_spec_color",
scalar "primary_weight",
scalar "primary_edge_weight",
scalar "primary_shinyness",
color "secondary_spec_color",
scalar "secondary_weight",
scalar "secondary_edge_weight",
scalar "secondary_shinyness",
scalar "reflect_weight",
scalar "reflect_edge_weight",
scalar "reflect_shinyness",
boolean "reflect_environment_only",
shader "environment"
},
struct "a" {
scalar "lightmap_gamma",
boolean "indirect",
scalar "scale_conversion",
scalar "scatter_bias",
scalar "falloff",
boolean "screen_composit"
},
integer "mode",
array light "lights")
The parameters lightmap, depthmap,
lightmap_group, lightmap_size,
samples, bump, ambient,
lightmap_gamma, indirect,
scale_conversion, scatter_bias,
falloff and screen_composit all work
identically to their counterparts in misss_fast_simple_phen.
- overall_color
- is the overall coloration of all diffuse components. This color
will affect all the underlying layers (unscattered, epidermal,
subdermal, back) and is good for overall color tweaks, or texture
mapping surface features that should block out underlying light,
such as skin moles, textured eyebrows, dirt, etc.
- diffuse_color
diffuse_weight
- color and weight of the normal Lambertian diffuse component.
This represents the very top layer of the skin where all the tiny
bumps are located. For caucasian skin the color would be mostly
white with perhaps a small amount of blue and an appropriate
diffuse weight would be around 0.3.
- front_sss_color
front_sss_weight
front_sss_radius
- are the color, weight and scatter radius within the Epidermal
skin layer, which is the whiteish/yellowish layer just under the
surface. Good values are a slightly yellowish color, a weight of
0.5, and a radius of around 5 to 10mm (0.2 to 0.4 inches).
- mid_sss_color
mid_sss_weight
mid_sss_radius
- are the color, weight and scatter radius of the underlying
subdermal skin layer. The functionality of the parameters is the
same as those beginning with front_ but is for yet another
layer below the top layers, representing the deeper, reddish
"meaty" scattering. A reddish/orangeish color with a weight of
around 0.5 and a radius of 10 to 25mm (0.4 to 1.0 inches) is a good
starting point for experimentation.
- back_sss_color
back_sss_weight
back_sss_radius
back_sss_depth
- represent light going straight through the flesh (for example
for the "red ears" look).
- overall_weight
- is the overall level of specularity and reflections. Generally,
any specularity map is included here and will affect the level of
all specularity options that follow below.
- edge_factor
- sets the "edge width" of the edge reflection effects. Skin
reflects more when watched in angles nearly perpendicular to it
(known as a "Fresnel effect") and this parameter sets the
narrowness of this edge. Higher values yield a thinner edge. This
edge width applies to all the edge weights listed below.
- primary_spec_color
primary_spec_weight
- are the color and base weight for the first layer of
specularity. The skin specularity functions are two-layered,
allowing simulation of both the broad soft specularity of skin and
any near-reflective specularities of top layer oiliness and
wetness.
- primary_edge_weight
- sets the additional multiplier for the edge, where final
specularity at the edge is the sum of weight and
edge weight.
- primary_shinyness
- is the specular exponent (higher values yield a smaller and
sharper specular highlight, which is a modified Phong model with
edge softening).
- secondary_spec_color
secondary_spec_weight
secondary_edge_weight
secondary_shinyness
- work exactly like the parameters that begin with
primary_ and are for the second layer of specularity. For
skin, a good rule of thumb is to have a 1st specular layer with a
very low shinyness (3.0 to 8.0) and a low level (0.1 to 0.3) but a
rather high edge weight (0.5 to 1.0) and a slightly blueish color,
and a 2nd layer that has high shinyness (20 to 100) and a medium
level (0.3 to 0.6) and no edge enhancement. Introducing mapping
into the specularity channels enhances realism greatly.
- reflect_weight
reflect_edge_weight
- weight and edge weight for reflections. If it is nonzero,
actual (glossy) reflections are added.
- reflect_shinyness
- is the shinyness value for glossy reflections. When it is 0.0,
standard raytraced mirror reflections are used, but for nonzero
values glossy reflections are generated, which increases render
time.
- reflect_environment_only
- if true then only the current environment map is sampled for
reflections, and no actual rays are traced.
- environment
- specifies a local environment shader.
- mode
- is the mode selector for the light lists.
- lights
- is the direct light list.
Fast Skin with Displacement
This Phenomenon is an exact duplicate of misss_fast_skin_phen, but supporting
displacement mapping. This must be a separate Phenomenon because a
Phenomenon with displacement will always attempt to displace the
object.
misss_fast_skin_phen_d
material "misss_fast_skin_phen_d" (
color texture "lightmap",
color texture "depthmap",
string "lightmap_group",
scalar "lightmap_size",
integer "samples",
shader "displace",
shader "bump",
struct "d" {
...
}
integer "mode",
array light "lights")
- displace
- is a shader that displaces the surface.
All other parameters are identical to misss_fast_skin_phen.
Copyright (©) 1986-2009 by
mental images GmbH