Reference
|
IntroductionThis page presents a collection of expressions that can be used with source code for surface and displacement shaders. The expressions use the values of the global variables s and t, both of which by default are in the range 0 to 1, to calculate values in other ranges.
|
||
Being able to conveniently convert one range of
values into another range is very useful when, for example, the effect of
a surface or displacement shader needs to be gradually modified towards
the edges of a surface. |
||
|
Mapping 0 - 1 to 1 - 0 - 1
Deriving an expression that will convert values in one range to their
associated values in another range can be visualized as a process of
'moving' and 'stretching' the initial range, say 0 to 1, along a
fixed number line.
For example, the diagram below shows the original range, 0 to 1, being mapped to the range 1 to 0 to 1.
If the original range of values was represened by say the s
texture coordinate, new values could be calculated using the following
expression.
|
||
The effect of using newValue to scale the displacement of a wave is shown below.
|
Mapping 0 - 1 to 0 - 1 - 0The diagram below shows the original range, 0 to 1, being mapped to the range 0 to 1 to 0.
The equivalent expression is,
|
||
The effect of using newValue, calculated with both 's' and 't', to scale the displacement of a turbulance shader is shown below.
|
Mapping a Subrange to 0 - 1 - 0The diagrams show a subrange a to c being mapped to the range 0 to 1 to 0. It is assumed b is the midpoint of ac
The equivalent expression is,
|
||
The effect of using this expression to calculate a displacement in both 's' and 't' is shown below.
|
Using the Sine FunctionThe sine function is part of the maths library that is built into the shading language. The function returns a value that is the ratio of the length of a rotating line divided by its vertical height. The end of the rotating line sweeps out the circumference of a circle. If the line is one unit long the circumference of the circle is 2 x PI or 6.283185 units in length.
In the diagram shown above the vertical height
of the rotating line, itself 1 unit in length, can never be greater
than +1 and never be less than -1. Consequently for any rotation
of the line, measured by the distance its end has moved along the
circumference of the circle, the sine function returns values in the
range +1 to -1. The unit of measurement used to express the rotation
is the radian.
|
||
The effect of using waveHeight in a displacement shader is shown below.
To avoid negative numbers it is often necessary to keep waveHeight
in the range 0 to 1. The following expression accomplishes this,
|
||
It is also useful to be able to shift the sine wave horizonally so
that the wave begins and ends at a 'trough', a 'peak' or anywhere
in between. The following expression introduces control over the
phase of the wave.
Often an arbitary number of cycles of the sine wave is required, the
following expression includes a variable that controls the number of
waves,
The effect of using this expression in a displacement shader is shown below.
|
||
Occasionally it is necessary to modify the sine wave so that it produces
only 'bumps'. Here is the expression,
|
Using the Mod Function
The mod function divides one number by another but returns only the
remainder. For example,
The mod function is very useful when creating repeating patterns
on a surface. In the diagram above, 4 sub-ranges have been created,
however, the function can be used to make any number of repeats.
To generate 8 repeated patterns, say in the 's' direction, the following
expression would be applied.
|
© 2002- Malcolm Kesson. All rights reserved.