Cobertura - falla en el algoritmo - ¿cómo deshacerse de su uso?

10

Introducción

Muchos de los motores de representación de gráficos vectoriales principales tienen un defecto algorítmico. Representan cada forma por separado y antialias calculando la cobertura de píxeles y luego las componen una encima de la otra. Sí, es simple, pero las soluciones correctas son aún más simples.

Esto lleva a un problema de fusión, ya que combina la cobertura por transparencia. La combinación alfa sigue una regla que no representa la situación con precisión, por ejemplo, toma un píxel que está cubierto al 50% que está cerca de un píxel que también está cubierto al 50% de forma complementaria no termina con una cobertura del 100%, termina con una cobertura del 75% . La apariencia de esto depende de cómo se ajuste el algoritmo y otros detalles, pero en esencia se trata de un error conocido. Alguien incluso pasó por la molestia de documentar los diferentes errores del motor junto con la redacción de un documento que muestra cómo podría hacerse mejor.

ingrese la descripción de la imagen aquí

Imagen 1 : Muestra totalmente no representativa, de renderizar una forma hecha de triángulos que muestra un error ampliado en la fila superior. Fuente SVG

El problema tiene una solución ingenua simple * solo una súper muestra sin cálculo de cobertura y filtra la imagen hacia abajo. Como beneficio adicional, puede utilizar mejores algoritmos de reconstrucción de imágenes que el filtrado de cuadros (lea Un píxel no es un cuadrado 3 ). Incluso hay soluciones que tienen una velocidad comparable a las soluciones actuales y estas soluciones son mucho más fáciles de hacer en las tuberías de rasterización de hardware (y rara vez ve este error en la GPU porque se creó para evitar solo este problema).

Esto tampoco es un problema sin un costo. Hay muchas personas que trabajan en diseño gráfico que pasan una cantidad de tiempo no trivial tratando de sortear este problema manualmente asegurándose de que haya superposición aquí y no superposición allí para solucionar el problema que la computadora debería hacer por ellos. Y fallando espectacularmente en muchos casos. Pero a sus clientes no les importa por qué está el error, deben solucionarlo.

Pregunta

¿Cómo se propaga el error? Como todos están cometiendo el mismo error, se podría concluir que usan la misma fuente para su algoritmo. ¿Qué pudo haber causado que los diseñadores eligieran este algoritmo? ¿Por qué solo los programadores 3D reconocieron este error e incluso codificaron su parte en sus API y enseñanza mientras que los programadores 2D no?

¿Cómo asegurar que este error deje de propagarse más?


Anexo (pero no estoy preguntando sobre esto)

* Aparentemente, mi afirmación de que el súper muestreo funciona sin fallas es extraordinaria y requiere pruebas extraordinarias. Ok, entonces la clave para que funcione el supermuestreo es que el supermuestreo no procesa la cobertura. En esencia, la súper muestra trata cada muestra como una muestra puntual. Dado que la muestra puntual no asume el área subyacente, no está causando una comparación alfa donde no ocurre.

Para que funcione de manera consistente, como se describe en una de las respuestas. Necesitamos hacer que el procesamiento de las muestras con muestreo entero sea coherente. Esto nos asegura que cada punto una vez transformado en espacio de pantalla obtiene exactamente la misma solución para coordenadas iguales y que ninguna muestra está sombreada por un borde de píxel 2 veces. Para hacer esto, es posible que una muestra no active un píxel si está exactamente encendida, por ejemplo, en la parte inferior del lado izquierdo (por lo tanto, establecemos una regla de que los bordes exactos se procesan en> vs <=). Todas las tarjetas gráficas de consola menos una funcionan así. Asegura que no se necesiten datos adicionales en caché y que no se deban realizar pruebas cercanas adicionales. Esta solución es tan estable, más general y consistente que las soluciones basadas en cobertura.

El algoritmo es exactamente el mismo que el original con un poco menos de código y un poco más de muestras. Por lo tanto, es tan consistente, si no más, que el algoritmo basado en la cobertura. Sabemos esto porque hemos estado utilizando estos métodos durante siglos en casi cualquier otro campo de procesamiento de señales, así como en tarjetas gráficas.

Entonces, ¿este método tiene un inconveniente? Bueno, es un poco más lento si solo hicieras una suposición ingenua. Teóricamente tiene un comportamiento asintótico más rápido que el rasterizador de cobertura, aunque es similar a un trazador de rayos, todavía está a la par en escenas típicas. También podría hacer que el uso de efectos basados ​​en convolución sea más doloroso de implementar.

joojaa
fuente
Agregaré fotos para mi enmienda una vez que termine mi jornada laboral. Después de todo esto es el procesamiento de gráficos, tiene una interpretación visual
joojaa

Respuestas:

6

