¿Qué es un búfer de plantilla?

26

Wikipedia afirma que un búfer de plantilla es un búfer arbitrario que un sombreador puede usar.

Sin embargo, insinúa que se usa para recortar, o de otra manera "unir estrechamente" la profundidad y los búferes de píxeles, contradiciéndose un poco.

¿Qué hace realmente el búfer de plantilla y cómo se usa prácticamente en las aplicaciones modernas?

Qix
fuente

Respuestas:

31

La definición del búfer de plantilla de Wikipedia no es realmente buena, se centra demasiado en los detalles de las implementaciones modernas (OpenGL). Encuentro la versión desambiguada más fácil de entender:

Una plantilla es una plantilla utilizada para dibujar o pintar letras, símbolos, formas o patrones idénticos cada vez que se usa. El diseño producido por dicha plantilla también se denomina plantilla.

Eso es lo que la plantilla significaba antes de Computer Graphics. Si escribe stencil en Google Images, este es uno de los primeros resultados:

Máscara de plantilla

Como puede ver, es simplemente una máscara o patrón que puede usarse para "pintar" lo negativo del patrón en algo.

El búfer de plantilla funciona exactamente de la misma manera. Se puede llenar el búfer de la plantilla con un patrón seleccionado haciendo un pase de representación de la plantilla, luego establecer la función de plantilla adecuada que definirá cómo se interpretará el patrón en los dibujos posteriores, y luego renderizar la escena final. Los píxeles que caen en las áreas rechazadas de la máscara de plantilla, de acuerdo con la función de comparación, no se dibujan.


Cuando se trata de implementar el búfer de stencil, a veces se combina con el búfer de profundidad. La mayoría del hardware de gráficos utiliza un búfer de plantilla de 1 byte (8 bits), que es suficiente para la mayoría de las aplicaciones. Los buffers de profundidad generalmente se implementan utilizando 3 bytes (24 bits), lo que nuevamente es suficiente para la mayoría de los tipos de renderizado 3D. Por lo tanto, es lógico empacar los 8 bits del búfer de plantilla con los otros 24 del búfer de profundidad, lo que permite almacenar cada píxel de profundidad + stencil en un entero de 32 bits. Eso es lo que Wikipedia quería decir con:

El búfer de profundidad y el búfer de plantilla a menudo comparten la misma área en la RAM del hardware de gráficos.


Una aplicación en la que el búfer de la plantilla solía ser el rey era para el renderizado de sombras, en una técnica llamada volúmenes de sombras , o en ocasiones también llamada sombras de plantillas . Este fue un uso muy inteligente del búfer, pero hoy en día la mayor parte del campo de representación parece haberse desplazado hacia mapas de sombras basados ​​en la profundidad.

glampert
fuente
Es un personaje, pero cleaver-> clever. No puedo editarlo D: Gran respuesta por cierto, esto tiene más sentido hasta ahora.
Qix
3
Si tiene un sombreador costoso por píxel, el búfer de galería de símbolos también se puede usar para agrupar hilos similares, reduciendo la divergencia y aumentando la ocupación como en este documento de la OIT, sección 2.6 (descargo de responsabilidad: soy un autor).
jozxyqk
@jozxyqk, eso es algo fuera de la caja pensando allí mismo. Muy agradable.
glampert
13

El búfer de stencil es un búfer de enteros sin signo, generalmente de 8 bits en la actualidad, donde puede completar la información por píxel como lo desee en función del uso de varias operaciones ( OpenGL Ops aquí, por ejemplo ) después de una prueba de stencil.

La prueba de galería de símbolos es simplemente una operación por píxel en la que el valor actual de galería de píxeles se prueba contra el contenido del búfer de galería de símbolos. Establece la condición a la que se pasa la prueba de plantilla (por ejemplo, SIEMPRE, MENOS, etc.).

Puede decidir qué sucede con el valor de la plantilla según el resultado de la prueba (en OpenGL usando la operación que lo vinculé anteriormente)

El búfer de plantilla tiene bastantes usos, los primeros que vienen a la mente son:

  • Se puede usar como una máscara para renderizar selectivamente cierta parte del framebuffer y descartar el resto. Esto, por ejemplo, es útil para reflexiones, pero también mucho más. Cuando se trata de renderizado de resolución múltiple, se puede usar para marcar bordes que deben renderizarse a una resolución más alta. Hay muchos usos de enmascaramiento realmente.
  • Un filtro de sobregiro muy simple, por ejemplo. Puede configurar la prueba de plantilla para que siempre pase y siempre incremente el valor. El valor con el que termina en el búfer de la plantilla representa su sobregiro. [*]

En el pasado se ha utilizado también para técnicas de sombreado como el volumen de sombra.

El pobre búfer de la plantilla a menudo se subestima bastante, pero puede ser una buena arma en el arsenal de un programador de gráficos.

[*] ¡Valor para ser leído en un post-proceso usando el SRV correcto!

EDITAR: Además, vale la pena mencionar que en Shader Model 5.1 (por lo tanto, D3D11.3 y D3D12) tiene acceso al valor de referencia de la plantilla a través de SV_StencilRef

cifz
fuente
6

Un búfer de plantilla contiene datos enteros por píxel que se utilizan para agregar más control sobre qué píxeles se representan.

Un búfer de plantilla funciona de manera similar a un búfer de profundidad. De manera similar, los datos de la plantilla se almacenan en un búfer de profundidad. Mientras que los datos de profundidad determinan qué píxel está más cerca de la cámara, los datos de plantilla pueden usarse como una máscara por píxel de propósito más general para guardar o descartar píxeles. Para crear la máscara, use una función de plantilla para comparar un valor de plantilla de referencia, un valor global, con el valor en el búfer de plantilla cada vez que se representa un píxel.

Fuente: ¿Qué es un búfer de plantilla? El | Red de desarrolladores de Microsoft

La idea general es que se puede establecer un valor para cada píxel y luego fijar la operación ( GREATER, SMALLER,EQUAL etc.), cuando este se considera verdadero el píxel está sombreada y se muestran.

Una aplicación es la reflexión en tiempo real, cuando se procesa la textura de reflexión, el búfer de plantilla se usa para crear una máscara para el lugar donde se aplica la reflexión. Por ejemplo, solo aplique el reflejo a los triángulos sombreados del material de vidrio. También se puede utilizar para crear máscaras bidimensionales arbitrarias para todo el framebuffer.

Maurice Laveaux
fuente