stringtranslate.com

Búfer de plantilla

En esta imagen, hay regiones blancas y regiones negras, que representan unos y ceros en el búfer de plantilla, respectivamente. Luego se dibujan formas encima de las rayas invirtiendo el valor del buffer de la plantilla. Si el búfer en ese píxel tiene un valor de 0 (negro), coloree el píxel de blanco (1) y viceversa.

Un búfer de plantilla es un búfer de datos adicional , además del búfer de color y el búfer Z , que se encuentra en el hardware de gráficos moderno . El búfer es por píxel y funciona con valores enteros , normalmente con una profundidad de un byte por píxel. El búfer Z y el búfer de plantilla suelen compartir la misma área en la RAM del hardware de gráficos.

En el caso más sencillo, el búfer de plantilla se utiliza para limitar el área de renderizado (estampado). El uso más avanzado del búfer de plantilla hace uso de la fuerte conexión entre el búfer Z y el búfer de plantilla en el proceso de renderizado . Por ejemplo, los valores de la plantilla se pueden aumentar o disminuir automáticamente para cada píxel que falla o pasa la prueba de profundidad.

La simple combinación de prueba de profundidad y modificadores de plantilla hace posible una gran cantidad de efectos (como volúmenes de sombras de plantilla , plantilla de dos caras, [1] composición, calcomanía, disolución, desvanecimiento, deslizamiento, siluetas, dibujo de contorno o resaltado de intersecciones). entre primitivas complejas ), aunque a menudo requieren varias pasadas de renderizado y, por lo tanto, pueden suponer una gran carga para el hardware de gráficos.

La aplicación más típica sigue siendo la de añadir sombras a aplicaciones 3D . También se utiliza para reflexiones planas.

Otras técnicas de renderizado, como el renderizado de portal , utilizan el búfer de plantilla de otras maneras; por ejemplo, se puede utilizar para encontrar el área de la pantalla oscurecida por un portal y volver a representar esos píxeles correctamente.

Se puede acceder al búfer de plantilla y sus modificadores en gráficos por computadora mediante API como OpenGL , Direct3D o Vulkan .

Arquitectura

El búfer de plantilla normalmente comparte el mismo espacio de memoria que el búfer Z y normalmente la proporción es de 24 bits para el búfer Z + 8 bits para el búfer de plantilla o, en el pasado, 15 bits para el búfer Z + 1 bit para el búfer de plantilla. . Otra variante es 4+24, donde se utilizan 28 de los 32 bits y 4 se ignoran. Los buffers de plantilla y Z son parte del buffer de fotograma, acoplados al buffer de color. El primer chip disponible para un mercado más amplio fue Permedia II de 3Dlabs, que admitía un búfer de plantilla de un bit.

Los bits asignados al búfer de plantilla se pueden usar para representar valores numéricos en el rango [0, 2 n -1], y también como una matriz booleana (n es el número de bits asignados), cada uno de los cuales se puede usar para controlar la parte particular de la escena. También es posible cualquier combinación de estas dos formas de utilizar la memoria disponible.

Prueba de plantilla

La prueba de plantilla o estarcido se encuentra entre las operaciones sobre los píxeles/fragmentos (operaciones por píxel), ubicadas después de la prueba alfa y antes de la prueba de profundidad . La prueba de plantilla garantiza que los píxeles no deseados no alcancen la prueba de profundidad. Esto ahorra tiempo de procesamiento de la escena. De manera similar, la prueba alfa puede evitar que los píxeles correspondientes alcancen la prueba de plantilla.

La prueba en sí se lleva a cabo sobre el búfer de plantilla para determinar algún valor en él, o para modificarlo o usarlo, y se lleva a cabo a través de la llamada función de plantilla y operaciones de plantilla. La función de plantilla es una función mediante la cual se compara el valor de plantilla de un determinado píxel con un valor de referencia determinado. Si esta comparación es lógicamente cierta , la prueba de la plantilla pasa. De otra forma no.

Al hacerlo, la posible reacción causada por el resultado de comparar tres búfer de plantilla y profundidad de estado diferentes:

