Compartilhar via


Estágio de fusão de saída (OM)

O estágio OM (Fusão de Saída) combina vários tipos de dados de saída (valores de sombreador de pixel, informações de profundidade e estêncil) com o conteúdo do destino de renderização e buffers de profundidade/estêncil para gerar o resultado final do pipeline.

Finalidade e usos

O estágio OM (Fusão de Saída) é a etapa final para determinar quais pixels são visíveis (com teste de estêncil de profundidade) e mesclar as cores finais de pixel.

O estágio OM gera a cor final do pixel renderizado usando uma combinação do seguinte:

  • Estado do pipeline
  • Os dados de pixel gerados pelos sombreadores de pixel
  • O conteúdo dos destinos de renderização
  • O conteúdo dos buffers de profundidade/estêncil.

Visão geral da mesclagem

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

Diagrama de como funciona a combinação de dados

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

A combinação de função fixa pode ser habilitada independentemente para cada destino de renderização. No entanto, há apenas um conjunto de controles de mesclagem, para que a mesma mesclagem seja aplicada a todos os RenderTargets com a mesclagem habilitada. Os valores de mesclagem (incluindo BlendFactor) são sempre fixados ao intervalo do formato de destino de renderização antes da mesclagem. 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 mesclagem nesses formatos possam ser feitas com pelo menos a mesma precisão/intervalo que o formato de saída. NaN e zeros com sinal 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 do destino de renderização em espaço linear antes de executar a mesclagem. O runtime converte o valor combinado final de volta em espaço sRGB antes de salvar o valor de volta no destino de renderização.

Mistura de cores de fonte dupla

Esse recurso permite que o estágio de Fusão de Saída use simultaneamente as duas saídas do sombreador de pixel (o0 e o1) como entradas para uma operação de mesclagem com o único destino de renderização no slot 0. As operações de mesclagem válidas incluem: adicionar, subtrair e subtrair. 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.

Gravar em outras saídas de sombreador de pixel (o2, o3 etc.) é indefinido; Você não poderá gravar em um destino de renderização se ele não estiver associado ao slot 0. A gravação de oDepth é válida durante a mesclagem de cores de origem dupla.

Visão geral do teste de estêncil de profundidade

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 valores de profundidade e 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 funciona o teste de estêncil de profundidade

Para configurar o teste de estêncil de profundidade, consulte Configurando a funcionalidade de estêncil de profundidade. 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 mesclagem são executadas por pixel se a multiamostragem estiver desabilitada. Se a multisampling estiver habilitada, a combinação ocorrerá por multisample.

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.

Depois que os valores de profundidade atingem o estágio de fusão de saída (seja proveniente da 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 associado, 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.

Apenas um buffer de profundidade/estêncil pode estar ativo por vez; Qualquer exibição de recurso associada deve corresponder (mesmo tamanho e dimensões) à exibiçã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.

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 as amostras 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).

Entrada

O estágio OM (Fusão de Saída) gera a cor de pixel renderizada final usando uma combinação do seguinte:

  • Estado do pipeline
  • Os dados de pixel gerados pelos sombreadores de pixel
  • O conteúdo dos destinos de renderização
  • O conteúdo dos buffers de profundidade/estêncil.

Saída

Visão geral da máscara de gravação de saída

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

Visão geral de vários destinos de renderização

Um sombreador de pixel pode ser usado para renderizar em 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 amostra). Cada destino de renderização pode ter um formato de dados diferente.

Você pode usar qualquer combinação de slots de destinos de renderização (até 8). No entanto, uma exibição de recurso não pode ser associada a vários slots de destino de renderização simultaneamente. Uma exibição pode ser reutilizada, desde que os recursos não sejam usados simultaneamente.

Nesta seção

Tópico Descrição

Configurando a funcionalidade de estêncil de profundidade

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.

 

Pipeline de elementos gráficos