Configuración de la funcionalidad de fusión

Las operaciones de fusión se realizan en cada salida del sombreador de píxeles (valor RGBA) antes de escribir el valor de salida en un destino de representación. Si se habilita el muestreo múltiple, la combinación se realiza en cada multimuestra; de lo contrario, la combinación se realiza en cada píxel.

Creación del estado de blend

El estado de mezcla es una colección de estados que se usan para controlar la mezcla. Estos estados (definidos en D3D11_BLEND_DESC1) se usan para crear el objeto de estado de mezcla llamando a ID3D11Device1::CreateBlendState1.

Por ejemplo, este es un ejemplo muy sencillo de creación de estado de mezcla que deshabilita la combinación alfa y no usa enmascaramiento de píxeles por componente.

ID3D11BlendState1* g_pBlendStateNoBlend = NULL;

D3D11_BLEND_DESC1 BlendState;
ZeroMemory(&BlendState, sizeof(D3D11_BLEND_DESC1));
BlendState.RenderTarget[0].BlendEnable = FALSE;
BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
pd3dDevice->CreateBlendState1(&BlendState, &g_pBlendStateNoBlend);

Este ejemplo es similar al ejemplo HLSLWithoutFX10.

Enlazar el estado de mezcla

Después de crear el objeto blend-state, enlace el objeto blend-state a la fase de fusión de salida llamando a ID3D11DeviceContext::OMSetBlendState.

float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
UINT sampleMask   = 0xffffffff;

pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask);

Esta API toma tres parámetros: el objeto blend-state, un factor de mezcla de cuatro componentes y una máscara de ejemplo. Puede pasar NULL para el objeto blend-state para especificar el estado de mezcla predeterminado o pasar un objeto blend-state. Si ha creado el objeto de estado de mezcla con D3D11_BLEND_BLEND_FACTOR o D3D11_BLEND_INV_BLEND_FACTOR, puede pasar un factor de mezcla para modular los valores del sombreador de píxeles, el destino de representación o ambos. Si no creó el objeto de estado de mezcla con D3D11_BLEND_BLEND_FACTOR o D3D11_BLEND_INV_BLEND_FACTOR, todavía puede pasar un factor de mezcla no NULL, pero la fase de mezcla no usa el factor de mezcla; el tiempo de ejecución almacena el factor de mezcla y, posteriormente, puede llamar a ID3D11DeviceContext::OMGetBlendState para recuperar el factor de mezcla. Si pasa NULL, el tiempo de ejecución usa o almacena un factor de mezcla igual a { 1, 1, 1, 1 }. La máscara de ejemplo es una máscara definida por el usuario que determina cómo muestrear el destino de representación existente antes de actualizarlo. La máscara de muestreo predeterminada es 0xffffffff que designa el muestreo de puntos.

En la mayoría de los esquemas de almacenamiento en búfer de profundidad, el píxel más cercano a la cámara es el que se dibuja. Al configurar el estado de galería de símbolos de profundidad, el miembro DepthFunc de D3D11_DEPTH_STENCIL_DESC puede ser cualquier D3D11_COMPARISON_FUNC. Normalmente, querrás que DepthFunc sea D3D11_COMPARISON_LESS, de modo que los píxeles más cercanos a la cámara sobrescribirán los píxeles detrás de ellos. Sin embargo, en función de las necesidades de la aplicación, se puede usar cualquiera de las otras funciones de comparación para realizar la prueba de profundidad.

Temas de fusión avanzada

Alfa a cobertura

Alfa a cobertura es una técnica de muestreo múltiple que es más útil para situaciones como follaje denso donde hay varios polígonos superpuestos que usan transparencia alfa para definir bordes dentro de la superficie.

Puede usar el miembro AlphaToCoverageEnable de D3D11_BLEND_DESC1 o D3D11_BLEND_DESC para alternar si el tiempo de ejecución convierte el componente .a (alfa) del registro de salida SV_Target0 del sombreador de píxeles a una máscara de cobertura de n pasos (dada una renderTarget de n-sample). El tiempo de ejecución realiza una operación AND de esta máscara con la cobertura de muestra típica para el píxel en el primitivo (además de la máscara de ejemplo) para determinar qué muestras se van a actualizar en todos los RenderTargetactivos.

Si el sombreador de píxeles genera SV_Coverage, el tiempo de ejecución deshabilita la cobertura alfa a cobertura.

Nota

En el muestreo múltiple, el entorno de ejecución solo comparte una cobertura para todos los RenderTargets. El hecho de que el tiempo de ejecución lee y convierte .a de la salida SV_Target0 a cobertura cuando AlphaToCoverageEnable es TRUE no cambia el valor .a que va al combinador en RenderTarget 0 (si se establece un RenderTarget allí). En general, si habilita la cobertura alfa-to-coverage, no afecta a la forma en que todas las salidas de color de los sombreadores de píxeles interactúan con RenderTargeta través de la fase de fusión de salida , excepto que el tiempo de ejecución realiza una operación AND de la máscara de cobertura con la máscara alfa a cobertura. Alfa a cobertura funciona de forma independiente para si el tiempo de ejecución puede combinar RenderTarget o si usa la combinación en RenderTarget.

 

El hardware gráfico no especifica exactamente cómo convierte exactamente el sombreador de píxeles SV_Target0.a (alfa) en una máscara de cobertura, excepto que el alfa de 0 (o menos) debe asignarse a ninguna cobertura y alfa de 1 (o superior) debe asignarse a cobertura completa (antes de que el tiempo de ejecución realice una operación AND con cobertura primitiva real). A medida que el alfa va de 0 a 1, la cobertura resultante generalmente debe aumentar de forma monotónica. Sin embargo, el hardware puede realizar dithering de área para proporcionar una mejor cuantificación de los valores alfa a costa de la resolución espacial y el ruido. Un valor alfa de NaN (No un número) da como resultado una máscara sin cobertura (cero).

La cobertura alfa a cobertura también se usa tradicionalmente para la transparencia de la puerta de pantalla o para definir siluetas detalladas para sprites opacos de otro modo.

Combinar salidas del sombreador de píxeles

Esta característica permite que la fusión de salida use las salidas del sombreador de píxeles simultáneamente como orígenes de entrada para una operación de fusión con el único destino de representación en la ranura 0.

En este ejemplo se toman dos resultados y se combinan en un solo paso, combinando uno en el destino con una multiplicación y el otro con un agregado:

SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;

En este ejemplo se configura la primera salida del sombreador de píxeles como el color de origen y la segunda salida como un factor de combinación de componentes por color.

SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;

En este ejemplo se muestra cómo los factores de mezcla deben coincidir con los swizzles del sombreador:

SrcFactor = D3D11_BLEND_SRC1_ALPHA;
DestFactor = D3D11_BLEND_SRC_COLOR;
OutputWriteMask[0] = .ra; // pseudocode for setting the mask at
                          // RenderTarget slot 0 to .ra

Juntos, los factores de mezcla y el código del sombreador implican que el sombreador de píxeles es necesario para generar al menos o0.r y o1.a. El sombreador puede generar componentes de salida adicionales, pero se omitiría, menos componentes generarían resultados indefinidos.

Fase de fusión de salida

Fases de canalización (Direct3D 10)