Para cada uno de estos casos se pueden establecer diferentes operaciones sobre el píxel examinado. En las funciones de plantilla OpenGL, el valor de referencia y la máscara, respectivamente, definen la función glStencilFunc. En Direct3D cada uno de estos componentes se ajusta individualmente utilizando los métodos SetRenderState que los dispositivos controlan actualmente. Este método espera dos parámetros, el primero de los cuales es una condición establecida y el otro su valor. En el orden utilizado anteriormente, estas condiciones se denominan D3DRS_STENCILFUNC, D3DRS_STENCILREF y D3DRS_STENCILMASK.

Las operaciones de plantilla en OpenGL ajustan la función glStencilOp que espera tres valores. En Direct3D, nuevamente, cada estado establece un método específico SetRenderState. Los tres estados que se pueden asignar a la cirugía se denominan D3DRS_STENCILFAIL, D3DRENDERSTATE_STENCILZFAIL y D3DRENDERSTATE_STENCILPASS.

lucha Z

Debido a la falta de precisión en el búfer Z, los polígonos coplanares de corto alcance o superpuestos se pueden representar como un solo plano con una multitud de secciones transversales irregulares. Estas secciones pueden variar según la posición de la cámara y otros parámetros y cambian rápidamente. Esto se llama lucha Z. Existen múltiples soluciones a este problema:

- Acerque el plano lejano para restringir la profundidad de la escena, aumentando así la precisión del búfer Z o reduciendo la distancia a la que los objetos son visibles en la escena.

- Aumentar el número de bits asignados al búfer Z, lo que es posible a expensas de la memoria del búfer de plantilla.

- Separa los polígonos entre sí, lo que restringe las posibilidades del artista de crear una escena elaborada.

Todos estos enfoques del problema sólo pueden reducir la probabilidad de que los polígonos experimenten lucha Z y no garantizan una solución definitiva en el caso general.

Una solución que incluye el búfer de plantilla se basa en saber qué polígono debe estar delante de los demás. La silueta del polígono frontal se dibuja en el búfer de plantilla. Después de eso, el resto de la escena se puede renderizar solo donde la silueta es negativa y, por lo tanto, no chocará con el polígono frontal.

Volumen de sombra

El volumen de sombras es una técnica utilizada en gráficos por computadora en 3D para agregar sombras a una escena renderizada. Fueron propuestos por primera vez por Frank Crow en 1977 [2] como la geometría que describe la forma tridimensional de la región ocluida de una fuente de luz. Un volumen de sombra divide el mundo virtual en dos: áreas que están en sombra y áreas que no lo están.

La implementación del búfer de plantilla de los volúmenes de sombra generalmente se considera una de las técnicas de sombreado en tiempo real de uso general más prácticas para su uso en hardware de gráficos 3D moderno. Ha sido popularizado por el videojuego Doom 3 , y una variación particular de la técnica utilizada en este juego se conoce como Carmack's Reverse .

Reflexiones

El reflejo de una escena se dibuja cuando la escena misma se transforma y refleja en relación con el plano "espejo", lo que requiere múltiples pases de renderizado y el uso de un búfer de plantilla para restringir las áreas donde funciona el pase de renderizado actual:

  1. Dibuje la escena excluyendo las áreas de espejo: para cada espejo, bloquee el búfer Z y el búfer de color.
    1. Renderizar parte visible del espejo.
    2. La prueba de profundidad está configurada para que cada píxel pase para ingresar el valor máximo y siempre pase
  2. para cada espejo:
    1. La prueba de profundidad está configurada para que pase solo si la distancia de un píxel es menor que la actual (comportamiento predeterminado)
    2. La transformación de la matriz se cambia para reflejar la escena en relación con el plano del espejo.
    3. Desbloquea el búfer Z y el búfer de color.
    4. Dibuja la escena, pero sólo la parte que se encuentra entre el plano del espejo y la cámara. En otras palabras, un plano especular es también un plano de recorte.
    5. Nuevamente bloquea el búfer de color, la prueba de profundidad se configura para que siempre pase, restablece la plantilla para el siguiente espejo.

Sombras planas

