stringtranslate.com

Buffer de esténcil

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

Un buffer de plantilla es un buffer de datos adicional , además del buffer de color y el buffer Z , que se encuentra en el hardware gráfico moderno . El buffer es por píxel y funciona con valores enteros , generalmente con una profundidad de un byte por píxel. El buffer Z y el buffer de plantilla a menudo comparten la misma área en la RAM del hardware gráfico.

En el caso más simple, el búfer de plantilla se utiliza para limitar el área de renderizado (estarcido). Un 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 flujo de renderizado . Por ejemplo, los valores de la plantilla se pueden aumentar o disminuir automáticamente por cada píxel que no supere o supere la prueba de profundidad.

La simple combinación de pruebas de profundidad y modificadores de plantilla hacen posible una gran cantidad de efectos (como volúmenes de sombras de plantilla, plantilla de dos caras, [1] composición, calcomanías, disoluciones, desvanecimientos, deslizamientos, siluetas, dibujo de contornos o resaltado de intersecciones entre primitivos complejos ) aunque a menudo requieren varias pasadas de renderizado y, por lo tanto, pueden poner una carga pesada en 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 portales , 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 renderizar esos píxeles correctamente.

Se puede acceder al buffer de plantilla y a sus modificadores en gráficos de computadora mediante API como OpenGL , Direct3D , Vulkan o Metal .

Arquitectura

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

Los bits asignados al buffer de plantilla se pueden utilizar 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 utilizar 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 esténcil

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

La prueba en sí se lleva a cabo sobre el buffer de plantilla hasta cierto valor en él, o se lo altera o se lo utiliza, y se lleva a cabo mediante 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 dado. Si esta comparación es lógicamente verdadera , la prueba de plantilla pasa. De lo contrario, no.

Al hacerlo, se analiza la posible reacción provocada por el resultado de comparar tres niveles de profundidad de estado y de plantilla diferentes:

Para cada uno de estos casos se pueden establecer diferentes operaciones sobre el píxel examinado. En las funciones de esténcil de 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 mediante los métodos SetRenderState de los dispositivos que se encuentran actualmente bajo control. Este método espera dos parámetros, el primero de los cuales es una condición que se establece y el otro su valor. En el orden en que se utilizó anteriormente, estas condiciones se denominan D3DRS_STENCILFUNC, D3DRS_STENCILREF y D3DRS_STENCILMASK.

Las operaciones de esténcil 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 pueden representarse como un único 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 denomina Z-fighting. Existen múltiples soluciones para 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 para el búfer de plantilla.

- Mueve los polígonos más lejos unos de otros, 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 luchas Z y no garantizan una solución definitiva en el caso general.

Una solución que incluye el buffer de plantilla se basa en el conocimiento de qué polígono debe estar delante de los demás. La silueta del polígono delantero se dibuja en el buffer 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 entrará en conflicto con el polígono delantero.

Volumen de sombra

El volumen de sombra es una técnica utilizada en gráficos de computadora en 3D para agregar sombras a una escena renderizada. Fue propuesta por primera vez por Frank Crow en 1977 [2] como la geometría que describe la forma 3D de la región oculta por 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 de volúmenes de sombras mediante el uso de buffers de plantillas se considera generalmente 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. Se ha popularizado gracias al 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 a medida que la escena misma se transforma y se refleja en relación con el plano "espejo", lo que requiere múltiples pasadas de renderizado y el uso de un búfer de plantilla para restringir las áreas donde funciona la pasada de renderizado actual:

  1. Dibuje la escena excluyendo las áreas reflejadas: para cada espejo, bloquee el búfer Z y el búfer de color
    1. Hacer visible la parte 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 modifica para reflejar la escena en relación con el plano del espejo.
    3. Desbloquee el búfer Z y el búfer de color
    4. Dibuje la escena, pero sólo la parte que se encuentra entre el plano de espejo y la cámara. En otras palabras, un plano de espejo también es un plano de recorte.
    5. Nuevamente bloquea el buffer de color, la prueba de profundidad se configura para que siempre pase, reinicia 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 adjudique en la parte cubierta con la sombra de sombras y fuera. Vea la sección que se relaciona con esto. Otro problema se relaciona con la extensión de las sombras fuera del área donde está el plano.

