Stencil Buffers (Windows Embedded CE 6.0)
1/6/2010
The stencil buffer enables or disables drawing to the rendering target surface on a pixel-by-pixel basis. At its most fundamental level, it enables applications to mask sections of the rendered image so that they are not displayed. Applications often use stencil buffers for special effects such as dissolves, decaling, and outlining.
Stencil buffer information is embedded in the z-buffer data. Your application can use the IDirect3DMobile::CheckDeviceFormat method to check for hardware stencil support, as shown in the following code example.
// Reject devices that cannot perform 8-bit stencil buffering.
// The following example assumes that pCaps is a valid pointer
// to an initialized D3DMCAPS structure.
if( FAILED( m_pD3DM->CheckDeviceFormat( pCaps->AdapterOrdinal,
pCaps->DeviceType,
Format,
0,
D3DMRTYPEFLAG_SURFACE,
D3DMFMT_D24S8 ) ) )
return E_FAIL;
IDirect3DMobile::CheckDeviceFormat allows you to choose a device to create based on the capabilities of that device. In this case, devices that do not support 8-bit stencil buffers are rejected. Note that this is only one possible use for IDirect3DMobile::CheckDeviceFormat.
To determine the stencil buffer limitations of a device, query the StencilCaps member of the D3DMCAPS structure for its supported stencil buffer operations.
How the Stencil Buffer Works
Microsoft® Direct3D® Mobile performs a test on the contents of the stencil buffer on a pixel-by-pixel basis. For each pixel in the target surface, it performs a test using the corresponding value in the stencil buffer, a stencil reference value, and a stencil mask value. If the test passes, Direct3D Mobile performs an action. The test is performed using the following steps:
- Perform a bitwise AND operation of the stencil reference value with the stencil mask.
- Perform a bitwise AND operation of the stencil buffer value for the current pixel with the stencil mask.
- Compare the result of step 1 to the result of step 2, using the comparison function.
These steps are shown in the following code example.
(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue is the contents of the stencil buffer for the current pixel. This code example uses the ampersand (&) symbol to represent the bitwise AND operation. StencilMask represents the value of the stencil mask, and StencilRef represents the stencil reference value. CompFunc is the comparison function.
The current pixel is written to the target surface if the stencil test passes and is ignored otherwise. The default comparison behavior is to write the pixel, no matter how each bitwise operation turns out (D3DMCMP_ALWAYS). You can change this behavior by changing the value of the D3DMRS_STENCILFUNC render state (see D3DMRENDERSTATETYPE), passing a member of the D3DMCMPFUNC enumerated type to identify the desired comparison function.
Customizing the Stencil Buffer
Your application can customize the operation of the stencil buffer. It can set the comparison function, the stencil mask, and the stencil reference value. It can also control the action that Direct3D Mobile takes when the stencil test passes or fails.