Partilhar via


Output-Merger Palco

O estágio de fusão de saída (OM) gera a cor de pixel renderizada final usando uma combinação de estado de pipeline, os dados de pixel gerados pelos sombreadores de pixel, o conteúdo dos destinos de renderização e o conteúdo dos buffers de profundidade/estêncil. O estágio OM é a etapa final para determinar quais pixels são visíveis (com teste de estêncil de profundidade) e misturar as cores finais dos pixels.

Diferenças entre o Direct3D 9 e o Direct3D 10:

  • O Direct3D 9 implementa o teste alfa (usando estado de teste alfa) para controlar se um pixel é gravado em um destino de renderização de saída.
  • O Direct3D 10 e superior não implementa um teste alfa (ou estado de teste alfa). Isso pode ser controlado usando um sombreador de pixel ou com a funcionalidade de profundidade/estêncil.

Visão geral dos testes Depth-Stencil

Um buffer de estêncil de profundidade, que é criado como um recurso de textura, pode conter dados de profundidade e dados de estêncil. Os dados de profundidade são usados para determinar quais pixels estão mais próximos da câmera, e os dados de estêncil são usados para mascarar quais pixels podem ser atualizados. Em última análise, os dados de profundidade e valores de estêncil são usados pelo estágio de fusão de saída para determinar se um pixel deve ser desenhado ou não. O diagrama a seguir mostra conceitualmente como o teste de estêncil de profundidade é feito.

diagrama de como o teste de estêncil de profundidade funciona

Para configurar o teste de estêncil de profundidade, consulte Configurando Depth-Stencil funcionalidade. Um objeto de estêncil de profundidade encapsula o estado de estêncil de profundidade. Um aplicativo pode especificar o estado de estêncil de profundidade ou o estágio OM usará valores padrão. As operações de mistura são realizadas por pixel se a amostragem múltipla estiver desativada. Se a amostragem múltipla estiver habilitada, a mistura ocorrerá por amostra múltipla.

O processo de usar o buffer de profundidade para determinar qual pixel deve ser desenhado é chamado de buffer de profundidade, também chamado de z-buffering.

Uma vez que os valores de profundidade atingem o estágio de fusão de saída (seja proveniente de interpolação ou de um sombreador de pixel), eles são sempre fixados: z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) de acordo com o formato/precisão do buffer de profundidade, usando regras de ponto flutuante. Após a fixação, o valor de profundidade é comparado (usando DepthFunc) com o valor de buffer de profundidade existente. Se nenhum buffer de profundidade estiver vinculado, o teste de profundidade sempre será aprovado.

Se não houver nenhum componente de estêncil no formato de buffer de profundidade, ou nenhum limite de buffer de profundidade, o teste de estêncil sempre será aprovado. Caso contrário, a funcionalidade não será alterada do Direct3D 9.

Apenas um buffer de profundidade/estêncil pode estar ativo de cada vez; Qualquer visualização de recurso acoplada deve corresponder (mesmo tamanho e dimensões) à visualização de profundidade/estêncil. Isso não significa que o tamanho do recurso deve corresponder, apenas que o tamanho da exibição deve corresponder.

Para obter mais informações sobre testes de estêncil de profundidade, consulte tutorial 14.

Visão geral da mistura

A mistura combina um ou mais valores de pixel para criar uma cor de pixel final. O diagrama a seguir mostra o processo envolvido na mistura de dados de pixel.

diagrama de como a mistura de dados funciona

Conceitualmente, você pode visualizar este fluxograma implementado duas vezes no estágio de fusão de saída: o primeiro mistura dados RGB, enquanto em paralelo, um segundo mistura dados alfa. Para ver como usar a API para criar e definir o estado de mesclagem, consulte Configurando a funcionalidade de mesclagem.

