Qual é o objetivo do buffer de estêncil? Mais precisamente, o que é um estêncil em computação gráfica?

41

Eu leio muito a palavra estêncil e não tenho idéia de qual é o seu real objetivo em computação gráfica.

Vendo a foto em preto e branco na wikipedia, ainda estou tendo problemas com ela.

Por que usamos um estêncil ou um buffer de estêncil e qual é a diferença com um buffer Z? Por que usar essa palavra que parece ter algum significado no design gráfico?

jokoon
fonte
Ótima pergunta, tudo o que sei é que ela é usada para renderizar sombras ... Mas ficarei interessado em ouvir uma explicação completa!
Ricket 12/09/10

Respostas:

40

Na sua encarnação original, um buffer de estêncil era um buffer de quadro de um bit por pixel (ou seja, preto ou branco, mas não cinza). Você pode renderizar o que quiser como qualquer outro buffer de quadro. Posteriormente, você poderá usar o conteúdo desse buffer para "estêncil" ou ocultar ao desenhar para o buffer comum.

Um exemplo: digamos que você esteja fazendo um jogo de direção. Você quer ter um pequeno espelho retrovisor na tela que mostra o que está atrás do carro. Você precisará renderizar uma vista apontando atrás do carro, mas só deseja renderizá-la dentro do pequeno retângulo arredondado do espelho retrovisor. A solução típica é:

  1. Renderize a forma de retângulo arredondado no buffer de estêncil.
  2. Ative o stencilling.
  3. Renderize a vista apontando para trás no buffer regular.

O estêncil irá mascará-lo para que você desenhe apenas a forma do espelho.

Agora que os pipelines de renderização são muito mais flexíveis e programáveis, os buffers de estêncil são usados ​​apenas como um buffer de quadros genérico de 1 bit, com o qual você pode fazer o que quiser. Sombras são um caso de uso comum.

maravilhoso
fonte
10
Em outras palavras, ele basicamente tem a mesma função que um estêncil da vida real, mascarando partes ao aplicar tinta.
Kaj
4
Atualmente, quase todos os dispositivos suportam um buffer de estêncil de 8 bits.
21810 Chris Howe
Eu realmente não entendo o seu exemplo, é como se houvesse um segundo frustro? rasteriza outra parte da cena? Você pode dar um exemplo com sombras?
Jokoon 29/09/10
É apenas um segundo buffer de quadro. Você sempre pode mudar o frustum antes de renderizá-lo (que é o que acho que os sistemas de sombra fazem), mas isso não faz parte do conceito principal.
munificent
9

Além do uso funcional dos buffers de estêncil que as pessoas já discutiram, os buffers de estêncil também podem ser usados ​​para otimização.

Devido à posição do teste de estêncil no pipeline de gráficos (que é anterior ao sombreamento de pixels), o teste de estêncil pode ser usado para eliminar pixels que realizam trabalhos pesados ​​de sombreamento quando não são necessários. Muitas vezes, isso pode ser feito com uma granularidade mais grossa do que apenas um pixel, por exemplo. um bloco de pixels, para que o trabalho também possa ser selecionado durante os estágios de rasterização grosseira.

jpaver
fonte
4

É apenas um buffer que controla quais pixels podem ser modificados quando os polígonos são renderizados. Para cada pixel, há um valor de estêncil correspondente e os pixels podem ser modificados / ignorados condicionalmente, dependendo desses valores

No mais simples, pode ser usado como um estêncil físico - uma máscara que permite a passagem de alguns pixels e impede a modificação de outros pixels.

É muito semelhante no comportamento a um buffer z - como o teste de profundidade, o teste de estêncil é um teste verdadeiro / falso e há configurações semelhantes para controlar o teste de estêncil (passe se maior / menor / igual). Mas, em vez de escrever uma profundidade, geralmente terá valores predefinidos gravados, ou serão incrementados / decrementados quando os pixels forem desenhados, conforme usado nos algoritmos de sombra de estêncil.

bluescrn
fonte