Otro problema, que puede aparecer o no, según 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 aceleración de hardware directamente, es una implementación mucho más elegante usar el stencil buffer: 1. Habilitar las luces y las luces 2. Dibujar una escena sin ningún polígono que deba ser proyectado sombras 3. Dibujar todos los polígonos que deban ser proyectados sombras, pero sin luces. Al hacer esto, en el stencil buffer, el píxel de cada polígono debe asignarse a un valor específico para el suelo al que pertenecen. La distancia entre estos valores debe ser al menos dos, porque para cada plano se deben usar dos valores para dos estados: en las sombras y brillante. 4. Deshabilitar cualquier iluminación global (para garantizar que los siguientes pasos afectarán solo a la luz seleccionada individualmente) Para cada plano: Para cada luz: 1. Edite un stencil buffer y solo los píxeles que lleven un valor específico para el nivel seleccionado. Aumenta el valor de todos los píxeles que son objetos proyectados entre la fecha de un nivel dado y brillante. 2. Permitir solo la luz seleccionada para que dibuje el nivel en el que parte de su valor específico no se modificó.

Sombras espaciales

Implementación del buffer de esténcil para el 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, de lo contrario sí. Este problema se agrava con el aumento del número de luces, pero no aborda el número de áreas 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 buffer Z y el buffer de color, de modo que los dos no puedan realizar cambios Para cada luz 1. Utilizando información detallada sobre la escena (buffer Z) para llenar el buffer de esténcil solo en las partes de la escena donde no existe sombra de volumen o no son visibles desde los edificios existentes. 2. Desbloquear el buffer para el color y ajustar la función del buffer Z para permitir modificaciones solo donde el valor de profundidad sea igual a uno existente 3. Dibujar la escena iluminada solo por esta luz, pero solo para la parte de la escena que pase la prueba de esténcil

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

En cuanto a las sombras, esta técnica puede utilizarse para iluminar partes del espacio que se encuentran bajo una luz intensa. Por ejemplo, se podría ver el brillo del foco en una habitación oscura con una gran presencia de polvo en el aire 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 sombreada de la escena está desenfocada. En concreto, una forma de conseguir este efecto es multiplicar el volumen de la sombra, y que a medida que las copias, respectivamente, se escalen según una serie geométrica con un aumento bajo, p. ej., 1,04. El centro de escala puede ser el centro de gravedad del polígono que representa el volumen superior. Esto por sí solo 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 Sólida Constructiva (CSG), donde el buffer de plantilla, junto con el buffer Z, puede resolver con éxito los problemas de las operaciones booleanas del SOLiD.

OpenGL

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

Prueba: (ref & mask) func (stencilValue & mask)

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 la función es GL_NEVER, la prueba de plantilla siempre fallará. No se modifican los buffers de color ni Z. El buffer de plantilla se modifica según el error de glStencilOp. Si decimos 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 esténcil pasa/la función de prueba de profundidad falla:

 Si la función es GL_ALWAYS, la prueba de plantilla siempre pasará, pero la prueba de profundidad puede fallar. No se modifican los buffers de color ni Z. El buffer de plantilla se modifica según glStencilOp zfail. Si decimos 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 esténcil/Pases de función de profundidad:

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

Normalmente, el buffer de esténcil se inicializa configurando las máscaras de buffer Z y de buffer de color en falso y luego configurando el valor de referencia apropiado para el buffer de esténcil haciendo que falle la prueba de esténcil cada vez.

 // deshabilitar color y búferes 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 ); // el búfer de plantilla está libre para escribir glClear ( GL_STENCIL_BUFFER_BIT ); // primero borra el búfer de plantilla escribiendo el valor de plantilla predeterminado (0) en todo el búfer de plantilla. draw_stencil_shape (); // en las ubicaciones de píxeles de la forma de plantilla en el búfer de plantilla reemplaza los valores del búfer de plantilla a ref = 1             

Ahora use el buffer de plantilla inicializado y la prueba de plantilla para escribir solo en las ubicaciones donde el valor de plantilla sea 1:

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

Véase también

Referencias

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