Compartilhar via


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.

Depois de saber como usar o buffer de estêncil de profundidade e o estado de estêncil de profundidade correspondente, consulte técnicas avançadas de estêncil.

Criar estado de estêncil de profundidade

O estado de estêncil de profundidade informa ao estágio de fusão de saída como executar o teste de estêncil de profundidade. O teste de estêncil de profundidade determina se um determinado pixel deve ou não ser desenhado.

Associar dados de estêncil de profundidade ao estágio OM

Associe o estado de estêncil de profundidade.

Associe o recurso de estêncil de profundidade usando uma exibição.

Os destinos de renderização devem ser todos do mesmo tipo de recurso. Se a suavização de serrilhado de várias amostras for usada, todos os destinos de renderização associados e buffers de profundidade deverão ter as mesmas contagens de amostra.

Quando um buffer é usado como um destino de renderização, não há suporte para o teste de estêncil de profundidade e vários destinos de renderização.

  • Até 8 destinos de renderização podem ser vinculados simultaneamente.
  • Todos os destinos de renderização devem ter o mesmo tamanho em todas as dimensões (largura e altura e profundidade para 3D ou tamanho da matriz para tipos *Array).
  • Cada destino de renderização pode ter um formato de dados diferente.
  • As máscaras de gravação controlam quais dados são gravados em um destino de renderização. A gravação de saída mascara em um destino por renderização, por nível de componente, quais dados são gravados no(s) destino(s) de renderização.

Técnicas avançadas de estêncil

A parte do estêncil do buffer de estêncil de profundidade pode ser usada para criar efeitos de renderização, como composição, decalque e contorno.

Composição

Seu aplicativo pode usar o buffer de estêncil para compor imagens 2D ou 3D em uma cena 3D. Uma máscara no buffer de estêncil é usada para ocluir uma área da superfície de destino de renderização. As informações 2D armazenadas, como texto ou bitmaps, podem ser gravadas na área ocluída. Como alternativa, seu aplicativo pode renderizar primitivas 3D adicionais para a região mascarada por estêncil da superfície de destino de renderização. Ele pode até renderizar uma cena inteira.

Os jogos muitas vezes compõem várias cenas 3D juntas. Por exemplo, os jogos de corrida normalmente exibem um espelho retrovisor. O espelho contém a visão da cena 3D atrás do motorista. É essencialmente uma segunda cena 3D composta com a visão frontal do motorista.

Decalque

Os aplicativos Direct3D usam decalque para controlar quais pixels de uma determinada imagem de primitiva são desenhados para a superfície de destino de renderização. Os aplicativos aplicam decalques às imagens de primitivas para permitir que os polígonos coplanares sejam renderizados corretamente.

Por exemplo, ao aplicar marcas de pneus e linhas amarelas em uma estrada, as marcações devem aparecer diretamente em cima da estrada. No entanto, os valores z das marcações e da estrada são os mesmos. Portanto, o buffer de profundidade pode não produzir uma separação limpa entre os dois. Alguns pixels da primitiva traseira podem ser renderizados na parte superior da primitiva frontal e vice-versa. A imagem resultante parece cintilar de quadro para quadro. Esse efeito é denominado z-fighting ou flimmering.

Para resolver esse problema, use um estêncil para mascarar a seção da primitiva traseira na qual o decalque aparecerá. Desative o buffer z e renderize a imagem da primitiva frontal na área mascarada da superfície de destino de renderização.

A mistura de várias texturas pode ser usada para resolver esse problema.

Contornos e silhuetas

Você pode usar o buffer de estêncil para efeitos mais abstratos, como contornos e silhuetas.

Se o aplicativo fizer duas passagens de renderização – uma para gerar a máscara de estêncil e a segunda para aplicar a máscara de estêncil à imagem, mas com os primitivos um pouco menores na segunda passagem, a imagem resultante conterá apenas o contorno do primitivo. O aplicativo pode preencher a área mascarada por estêncil da imagem com uma cor sólida, dando à primitiva uma aparência em alto-relevo.

Se a máscara de estêncil tiver mesmos tamanho e forma que a primitiva que você está renderizando, a imagem resultante conterá um espaço onde a primitiva deverá estar. O aplicativo pode preencher o espaço com preto para produzir uma silhueta da primitiva.

Estêncil de dois lados

Os volumes de sombra são usados para desenhar sombras com o buffer de estêncil. O aplicativo calcula os volumes de sombra lançados pela geometria de oclusão ao calcular as bordas da silhueta e lançá-las para longe da luz para um conjunto de volumes 3D. Esses volumes são renderizados duas vezes no buffer de estêncil.

A primeira renderização desenha polígonos frontais e incrementa os valores do buffer de estêncil. A segunda renderização desenha os polígonos traseiros do volume de sombra e diminui os valores do buffer de estêncil.

Normalmente, todos os valores incrementados e diminuídos se anulam. No entanto, a cena já foi renderizada com geometria normal, fazendo com que alguns pixels falhem no teste de buffer z à medida que o volume de sombra é renderizado. Os valores deixados no buffer de estêncil correspondem aos pixels que estão na sombra. Esse conteúdo remanescente do buffer de estêncil é usado como uma máscara, para fazer uma combinação alfa de um grande e abrangente quadrupleto preto na cena. Com o buffer de estêncil agindo como uma máscara, o resultado é o escurecimento dos pixels que estão nas sombras.

Isso significa que a geometria da sombra é desenhada duas vezes por fonte de luz, pressionando a produtividade do vértice da GPU. O recurso de estêncil de dois lados foi projetado para mitigar essa situação. Nessa abordagem, existem dois conjuntos de estado de estêncil (nomeados abaixo), um conjunto cada para os triângulos frontais e o outro para os triângulos traseiros. Dessa forma, apenas uma única passagem é desenhada por volume de sombra, por luz.

Lendo o buffer de estêncil de profundidade como uma textura

Um buffer de estêncil de profundidade inativo pode ser lido por um sombreador como uma textura. Um aplicativo que lê um buffer de estêncil de profundidade como uma textura é renderizado em duas passagens, a primeira passagem grava no buffer de estêncil de profundidade e a segunda passagem lê do buffer. Isso permite que um sombreador compare valores de profundidade ou estêncil gravados anteriormente no buffer com o valor do pixel que está sendo renderizado no momento. O resultado da comparação pode ser usado para criar efeitos como mapeamento de sombra ou partículas suaves em um sistema de partículas.

Estágio de Fusão de Saída (OM)

Pipeline de elementos gráficos

Fase de Produção-Concentração