Stencil planes enable and disable drawing on a per-pixel basis. They are typically used in multipass algorithms to achieve special effects, such as decals, outlining, shadows, and constructive solid geometry rendering.
Some hardware designed to accelerate Direct3D implements stencil planes. The special effects enabled by stencil planes are useful for entertainment applications.
Stencil planes are assumed to be embedded in the z-buffer data.
In DirectX 5.0, applications found the available z-buffer bit depths using the DDBD_Xx flags set in the dwDeviceZBufferBitDepth member of the D3DDEVICEDESC_V1 structure. To support z-buffers with stencil and z-buffer bit depths that cannot be represented using the existing DDBD_Xx flags, DirectX 6.0 and later versions have a new API entry point, IDirect3D7::EnumZBufferFormats (described in the Direct3D SDK documentation), which returns an array of DDPIXELFORMAT structures describing the possible z-buffer/stencil pixel formats. The DDPIXELFORMAT structure includes the following new z-buffer-related members:
Specifies the number of stencil bits (as an integer, not as a DDBD_Xx flag value).
Specifies which bits the z-value occupies. If nonzero, this mask means that the z-buffer is a standardized unsigned integer z-buffer format.
Specifies which bits the stencil value occupies.
A new flag, DDPF_STENCILBUFFER, indicates the presence of stencil bits within the z-buffer. The dwZBufferBitDepth member, which existed previously, gives the total number of z-buffer bits including the stencil bits.
DirectX 6.0 and later versions drivers should still set the appropriate DDBD_Xx flags in dwDeviceZBufferBitDepth for the z-only z-buffer formats they support. If stencil planes are not supported and the DDBD_Xx flags can represent all available z-buffer formats, then setting these flags is sufficient, because they are translated into DDPIXELFORMAT by IDirect3D7::EnumZBufferFormats. Otherwise, the Direct3D driver must respond to a DdGetDriverInfo query that uses the GUID_ZPixelFormats GUID by returning a buffer in which the first DWORD indicates the number of valid z-buffer DDPIXELFORMAT structures, followed by the DDPIXELFORMAT structures themselves.
New render states associated with stencil planes are shown in the following table, which lists the render state, the type associated with the render state's value, and a description. For more details on these render states, see the DirectX SDK documentation.
Comparison function. The test passes if the following expression is true:
(ref & mask) OPERATION (stencil & mask) where ref is the reference value, stencil is the value in the stencil buffer, and mask is the value of D3DRENDERSTATE_STENCILMASK.
Reference value used in the stencil test.
Mask value used in the stencil test.
Write mask applied to any values written to the stencil buffer.
These new render states are defined, respectively, to inform the hardware about what to do when the stencil test fails, when the stencil test passes but the z-test fails, and when both the stencil and z-tests pass. The values of these new render states can be set to enumerators of the D3DSTENCILOP enumerated type, which specify the desired stencil operation to be performed. For more information about D3DSTENCILOP, see the DirectX SDK documentation.