Configurando a funcionalidade de mesclagem

As operações de mesclagem são executadas em cada saída de sombreador de pixel (valor RGBA) antes que o valor de saída seja gravado em um destino de renderização. Se o multisampling estiver habilitado, a mesclagem será feita em cada várias amostras; caso contrário, a mesclagem é executada em cada pixel.

Criar o Estado do Blend

O estado de mistura é uma coleção de estados usados para controlar a mesclagem. Esses estados (definidos em D3D11_BLEND_DESC1) são usados para criar o objeto de estado de combinação chamando ID3D11Device1::CreateBlendState1.

Por exemplo, aqui está um exemplo muito simples de criação de estado de mistura que desabilita a mesclagem alfa e não usa nenhuma máscara de pixel 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 exemplo é semelhante ao exemplo HLSLWithoutFX10.

Associar o estado de mesclagem

Depois de criar o objeto blend-state, associe o objeto blend-state ao estágio output-merger chamando ID3D11DeviceContext::OMSetBlendState.

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

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

Essa API usa três parâmetros: o objeto blend-state, um fator de combinação de quatro componentes e uma máscara de exemplo. Você pode passar NULL para o objeto blend-state para especificar o estado de combinação padrão ou passar um objeto de estado de mistura. Se você criou o objeto blend-state com D3D11_BLEND_BLEND_FACTOR ou D3D11_BLEND_INV_BLEND_FACTOR, poderá passar um fator de combinação para modular valores para o sombreador de pixel, renderizar o destino ou ambos. Se você não criou o objeto blend-state com D3D11_BLEND_BLEND_FACTOR ou D3D11_BLEND_INV_BLEND_FACTOR, ainda poderá passar um fator de combinação não NULL, mas o estágio de mesclagem não usa o fator blend; O runtime armazena o fator blend e, posteriormente, você pode chamar ID3D11DeviceContext::OMGetBlendState para recuperar o fator blend. Se você passar NULL, o runtime usará ou armazenará um fator de combinação igual a { 1, 1, 1, 1 }. A máscara de exemplo é uma máscara definida pelo usuário que determina como amostrar o destino de renderização existente antes de atualizá-lo. A máscara de amostragem padrão é 0xffffffff que designa amostragem de ponto.

Na maioria dos esquemas de buffer, o pixel mais próximo da câmera é aquele que é desenhado. Ao configurar o estado do estêncil de profundidade, o membro DepthFunc do D3D11_DEPTH_STENCIL_DESC pode ser qualquer D3D11_COMPARISON_FUNC. Normalmente, você gostaria que DepthFunc fosse D3D11_COMPARISON_LESS, para que os pixels mais próximos da câmera substituam os pixels atrás deles. No entanto, dependendo das necessidades do aplicativo, qualquer uma das outras funções de comparação pode ser usada para fazer o teste de profundidade.

Tópicos avançados de mesclagem

Alpha-to-Coverage

A alpha-to-coverage é uma técnica multisampling que é mais útil para situações como folhagens densas em que há vários polígonos sobrepostos que usam a transparência alfa para definir bordas dentro da superfície.

Você pode usar o membro AlphaToCoverageEnable de D3D11_BLEND_DESC1 ou D3D11_BLEND_DESC para alternar se o runtime converter o componente .a (alfa) do registro de saída SV_Target0 do sombreador de pixel para uma máscara de cobertura de n etapas (dado um RenderTarget de n amostra). O runtime executa uma operação AND dessa máscara com a cobertura de exemplo típica para o pixel no primitivo (além da máscara de exemplo) para determinar quais exemplos atualizar em todos os RenderTargetsativos.

Se o sombreador de pixels SV_Coverage, o runtime desabilita a cobertura alfa a.

Observação

Em multisampling, o runtime compartilha apenas uma cobertura para todos os RenderTargets. O fato de que o runtime lê e converte .a de saída SV_Target0 para cobertura quando AlphaToCoverageEnable é TRUE não altera o valor .a que vai para o liquidificador em RenderTarget 0 (se um RenderTarget for definido lá). Em geral, se você habilitar a alpha-to-coverage, não afetará como todas as saídas de cores de sombreadores de pixel interagem com RenderTargetpor meio do estágio de fusão de saída , exceto que o runtime executa uma operação AND da máscara de cobertura com a máscara alfa-to-coverage. A alpha-to-coverage funciona independentemente se o runtime pode misturar RenderTarget ou se você usa a combinação no RenderTarget.

 

O hardware gráfico não especifica exatamente como converte o sombreador de pixels SV_Target0.a (alfa) em uma máscara de cobertura, exceto que alfa de 0 (ou menos) deve ser mapeado para nenhuma cobertura e alfa de 1 (ou maior) deve ser mapeado para cobertura completa (antes que o runtime execute uma operação AND com cobertura primitiva real). Como alfa vai de 0 a 1, a cobertura resultante geralmente deve aumentar monotonicamente. No entanto, o hardware pode executar dithering de área para fornecer alguma quantização melhor de valores alfa ao custo de resolução espacial e ruído. Um valor alfa de NaN (Não um Número) resulta em uma máscara sem cobertura (zero).

A cobertura alfa a cobertura também é tradicionalmente usada para transparência de porta de tela ou definição de silhuetas detalhadas para sprites opacos de outra forma.

Combinando saídas de sombreador de pixel

Esse recurso permite que a fusão de saída use as saídas do sombreador de pixel simultaneamente como fontes de entrada para uma operação de mesclagem com o destino de renderização única no slot 0.

Este exemplo usa dois resultados e os combina em uma única passagem, mesclando um ao destino com uma multiplicação e a outra com um complemento:

SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;

Este exemplo configura a saída do primeiro sombreador de pixel como a cor de origem e a segunda saída como um fator de mesclagem de componente por cor.

SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;

Este exemplo ilustra como os fatores de combinação devem corresponder aos swizzles do 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, os fatores de combinação e o código do sombreador implicam que o sombreador de pixel é necessário para gerar pelo menos o0.r e o1.a. Componentes de saída extras podem ser gerados pelo sombreador, mas seriam ignorados, menos componentes produziriam resultados indefinidos.

Estágio de fusão de saída

Estágios de pipeline (Direct3D 10)