Al dibujar un plano de sombras, hay dos problemas dominantes: el primero se refiere al problema de la lucha profunda en caso de que la geometría plana no se consiga en la parte cubierta por la sombra de las sombras y en el exterior. Consulte la sección relacionada con esto. Otro problema tiene que ver con la extensión de las sombras fuera de la zona donde se encuentra el avión.

Otro problema, que puede aparecer o no, dependiendo de la técnica, es el diseño de más polígonos en una parte de la sombra, dando como resultado partes más oscuras y más claras de la misma sombra. Los tres problemas se pueden resolver geométricamente, pero debido a la posibilidad de que se use directamente la aceleración de hardware, es una implementación mucho más elegante usando el búfer de plantilla: 1. Habilite las luces y las luces 2. Dibuje una escena sin ningún polígono que deba ser sombras proyectadas 3. Dibuje todos los polígonos que deberían ser sombras proyectadas, pero sin luces. Al hacerlo, en el búfer de plantilla, se asignará el píxel de cada polígono a un valor específico para el terreno al que pertenece. La distancia entre estos valores debe ser al menos dos, porque para cada plano se utilizan dos valores para dos estados: en las sombras y brillante. 4. Deshabilite cualquier iluminación global (para garantizar que los siguientes pasos afecten solo a la luz seleccionada individualmente) Para cada plano: Para cada luz: 1. Edite un búfer de plantilla y solo los píxeles que llevan un valor específico para el nivel seleccionado. Aumenta el valor de todos los píxeles que se proyectan en los objetos entre la fecha de un nivel determinado y el brillo. 2. Permita que solo la luz seleccionada dibuje el nivel en el que parte de su valor específico no haya cambiado.

Sombras espaciales

La implementación del buffer de plantilla de dibujo espacial de sombras es cualquier sombra de un cuerpo geométrico cuyo volumen incluye parte de la escena que se encuentra en él. Si alguna parte de la escena pertenece a este volumen, la luz no se ilumina, en caso contrario sí. Este problema se ve agravado por el aumento del número de luces pero no aborda el número de zonas sobre las que caen las sombras. Hay varias soluciones al problema, pero seguimos el siguiente algoritmo: 1. Dibujar una escena sin luz 2. Bloquear el búfer Z y el búfer de color, de modo que los dos no puedan realizar cambios para cada luz 1. Usar en profundidad información sobre la escena (búfer Z) para llenar el búfer de plantilla solo en partes de la escena donde la sombra del volumen no existe o no es visible desde los edificios existentes. 2. Desbloquee el búfer de color y ajuste la función del búfer Z para permitir modificaciones solo cuando el valor de profundidad sea igual a uno existente. 3. Dibuje la escena iluminada solo por esta luz, pero solo para una parte de la escena que pase la prueba de plantilla.

Cada uno de estos pasajes implica que se puede utilizar un tampón de plantilla limpio.

En cuanto a las sombras, esta técnica se puede utilizar para iluminar partes del espacio que se encuentran bajo una luz intensa. Por ejemplo, en una habitación oscura y con gran presencia de polvo en el aire se podría ver la intensidad del foco iluminando el volumen adecuado del espacio.

Otras aplicaciones

Otro ejemplo es la llamada sombra suave, en la que la transición entre la parte iluminada y la parte sombreada de la escena está desenfocada. Específicamente, una forma de lograr este efecto de búfer de plantilla es multiplicar el volumen de la sombra y que, a medida que se copian, se escalan respectivamente según una serie geométrica con un aumento bajo, por ejemplo. 1.04. El Centro de escala puede ser el centro de gravedad del polígono que representa el volumen superior. Esto en sí mismo dará una serie de sombras compuestas que darán el efecto deseado.

Otra implementación incluye el campo de visualización durante la técnica de modelado de sólidos Geometría Constructiva de Sólidos (CSG), en la que el búfer de plantilla, junto con el búfer Z, puede resolver con éxito los problemas de las operaciones booleanas de SOLiD.

OpenGL

