Written by Robert
Dunlop
Microsoft DirectX MVP |
|
Description
This sample
demonstrates an alternative method for implementing user-defined clipping planes
in DirectX. Clipping occurs during rasterization, and does not rely upon
Direct3D support for clipping planes. This technique does not require the
use of programmable shaders, using only standard render states and texture stage
states to achieve this effect.
Performance of this technique with large geometries is markedly better than
using clip planes with software vertex processing to clip vertices. On
cards that do not provide the needed support for user-defined clipping planes,
this allows hardware vertex processing to be used, rather than having to drop
back to the used of software vertex processing.
Clipping Planes in Direct3D
User-defined clipping planes allow the application to define one or more
planes, in world space, to which primitives will be clipped.
Up to six clipping planes can be defined simultaneously when using software
vertex processing, so support of this feature through emulation is guaranteed.
When using hardware vertex processing, the number of clipping planes that can be
simultaneously defined varies. One major manufacturer of video cards,
which previously implemented clipping planes at a cost of one texture stage per
plane, recently removed support from their drivers entirely.
There are basically two ways that clipping can be implemented:
- Primitives can be clipped prior to rasterization, modifying vertices and
adding extra triangles as needed. This is how clipping planes are
implemented in software vertex processing.
- Pixels can be tested against the clipping planes and clipped pixels be
excluded from rasterization.
Our Alternative
The demo performs clipping in pixel space, by using a texture as an alpha
mask and mapping the texture so that areas to be clipped fall within a
transparent region of the texture. This involves several functional
components:
| A small texture is created that acts as an alpha mask. In its
simplest form, used for clipping to a single plane, a 2x1 texture is used,
consisting of one opaque and one transparent pixel. |
| Automatic texture coordinates are generated by Direct3D using the
D3DTSS_TCI_CAMERASPACEPOSITION texture coordinate index, so that texture
coordinates are generated based on the position in camera space. |
| Texture coordinate transformation is then applied, using a matrix that
transforms the camera space coordinates to texture coordinates, such that
pixels that are to be clipped map to transparent texels, while those not
clipped map to opaque pixels. |
| A texture stage modulates the pixel's alpha by that of the mapped alpha
mask. |
| Alpha testing is set to exclude rendering of pixels with fully transparent
alpha. |
Multiple planes can be clipped in a single texture stage using this
technique. In the demo, four clipping planes are simultaneously clipped,
using a single texture stage.
Notes
Here are some miscellaneous notes and suggestions regarding this technique:
| Release Notes for the sample:
| The sample does not set min and mag texture filters, as the default
point filtering is what is required. If you extend this sample, be
sure that point filtering is set for the mask texture's stage. |
| The sample doesn't use any textures other than the mask, so it just
selects the alpha from the texture. To use with texture mapping, use
the mask in the last stage and set the alpha operation to modulate between
the texture and the current alpha. |
|
| Extending the number of planes:
| The number of arbitrary planes that can be clipped using a generalized
application of this technique is two planes per stage, using a 2x2 mask.
That corresponds to one plane per texture coordinate component (u and v).
The texture coordinate transformation matrix is offset so that the planes
lie on u=0.5 and v=0.5. |
| Using a 4x4 mask, as in the sample, two pairs of parallel planes can be
clipped against. The transformation is scaled and offset such the area
between the planes falls in the range of 0.25 to 0.75. Note that to
use two pairs together in this manner, the normals of both pairs must have
the same relation, either the normals of both pairs point away from each
other, or they both point towards each other. |
| A programmable vertex shader could extend the number of planes clipped
in a single stage indefinitely. |
|
| Some ideas:
| To achieve blending of the clipped edges, linear filtering could be
applied to the mask. The size of the blended area would be dependent
on the resolution of the mask texture. |
| Masks could be possibly be created to perform non-planar clipping, for
example, clipping to a curve. This would most likely work best with
texture filtering of the mask set to linear or better , and an alpha test
reference that is just shy of opaque. |
| Possible uses of projected texture coordinates using D3DTTFF_PROJECTED
and the fourth column of the texture transform matrix? |
|
|