Técnicas de búfer de galería de símbolos (Direct3D 9)

Las aplicaciones usan el búfer de galería de símbolos para enmascarar píxeles en una imagen. La máscara controla si el píxel se dibuja o no. A continuación se muestran algunos de los efectos más comunes.

El búfer de galería de símbolos habilita o deshabilita el dibujo en la superficie de destino de representación en píxeles por píxel. En su nivel más fundamental, permite a las aplicaciones enmascarar secciones de la imagen representada para que no se muestren. Las aplicaciones suelen usar búferes de galería de símbolos para efectos especiales, como disoluciones, escalado y esquematización.

La información del búfer de galería de símbolos se inserta en los datos del búfer z. La aplicación puede usar el método IDirect3D9::CheckDeviceFormat para comprobar la compatibilidad con la galería de símbolos de hardware, como se muestra en el ejemplo de código siguiente.

// Reject devices that cannot perform 8-bit stencil buffering. 
// The following example assumes that pCaps is a valid pointer 
// to an initialized D3DCAPS9 structure. 

if( FAILED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
                                       pCaps->DeviceType,  
                                       Format,  
                                       D3DUSAGE_DEPTHSTENCIL, 
                                       D3DRTYPE_SURFACE,
                                       D3DFMT_D24S8 ) ) )
return E_FAIL;

IDirect3D9::CheckDeviceFormat permite elegir un dispositivo para crear en función de las funcionalidades de ese dispositivo. En este caso, se rechazan los dispositivos que no admiten búferes de galería de símbolos de 8 bits. Tenga en cuenta que es solo un uso posible para IDirect3D9::CheckDeviceFormat; para obtener más información, consulta Determinar la compatibilidad con hardware (Direct3D 9).

Cómo funciona el búfer de galería de símbolos

Direct3D realiza una prueba sobre el contenido del búfer de galería de símbolos en función de un píxel a píxel. Para cada píxel de la superficie de destino, realiza una prueba con el valor correspondiente en el búfer de galería de símbolos, un valor de referencia de galería de símbolos y un valor de máscara de galería de símbolos. Si se supera la prueba, Direct3D realiza una acción. La prueba se realiza mediante los pasos siguientes.

  1. Realice una operación AND bit a bit del valor de referencia de la galería de símbolos con la máscara de galería de símbolos.
  2. Realice una operación AND bit a bit del valor del búfer de galería de símbolos para el píxel actual con la máscara de galería de símbolos.
  3. Compare el resultado del paso 1 con el resultado del paso 2 mediante la función de comparación.

Estos pasos se muestran en el ejemplo de código siguiente.

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue

es el contenido del búfer de galería de símbolos para el píxel actual. En este ejemplo de código se usa el símbolo y comercial (&) para representar la operación AND bit a bit.

StencilMask

representa el valor de la máscara de galería de símbolos y

StencilRef

representa el valor de referencia de la galería de símbolos.

CompFunc

es la función de comparación.

El píxel actual se escribe en la superficie de destino si se supera la prueba de galería de símbolos y se omite en caso contrario. El comportamiento de comparación predeterminado es escribir el píxel, independientemente de cómo se convierta cada operación bit a bit (D3DCMP_ALWAYS). Puede cambiar este comportamiento cambiando el valor del estado de representación de D3DRS_STENCILFUNC, pasando un miembro del tipo enumerado D3DCMPFUNC para identificar la función de comparación deseada.

La aplicación puede personalizar el funcionamiento del búfer de galería de símbolos. Puede establecer la función de comparación, la máscara de galería de símbolos y el valor de referencia de la galería de símbolos. También puede controlar la acción que Realiza Direct3D cuando la prueba de galería de símbolos supera o produce un error. Para obtener más información, consulta Stencil Buffer State (Direct3D 9) (Estado del búfer de galería de símbolos [Direct3D 9]).

Ejemplos

En los ejemplos de código siguientes se muestra cómo configurar el búfer de galería de símbolos.

// Enable stencil testing
pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);

// Specify the stencil comparison function
pDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);

// Set the comparison reference value
pDevice->SetRenderState(D3DRS_STENCILREF, 0);

//  Specify a stencil mask 
pDevice->SetRenderState(D3DRS_STENCILMASK, 0);

De forma predeterminada, el valor de referencia de la galería de símbolos es cero. Cualquier valor entero es válido. Direct3D realiza una operación AND bit a bit del valor de referencia de la galería de símbolos y un valor de máscara de galería de símbolos antes de la prueba de galería de símbolos.

Puede controlar qué información de píxeles se escribe en función de la comparación de galerías de símbolos.

// A write mask controls what is written
pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, D3DSTENCILOP_KEEP);
// Specify when to write stencil data
pDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);

Puede escribir su propia fórmula para el valor que desea escribir en el búfer de galería de símbolos, como se muestra en el ejemplo siguiente.

NewStencilBufferValue = (StencilBufferValue & ~StencilWriteMask) | 
                        (StencilWriteMask & StencilOp(StencilBufferValue))

Canalización de píxeles