glEnable ( GL_STENCIL_TEST ); // por defecto no está habilitado glStencilMask ( stencilMask ); // permite escribir en el búfer de plantilla, por defecto (0xFF) sin máscara. glClearStencil ( clearStencilValue ); // borrar el valor de la plantilla, por defecto = 0 glStencilFunc ( func , ref , máscara ); // por defecto GL_ALWAYS, 0, 0xFF, siempre pasa la prueba de plantilla glStencilOp ( fail , zfail , zpass ); // por defecto GL_KEEP, GL_KEEP, GL_KEEP, no cambia el búfer de plantilla glClear ( GL_STENCIL_BUFFER_BIT ); // borrar el búfer de plantilla, rellenar con (clearStencilValue & stencilMask)        

Prueba: (ref y máscara) func (stencilValue y máscara)

Dependiendo de las tres posibles condiciones de la función de plantilla/función de profundidad.

1. La función de prueba de plantilla falla:

 Si dice que func es GL_NEVER, la prueba de plantilla siempre fallará. No se modifican los búferes de color/Z. El búfer de plantilla se modifica según el error de glStencilOp. Si digamos glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP) entonces se lleva a cabo GL_REPLACE y stencilValue = (ref & stencilMask) // se convertirá en ref

2. La función de prueba de plantilla pasa/la función de prueba de profundidad falla:

 Si dice que func es GL_ALWAYS, la prueba de plantilla siempre pasará, pero la prueba de profundidad puede fallar. Ni el color ni el búfer Z se modifican. El búfer de plantilla se modifica según glStencilOp zfail. Si digamos glStencilOp(GL_KEEP, GL_INCR, GL_KEEP) entonces se lleva a cabo GL_INCR y stencilValue = (stencilValue+1) // se convertirá en 1

3. Pases de función de plantilla/pasos de función de profundidad:

 Si dice que func es GL_ALWAYS, la prueba de plantilla siempre pasará. Si también pasa la prueba de profundidad. Se modifican tanto el color como el búfer Z. El búfer de plantilla se modifica según glStencilOp zpass. Si, por ejemplo, glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP), los valores de plantilla no se cambian, solo se modifican el color y los búferes Z.

Normalmente, el búfer de plantilla se inicializa estableciendo las máscaras del búfer Z y del búfer de color en falso. y luego establecer el valor de referencia apropiado en el búfer de plantilla al fallar la prueba de plantilla cada vez.

 // deshabilitar el color y los buffers Z glColorMask ( GL_FALSE , GL_FALSE , GL_FALSE , GL_FALSE ); glDepthMask ( GL_FALSE );      glStencilFunc ( GL_NEVER , 1 , 0xFF ); // nunca pasa la prueba de plantilla glStencilOp ( GL_REPLACE , GL_KEEP , GL_KEEP ); // reemplaza los valores del búfer de plantilla a ref=1 glStencilMask ( 0xFF ); // búfer de plantilla libre para escribir glClear ( GL_STENCIL_BUFFER_BIT ); // primero borre el búfer de plantilla escribiendo el valor de plantilla predeterminado (0) en todo el búfer de plantilla. dibujar_stencil_shape (); // en las ubicaciones de los píxeles de la forma de la plantilla en el búfer de plantilla reemplaza los valores del búfer de plantilla a ref = 1             

Ahora use el búfer de plantilla inicializado y la prueba de plantilla para escribir solo en las ubicaciones donde el valor de plantilla es 1:

 // habilitar color y Z-buffers. glColorMask ( GL_TRUE , GL_TRUE , GL_TRUE , GL_TRUE ); glDepthMask ( GL_TRUE );      // no más modificaciones del búfer de plantilla en la plantilla y el pase de profundidad. glStencilMask ( 0x00 ); // también se puede lograr mediante glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);   // prueba de plantilla: solo pasa la prueba de plantilla en stencilValue == 1 (suponiendo que la prueba de profundidad pase). // y escribe el contenido real en el búfer de profundidad y color solo en las ubicaciones de la forma de la plantilla. glStencilFunc ( GL_EQUAL , 1 , 0xFF ); draw_actual_content ();      

Ver también

Referencias

  1. ^ "Técnicas de búfer de plantilla (Direct3D 9): aplicaciones Win32".
  2. ^ Crow, Franklin C: "Algoritmos de sombra para gráficos por computadora", Computer Graphics (Actas de SIGGRAPH '77) , vol. 11, núm. 2, 242-248.