i
i
i
i
i
i
i
i
13.6. Efficient Tessellation 629
surfaces is mentioned in Section 13.6.5, where it can be seen that the normal
field is a higher degree “surface” than the actual surface itself. This implies
that merely computing limit normals (which are exact) at the vertices of
the control mesh, and then use the same subdivision scheme used for the
vertices to subdivide the normals is not likely to produce a normal field
with good quality. In addition, such a technique would increase storage,
and it is not obvious whether this is faster.
Assume that each vertex in a mesh has a texture coordinate and a color.
To be able to use these for subdivision surfaces, we also have to create colors
and texture coordinates for each newly generated vertex, too. The most
obvious way to do this is to use the same subdivision scheme as we used
for subdividing the polygon mesh. For example, you can treat the colors as
four-dimensional vectors (RGBA), and subdivide these to create new colors
for the new vertices [1160]. This is a reasonable way to do it, since the color
will have a continuous derivative (assuming the subdivision scheme is at
least C
1
), and thus abrupt changes in colors are avoided over the surface
The same can certainly be done for texture coordinates [250]. However, care
must be taken when there are boundaries in texture space. For example,
assume we have two patches sharing an edge but with different texture
coordinates along this edge. The geometry should be subdivided with the
surface rules as usual, but the texture coordinates should be subdivided
using boundary rules in this case.
A sophisticated scheme for texturing subdivision surfaces is given by
Piponi and Borshukov [1017].
13.6 Efficient Tessellation
To display a curved surface in a real-time rendering context, we usually
need to create a triangle mesh representation of the surface. This process
is known as tessellation. The simplest form of tessellation is called uniform
tessellation. Assume that we have a parametric B´ezier patch, p(u, v), as
described in Equation 13.28. We want to tessellate this patch by computing
11 points per patch side, resulting in 10 × 10 × 2 = 200 triangles. The
simplestwaytodothisistosampletheuv-space uniformly.Thus,we
evaluate p(u, v) for all (u
k
,v
l
)=(0.1k, 0.1l), where both k and l can be
any integer from 0 to 10. This can be done with two nested for-loops. Two
triangles can be created for the four surface points p(u
k
,v
l
), p(u
k+1
,v
l
),
p(u
k+1
,v
l+1
), and p(u
k
,v
l+1
).
While this certainly is straightforward, there are faster ways to do it.
Instead of sending tessellated surfaces, consisting of many triangles, over
the bus from the CPU to the GPU, it makes more sense to send the curved
surface representation to the GPU and let it handle the data expansion.