i
i
i
i
i
i
i
i
178 6. Texturing
range is usually only the luminance, while the chrominances can be com-
pressed more easily. Roimela et al. [1080] present a very fast compressor
and decompressor algorithm, where the chrominances are downsampled,
and the luminance is stored more accurately. Munkberg et al. [909, 911]
store the luminance using a DXTC-inspired variant of the logarithm of the
luminance and introduce shape transforms for efficient chrominance encod-
ings. Munkberg et al’s algorithm produces compressed HDR textures with
better image quality, while Roimela et al’s have much simpler hardware
for decompression, and compression is also faster. Both these algorithms
require new hardware. Wang et al. [1323] take another approach, which
reuses the DXTC decompression hardware and stores the content of an
HDR texture in two sets of DXTC textures. This gives real-time perfor-
mance today, but with apparent artifacts in some cases [911].
6.3 Procedural Texturing
Performing an image lookup is one way of generating texture values, given
a texture-space location. Another is to evaluate a function, thus defining
a procedural texture.
Although procedural textures are commonly used in offline rendering
applications, image textures are far more common in real-time rendering.
This is due to the extremely high efficiency of the image texturing hardware
in modern GPUs, which can perform many billions of texture accesses
in a second. However, GPU architectures are evolving toward cheaper
computation and (relatively) more costly memory access. This will make
procedural textures more common in real time applications, although they
are unlikely to ever replace image textures completely.
Volume textures are a particularly attractive application for procedural
texturing, given the high storage costs of volume image textures. Such
textures can be synthesized by a variety of techniques. One of the most
common is using one or more noise functions to generate values [295, 1003,
1004, 1005]. See Figure 6.23. Because of the cost of evaluating the noise
function, the lattice points in the three-dimensional array are often pre-
computed and used to interpolate texture values. There are methods that
use the accumulation buffer or color buffer blending to generate these ar-
rays [849]. Perlin [1006] presents a rapid, practical method for sampling this
noise function and shows some uses. Olano [960] provides noise generation
algorithms that permit tradeoffs between storing textures and performing
computations. Green [448] gives a higher quality method, but one that
is meant more for near-interactive applications, as it uses 50 pixel shader
instructions for a single lookup. The original noise function presented by
Perlin [1003, 1004, 1005] can be improved upon. Cook and DeRose [197]