Before I show you the demo, let me talk about one last
important detail.
Silhouette maps add higher frequency content to the textures, and
thus they must be properly filtered when they are minimized or they will alias.
Fortunately, there is already a real-time technique for dealing with
texture minimization that works quite well: the mipmap.
Because our silhouette map is a texture-based representation, it
is compatible with mipmapping.
Thus to eliminate artifacts when our
textures are minimized, we do the following:
we convert our silhouette map texture into a
standard bitmap of the same resolution by computing the area coverage
of each of the 4 deformed
cells under each texel of the final texture and then
compute the color of each texel by the weighting the four
deformed cell colors by their respective areas. This gives us
a bitmap which has been filtered
across the discontinuities and which will look similar to the bitmap generated
if you perform standard filtering to downsample a normal texture.
Once you have this bitmap, we can
mipmap it as normal. During rendering, we use the graphics hardware to
tell us when we
need to switch between the mipmap to the silhouette map representation to
allow us to seamlessly transition between them. Because the mipmaps
have been generated from a bitmap created directly from the silhouette
map texture, there is no popping or artifacts during this transition.
Remember that these mipmapped versions will only be used when the
ratio of screen-pixels
to texture pixels is less than 1 (never when the texture is
magnified on the screen), so the
blurriness of the mipmap
will not be noticeable because multiple texels will map to a
single screen pixel and never
vice-versa.