O que é um buffer de estêncil?

26

A Wikipedia afirma que um buffer de estêncil é um buffer arbitrário que um shader pode usar.

No entanto, ele sugere que é usado para recortar ou "vincular firmemente" os buffers de profundidade e pixel, contradizendo-se um pouco.

O que o buffer de estêncil realmente faz e como é praticamente usado em aplicativos modernos?

Qix
fonte

Respostas:

31

A definição de buffer de estêncil da Wikipedia não é realmente boa, ela se concentra demais nos detalhes das implementações modernas (OpenGL). Acho a versão desambiguação mais fácil de entender:

Um estêncil é um modelo usado para desenhar ou pintar letras, símbolos, formas ou padrões idênticos toda vez que é usado. O design produzido por esse modelo também é chamado de estêncil.

Isso é o que o estêncil significava antes da computação gráfica. Se você digitar stencil nas Imagens do Google, este é um dos primeiros resultados:

Máscara de estêncil

Como você pode ver, é simplesmente uma máscara ou padrão que pode ser usado para "pintar" o negativo do padrão em algo.

O buffer de estêncil funciona exatamente da mesma maneira. Pode-se preencher o buffer de estêncil com um padrão selecionado, fazendo um passe de renderização do estêncil, depois defina a função de estêncil apropriada que definirá como o padrão deve ser interpretado nos desenhos subseqüentes e, em seguida, renderize a cena final. Os pixels que caem nas áreas rejeitadas da máscara de estêncil, de acordo com a função de comparação, não são desenhados.


Quando se trata de implementar o buffer de estêncil, às vezes é realmente acoplado ao buffer de profundidade. A maioria dos hardwares gráficos usa um buffer de estêncil de 1 byte (8 bits), o que é suficiente para a maioria dos aplicativos. Os buffers de profundidade geralmente são implementados usando 3 bytes (24 bits), o que normalmente é suficiente para a maioria dos tipos de renderização em 3D. Portanto, é lógico empacotar os 8 bits do buffer de estêncil com os outros 24 do buffer de profundidade, possibilitando armazenar cada pixel de profundidade + estêncil em um número inteiro de 32 bits. Isso é o que a Wikipedia quis dizer com:

O buffer de profundidade e o buffer de estêncil geralmente compartilham a mesma área na RAM do hardware gráfico.


Um aplicativo em que o buffer de estêncil costumava ser rei era para renderização de sombra, em uma técnica chamada volumes de sombra , ou às vezes também apropriadamente chamada sombras de estêncil . Esse foi um uso muito inteligente do buffer, mas hoje em dia a maior parte do campo de renderização parece ter mudado para mapas de sombra baseados em profundidade.

glampert
fonte
É um personagem, mas cleaver-> clever. Não consigo editá-lo. D: Ótima resposta, a propósito, isso faz mais sentido até agora.
Qix
3
Se você tiver um shader caro por pixel, o buffer de estêncil também poderá ser usado para agrupar segmentos semelhantes, reduzindo a divergência e aumentando a ocupação, como neste artigo da OIT, seção 2.6 (aviso: sou um autor).
Jozxyqk
@jozxyqk, isso é algo fora da caixa pensando ali! Muito agradável.
glampert
13

O buffer de estêncil é um buffer inteiro sem sinal, geralmente de 8 bits hoje em dia, onde é possível preencher as informações por pixel conforme desejado, com base no uso de várias operações ( OpenGL Ops aqui, por exemplo ) após um teste de estêncil.

O teste de estêncil é simplesmente uma operação por pixel em que o valor atual do estêncil de pixel é testado em relação ao conteúdo do buffer de estêncil. Você define a condição para a qual o teste de estêncil é aprovado (por exemplo, SEMPRE, MENOS etc.).

Você pode decidir o que acontece com o valor do estêncil, dependendo do resultado do teste (no OpenGL, usando a operação que eu vinculei acima)

O buffer de estêncil tem muitos usos, os primeiros que vêm à mente sendo:

  • Ele pode ser usado como uma máscara para renderizar seletivamente determinada parte do buffer de estrutura e descartar o restante. Isso, por exemplo, é útil para reflexões, mas também muito mais. Ao lidar com renderização de várias resoluções, ele pode ser usado para marcar bordas que precisam ser renderizadas com uma resolução mais alta. Na verdade, existem muitos usos de máscara.
  • Um filtro de extração muito simples, por exemplo. Você pode definir o teste de estêncil para sempre passar e sempre incrementar o valor. O valor que você acaba no buffer de estêncil representa seu excesso. [*]

No passado, era usado também para técnicas de sombreamento, como o volume Shadow.

O pobre buffer de estêncil costuma ser subestimado, mas pode ser uma boa arma no arsenal de um programador de gráficos.

[*] Valor a ser lido novamente em um pós-processo usando o SRV certo!

EDIT: Além disso, vale ressaltar que no Shader Model 5.1 (então D3D11.3 e D3D12) você tem acesso ao valor de referência do estêncil via SV_StencilRef

cifz
fonte
6

Um buffer de estêncil contém dados inteiros por pixel que são usados ​​para adicionar mais controle sobre quais pixels são renderizados.

Um buffer de estêncil opera de maneira semelhante a um buffer de profundidade. Da mesma forma, esses dados de estêncil são armazenados em um buffer de profundidade. Enquanto os dados de profundidade determinam qual pixel é o mais próximo da câmera, os dados de estêncil podem ser usados ​​como uma máscara por pixel de uso mais geral para salvar ou descartar pixels. Para criar a máscara, use uma função de estêncil para comparar um valor de estêncil de referência - um valor global - com o valor no buffer de estêncil cada vez que um pixel é renderizado.

Fonte: O que é um buffer de estêncil? | Rede de desenvolvedores da Microsoft

A idéia geral é que você pode definir um valor para cada pixel e, em seguida, definir a operação ( GREATER, SMALLER, EQUALetc), quando este for avaliada como True o pixel é sombreada e mostrado.

Um aplicativo é a reflexão em tempo real; ao renderizar a textura de reflexão, o buffer de estêncil é usado para criar uma máscara para onde a reflexão é aplicada. Por exemplo, aplique apenas a reflexão nos triângulos sombreados do material de vidro. Também pode ser usado para criar máscaras bidimensionais arbitrárias para todo o buffer de estrutura.

Maurice Laveaux
fonte