El supermuestreo, cuando se hace ingenuamente, es computacionalmente costoso, ya que si usa, por ejemplo, la mitad del tamaño de píxel de su pantalla, necesitará cuatro veces la memoria y el ancho de banda. Wikipedia menciona esto y también menciona el supermuestreo adaptativo como una posible solución. Pero eso comienza a hacer que el algoritmo sea mucho más sofisticado, complejo y difícil de implementar.

Y supongo que esa es la razón por la que está buscando: si desea un algoritmo que no necesite mucha más memoria y tiempo de ejecución, las cosas se vuelven mucho más complicadas que en el ingenuo enfoque de "transparencia".

Doc Brown
fuente
En realidad, no necesita almacenar las muestras, todo lo que necesita hacer es almacenar la configuración de rasterización. El método basado en la cobertura tampoco los almacena, por lo que este no es un paso atrás. El método ingenuo solo se presenta porque es fácil de entender, puede hacer fácilmente un muestreo basado en prioridades. Además, si desea trasladar sus soluciones basadas en cobertura a la GPU, tendrá que hacer mucho trabajo adicional y será incompatible con su modelo.
joojaa
@joojaa: ¿puedes describir lo que quieres decir con "almacenar la configuración de rasterización", o dar un enlace donde se explique el enfoque de una manera que uno no tenga que profundizar en un artículo científico de más de 20 páginas?
Doc Brown
Cada píxel es independiente el uno del otro, por lo que solo necesita guardar las muestras mientras realiza el píxel, puede descartarlas con seguridad después de esto. Si desea utilizar un filtro de orden superior, solo puede almacenar una vista limitada. Entonces, todo lo que realmente necesita hacer es asignar memoria para su núcleo de procesamiento, así que tal vez (16-256 bytes por hilo)
joojaa
oh, lo siento, ni siquiera necesita almacenar las muestras si hace el filtrado de cajas, simplemente puede usar la fórmula para el promedio móvil /
continuo
@joojaa: No lo entiendo, ¿no necesita calcular las muestras primero de todas las formas relacionadas , tal vez cientos o miles, y luego filtrar a su pantalla de trama?
Doc Brown
6

El supermuestreo no resolverá el problema en general: simplemente lo hará menos notable. Con píxeles de la mitad del tamaño, el problema será la mitad de notable pero no desaparecerá.

El punto arquitectónico detrás de estos diseños es que queremos que el comando "render triangular ABC" tenga un significado definido. No queremos que sea ambiguo excepto cuando se considera como parte de una colección de comandos de dibujo, por ejemplo, tener un significado cuando "render triangular BCD" también está en la colección (con el mismo color o un color diferente) y otro significado cuando no lo es

Considerando, por ejemplo, mil triángulos, incluso encontrar todos los triángulos que comparten un lado o parte de un lado con ABC es computacionalmente pesado (recordando que tiene que volver a hacerse mil veces). También hay muchos otros problemas prácticos: en particular, que todas las solicitudes de representación originales deben mantenerse, incluso si se elaboraron hace mucho tiempo, en caso de que necesiten ser reevaluados debido a una nueva solicitud adicional.

La conclusión es que una solución perfectamente consistente no es practicable. Queda la pregunta: ¿debemos tratar de mejorar la situación actual cuando podamos? En general, la respuesta a esa pregunta es No. Una implementación perfectamente consistente de un modelo siempre es mejor, incluso si el modelo en sí tiene las limitaciones que usted ha ilustrado. La alternativa sería una implementación que a veces funciona mejor y a veces no, sin que el programador sepa cuál de estos dos va a tener en un caso particular. Además, puede pasar de "mejora" a "no mejora" como resultado de pequeños cambios realizados por el programador, o incluso como resultado de cambios fuera del control del programador. La previsibilidad, en un contexto de programación, está lejos,

Martin Kochanski
fuente
Este es un problema del cálculo de cobertura si mi supermuestreo NO hace un cálculo de cobertura, entonces no tiene problemas, ya que convergerá en la respuesta real y no solo disminuirá el problema. ¿Necesitas un código para probar esto? Así es como funciona su tarjeta gráfica y no tiene este problema. De lo contrario, todos los juegos que veas exhibirían el problema. No estoy comprando esta respuesta, ya que se basa en una lógica falsa.
joojaa
Los juegos de @joojaa no hacen ningún anti-aliasing o usan supermuestreo para el anti-aliasing, que generalmente proporciona cuatro niveles de anti-aliasing. Esto no es lo suficientemente bueno para gráficos de calidad de presentación en los que desea unos 64 niveles de suavizado. Entonces los juegos intercambian un problema por otro.
Pete Kirkham
@PeteKirkham depende de su configuración, algunos gamnes le permiten especificar cantidades de muestra. De todos modos, no necesita más de 16 muestras para producir un nivel de presentación AA si usa un filtro de orden superior al de los filtros de caja. Tenga en cuenta que la imagen sin error en mi ejemplo se realiza mediante supermuestreo dentro del reasterizador de hardware.
joojaa