Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As operações de mistura 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 a amostragem múltipla estiver ativada, a mistura é feita em cada amostra múltipla; caso contrário, a mistura é realizada em cada pixel.
- Criar o estado de mistura
- Vincular o estado de mistura
-
Tópicos avançados de mistura
- de Cobertura Alfa
- Misturando saídas de sombreador de pixel
- Tópicos relacionados
Criar o estado de mesclagem
O estado de mistura é uma coleção de estados usados para controlar a mistura. Esses estados (definidos em D3D11_BLEND_DESC1) são usados para criar o objeto de estado de mesclagem chamando ID3D11Device1::CreateBlendState1.
Por exemplo, aqui está um exemplo muito simples de criação de estado de mistura que desativa a mistura alfa e não usa 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 HLSLWithoutFX10 Sample.
Vincular o estado de mesclagem
Depois de criar o objeto de estado de mistura, associe-o ao estágio de combinação de saída 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 de estado de mistura, um fator de mistura de quatro componentes e uma máscara de exemplo. Você pode passar NULL para o objeto blend-state para especificar o estado de mesclagem padrão ou passar em um objeto blend-state. Se criou o objeto de estado de mistura com D3D11_BLEND_BLEND_FACTOR ou D3D11_BLEND_INV_BLEND_FACTOR, poderá passar um fator de mesclagem para modular os valores do shader de píxel, alvo de renderização ou ambos. Se não criou o objeto de estado de mistura com D3D11_BLEND_BLEND_FACTOR ou D3D11_BLEND_INV_BLEND_FACTOR, ainda assim pode passar um fator de mistura não nulo, mas o estágio de mistura não o utiliza; o tempo de execução armazena o fator de mistura, e posteriormente, pode chamar ID3D11DeviceContext::OMGetBlendState para recuperar o fator de mistura. Se você passar NULL , o tempo de execução usará ou armazenará um fator de mesclagem igual a { 1, 1, 1, 1 }. A máscara de exemplo é uma máscara definida pelo usuário que determina como obter uma amostra do destino de renderização existente antes de atualizá-lo. A máscara de amostragem padrão é 0xffffffff que designa a amostragem pontual.
Na maioria dos esquemas de buffer de profundidade, o pixel mais próximo da câmera é o que é desenhado. Ao configurar o estado do estêncil de profundidade, o DepthFunc membro 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âmara substituam os pixels por trás. No entanto, dependendo das necessidades da sua aplicação, qualquer uma das outras funções de comparação pode ser usada para fazer o teste de profundidade.
Tópicos de mistura avançados
- de Cobertura Alfa
- Misturando saídas dos shaders de píxel
Alfa-To-Coverage
Alfa-to-coverage é uma técnica de amostragem múltipla que é mais útil para situações como folhagem densa onde existem vários polígonos sobrepostos que usam transparência alfa para definir arestas dentro da superfície.
Você pode usar o AlphaToCoverageEnable membro de D3D11_BLEND_DESC1 ou D3D11_BLEND_DESC para decidir se o tempo de execução deve converter o componente .a (alfa) do registo de saída SV_Target0 do shader de píxel em uma máscara de cobertura com n etapas (dado um RenderTarget de n amostras). O tempo de execução executa uma operação E dessa máscara com a cobertura de amostra típica para o pixel na primitiva (além da máscara de exemplo) para determinar quais amostras atualizar em todos os RenderTargetativos.
Se a saída do shader de pixéis SV_Coverage, o tempo de execução desativa alpha-to-coverage.
Observação
Em multiamostragem, o tempo de execução compartilha apenas uma cobertura para todos os RenderTargets. O facto de que a runtime lê e converte .a da saída SV_Target0 para cobertura quando AlphaToCoverageEnable é TRUE não altera o valor .a que vai para o mecanismo de mistura em RenderTarget 0 (se um RenderTarget estiver definido lá). Em geral, se ativares alfa-para-cobertura, não afetarás a forma como todas as saídas de cores dos shaders de píxel interagem com os RenderTargets através do estágio de fusão de saída , exceto que o tempo de execução realiza uma operação E da máscara de cobertura com a máscara alfa-para-cobertura. Alpha-to-coverage funciona independentemente se o tempo de execução pode se misturar RenderTarget ou se você usa a mistura em RenderTarget.
O hardware gráfico não especifica exatamente como converte o sombreador de pixel SV_Target0.a (alfa) em uma máscara de cobertura, exceto que alfa de 0 (ou menos) deve mapear para nenhuma cobertura e alfa de 1 (ou superior) deve mapear para cobertura total (antes que o tempo de execução execute uma operação E com cobertura primitiva real). Como o alfa vai de 0 a 1, a cobertura resultante geralmente deve aumentar monotonicamente. No entanto, o hardware pode executar pontilhamento de área para fornecer uma melhor quantização dos valores alfa ao custo da resolução espacial e do ruído. Um valor alfa de NaN (Not a Number) resulta em uma máscara sem cobertura (zero).
A cobertura alfa também é tradicionalmente usada para transparência de portas de tela ou definição de silhuetas detalhadas para sprites de outra forma opacos.
Misturando resultados de sombreadores de píxels
Esse recurso permite que o combinador de saídas use as saídas do pixel shader simultaneamente, como fontes de entrada para uma operação de mistura com o alvo único de renderização no slot 0.
Este exemplo obtém dois resultados e os combina numa única operação, intercalando um no destino com uma multiplicação e o outro com uma adição.
SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;
Este exemplo configura a primeira saída do pixel shader como a cor de origem e a segunda saída como um fator de mistura de componentes por cor.
SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;
Este exemplo ilustra como os fatores de mesclagem devem corresponder às oscilações 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 mistura e o código do sombreador implicam que o sombreador de pixels deve gerar pelo menos o0.r e o1.a. Componentes de saída extra podem ser produzidos pelo sombreador, mas seriam ignorados, menos componentes produziriam resultados indefinidos.
Tópicos relacionados