A mistura de função fixa pode ser ativada independentemente para cada destino de renderização. No entanto, há apenas um conjunto de controles de mistura, para que a mesma mistura seja aplicada a todos os RenderTargets com a mistura habilitada. Os valores de mesclagem (incluindo BlendFactor) são sempre fixados ao intervalo do formato de renderização-destino antes da mistura. A fixação é feita por destino de renderização, respeitando o tipo de destino de renderização. A única exceção é para os formatos float16, float11 ou float10 que não são fixados para que as operações de mistura nesses formatos possam ser feitas com pelo menos a mesma precisão/alcance que o formato de saída. NaN's e zeros assinados são propagados para todos os casos (incluindo pesos de mistura 0,0).

Quando você usa destinos de renderização sRGB, o tempo de execução converte a cor de destino de renderização em espaço linear antes de executar a mistura. O tempo de execução converte o valor final combinado de volta no espaço sRGB antes de salvar o valor de volta para o destino de renderização.

Diferenças entre o Direct3D 9 e o Direct3D 10:

  • No Direct3D 9, a combinação de função fixa pode ser habilitada independentemente para cada destino de renderização.
  • No Direct3D 10 e superior, há uma descrição de estado de mistura; portanto, um valor de mistura pode ser definido para todos os destinos de renderização.

Dual-Source Mistura de cores

Esse recurso permite que o estágio de fusão de saída use simultaneamente as saídas de sombreador de pixel (o0 e o1) como entradas para uma operação de mistura com o destino de renderização único no slot 0. As operações de mistura válidas incluem: adicionar, subtrair e revogar. As opções de mistura válidas para SrcBlend, DestBlend, SrcBlendAlpha ou DestBlendAlpha incluem: D3D11_BLEND_SRC1_COLOR, D3D11_BLEND_INV_SRC1_COLOR, D3D11_BLEND_SRC1_ALPHA, D3D11_BLEND_INV_SRC1_ALPHA. A equação de mesclagem e a máscara de gravação de saída especificam quais componentes o sombreador de pixel está produzindo. Componentes extras são ignorados.

A gravação em outras saídas de sombreador de pixel (o2, o3 etc.) é indefinida; Você não pode gravar em um destino de renderização se ele não estiver vinculado ao slot 0. Escrever oDepth é válido durante a mistura de cores de fonte dupla.

Para obter exemplos, consulte misturando saídas de sombreador de pixel.

Visão geral de vários RenderTargets

Um sombreador de pixel pode ser usado para renderizar pelo menos 8 destinos de renderização separados, todos os quais devem ser do mesmo tipo (buffer, Texture1D, Texture1DArray e assim por diante). Além disso, todos os destinos de renderização devem ter o mesmo tamanho em todas as dimensões (largura, altura, profundidade, tamanho da matriz, contagens de amostras). Cada destino de renderização pode ter um formato de dados diferente.

Você pode usar qualquer combinação de slots de destino de renderização (até 8). No entanto, uma exibição de recurso não pode ser vinculada a vários slots de destino de renderização simultaneamente. Uma vista pode ser reutilizada desde que os recursos não sejam utilizados em simultâneo.

Visão geral da máscara de Output-Write

Use uma máscara de saída-gravação para controlar (por componente) quais dados podem ser gravados em um destino de renderização.

Visão geral da máscara de exemplo

Uma máscara de exemplo é uma máscara de cobertura de várias amostras de 32 bits que determina quais amostras são atualizadas em destinos de renderização ativos. Apenas uma máscara de amostra é permitida. O mapeamento de bits em uma máscara de amostra para os exemplos em um recurso é definido por um usuário. Para renderização de n-amostras, os primeiros n bits (do LSB) da máscara de amostra são usados (32 bits é o número máximo de bits).

Nesta secção

Tópico Descrição
Configurando Depth-Stencil de funcionalidade
Esta seção aborda as etapas para configurar o buffer de estêncil de profundidade e o estado de estêncil de profundidade para o estágio de fusão de saída.
Configurando a funcionalidade de mesclagem
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.
Viés de profundidade
Polígonos que são coplanares no espaço 3D podem ser feitos para aparecer como se não fossem coplanares, adicionando um z-bias (ou viés de profundidade) a cada um.

Pipeline de gráficos

Estágios de pipeline (Direct3D 10)