Szirmay-Kalos, Umenhoffer / Displacement Mapping on the GPU
basis vectors as adding a third vector to the basis vectors of
the 2D texture space.
When height function h(u, v) is stored as a texture, we
have to take into account that compact texture formats repre-
sent values in the range of [0,1] with at most 8 bit fixed point
precision, while the height function may have a higher range
and may have even negative values. Thus the stored values
should be scaled and biased. Generally we use two con-
stants SCALE and BIAS and convert the stored texel value
Texel(u,v) as
h(u,v) = BIAS + SCALE · Texel(u, v). (8)
Height maps are often stored in the alpha channel of con-
ventional color textures. Such representations are called re-
lief textures [OB99, OBM00]. Relief textures and their ex-
tensions are also used in image based rendering algorithms
[Oli00, EY03, PS02].
Although this review deals with those displacement map-
ping algorithms which store the height map in a two dimen-
sional texture, we mention that three dimensional textures
also received attention. Dietrich [Die00] introduced eleva-
tion maps, converting the height field to a texture volume.
This method can lead to visual artifacts at grazing angles,
where the viewer can see through the spaces between the
slices. Kautz and Seidel [KS01] extended Dietrich’s method
and minimized the errors at grazing angles. Lengyel used a
rendering technique to display fur interactively on arbitrary
surfaces [LPFH01].
2.1. Lighting displacement mapped surfaces
When mesostructure geometry ~r = ~p +
~
N
0
h is shaded, its
real normal vector should be inserted into the illumination
formulae. The mesostructure normal vector can be obtained
in modeling space as the cross product of two vectors in its
tangent plane. These vectors can be the derivatives accord-
ing to texture coordinates u,v [Bli78]. Using equation 1 we
obtain
∂~r
∂u
=
∂~p
∂u
+
~
N
0
∂h
∂u
+
∂
~
N
0
∂u
h ≈
~
T +
~
N
0
∂h
∂u
since ∂~p/∂u =
~
T and on a smooth macrostructure surface
∂
~
N
0
/∂u ≈ 0. Similarly, the partial derivative according to v
is
∂~r
∂v
=
∂~p
∂v
+
~
N
0
∂h
∂v
+
∂
~
N
0
∂v
h ≈
~
B +
~
N
0
∂h
∂v
.
The mesostructure normal vector is the cross product of
these derivatives:
~
N
0
=
∂~r
∂u
×
∂~r
∂v
=
~
N + (
~
N
0
×
~
B)
∂h
∂u
+ (
~
T ×
~
N
0
)
∂h
∂v
,
since
~
T ×
~
B =
~
N and
~
N
0
×
~
N
0
= 0.
In order to speed up the evaluation of the mesostructure
normal, vectors
~
t =
~
N
0
×
~
B and
~
b =
~
T ×
~
N
0
can be pre-
computed on the CPU and passed to the vertex shader if illu-
mination is computed per vertex, or to the fragment shader if
illumination is computed per fragment. Since vectors
~
t and
~
b
are in the tangent plane they can also play the roles of tangent
and binormal vectors. Using these vectors the mesostructure
normal is
~
N
0
=
~
N +
~
t
∂h
∂u
+
~
b
∂h
∂v
. (9)
The following fragment shader code computes the
mesostructure normal according to this formula, replacing
the derivatives by finite differences. The macrostructure nor-
mal
~
N, and tangent plane vectors
~
t,
~
b are passed in registers
and are denoted by N, t, and b, respectively. The texture co-
ordinates of the current point are in uv and the displacement
is in the alpha channel of texture map hMap of resolution
WIDTH×HEIGHT.
float2 du=float2(1/WIDTH, 0);
float2 dv=float2(0, 1/HEIGHT);
float dhdu = SCALE/(2/WIDTH)
*
(tex2D(hMap, uv+du).a -
tex2D(hMap, uv-du).a);
float dhdv = SCALE/(2/HEIGHT)
*
(tex2D(hMap, uv+dv).a -
tex2D(hMap, uv-dv).a);
// get model space normal vector
float3 mNormal = normalize(N+t
*
dhdu+b
*
dhdv);
On the other hand, instead of evaluating this formula to
obtain mesostructure normals we can also use normal maps
which store the mesostructure normals in textures. Height
values and normal vectors are usually organized in a way
that the r, g,b channels of a texel represent either the tangent
space or the modeling space normal vector, and the alpha
channel the height value.
Storing modeling space normal vectors in normal maps
has the disadvantage that the normal map cannot be tiled
onto curved surfaces since multiple tiles would associate
the same texel with several points on the surface, which do
not necessarily have the same mesostructure normal. Note
that by storing tangent space normal vectors this problem is
solved since in this case the mesostructure normal depends
not only on the stored normal but also on the transformation
between tangent and modeling spaces, which can follow the
orientation change of curved faces.
Having the mesostructure normal, the next crucial prob-
lem is to select the coordinate system where we evaluate the
illumination formula, for example, the Phong-Blinn reflec-
tion model [Bli77]. Light and view vectors are available in
world or in camera space, while the shading normal is usu-
ally available in tangent space. The generally correct solu-
tion is to transform the normal vector to world or camera
space and evaluate the illumination there. However, if the
mappings between world space and modeling space, and be-
tween modeling space and tangent space are angle preserv-
c
° The Eurographics Association and Blackwell Publishing 2008.