Rendimiento de gráficos vectoriales versus mapas de bits o gráficos de trama

20

A veces uso gráficos vectoriales, simplemente porque se ven un poco más agradables en algunos casos, y otras veces, uso gráficos de mapa de bits / ráster.

Me preguntaba, ¿hay diferencias de rendimiento significativas entre estas dos opciones?

Ethan Bierlein
fuente
66
Realmente, depende de muchos factores. NVIDIA proporciona aceleración de hardware para gráficos vectoriales. ¿Lo has visto? developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

Respuestas:

15

Como dijo TheBuzzSaw, depende de muchas cosas, incluidas las implementaciones de los gráficos rasterizados frente a los gráficos vectoriales.

Aquí hay algunos métodos de gráficos vectoriales de alto rendimiento que se representan utilizando métodos de rasterización tradicionales.

Loop y Blinn muestran cómo representar una curva bezier cuadrática de gráficos vectoriales al representar un solo triángulo y usar las coordenadas de textura en un sombreador de píxeles para decir si un píxel está por encima o por debajo de la curva: http: //www.msr-waypoint. net / es-es / um / people / cloop / LoopBlinn05.pdf

La idea básica es establecer las posiciones de las esquinas de los triángulos para que sean las 3 posiciones de los puntos de control, y establecer las coordenadas de textura en cada esquina para que sean (0,0), (0.5,0) y (1,1) respectivamente. En su sombreador, si la coordenada de textura interpolada (x * xy) es <0, el píxel está debajo de la curva, de lo contrario está por encima de la curva.

Puede ver una implementación falsa de él en shadowrtoy aquí: https://www.shadertoy.com/view/4tj3Dy

En cuanto al segundo método, aquí hay un método de Valve, donde las distancias a una forma se almacenan en una textura, en lugar de datos de píxeles, lo que permite dibujar gráficos vectoriales mediante el muestreo de textura. ¡La decodificación es tan simple que podría implementarse incluso en hardware de función fija usando solo una prueba alfa! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Para darle una idea de qué tan bien funciona la segunda técnica, ¡esta imagen de bigote de 1024x768 se generó a partir de una imagen de origen de 64x32 que tenía un solo canal de color! (también conocido como 2 KB sin comprimir)

ingrese la descripción de la imagen aquí

También escribí algunas cosas al respecto en mi blog: http://blog.demofox.org/2014/06/30/distance-field-textures/

Aquí hay un ejemplo de código OpenCL para mostrar cuán simple es:

float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);

Ambas técnicas son súper rápidas y difuminan un poco la línea entre el vector y los gráficos rasterizados. Se procesan utilizando técnicas de rasterización, pero tienen propiedades de zoom / escala como las técnicas de gráficos vectoriales.

Alan Wolfe
fuente
1
Ver también valveoftware.com/publications/2007/…
están hechas de catz el
sí, esa es una técnica muy buena, esa es la segunda técnica que mencioné, y también enlace al mismo pdf anterior.
Alan Wolfe
Woops, lo perdí, lo siento.
interconexiones están hechas de catz
1
Aquí puede encontrar una solución adaptativa para el suavizado de bordes de campos de distancia: essentialmath.com/blog/?p=151 .
Jim Van Verth
8

Podría haber.

Respuesta menos técnica:

Si está creando un sitio web u otra aplicación donde no tiene nada que ver con la programación de gráficos, entonces la respuesta es probablemente sí. Las API subyacentes intentarán adivinar cómo representarlas y almacenarlas en caché de manera eficiente. Sin embargo, a medida que su aplicación se ejecuta y la API a veces adivina incorrectamente, es posible que tenga que volver a procesar las cosas y afectar el rendimiento.

Más técnico:

Tenga en cuenta que, a menos que esté utilizando una de las GPU más nuevas y una biblioteca para dibujar las rutas de los vectores en la GPU, entonces todas las texturas de mapa de bits están representadas por la GPU.

Consideraré el caso típico en el que los gráficos vectoriales se representan en texturas. Aquí el rendimiento dependerá de su cadena de herramientas, si su aplicación está creando dinámicamente texturas a partir de los activos del vector y si los gráficos se ven en varios niveles de zoom. Hay dos problemas involucrados: recursos y generación de texturas. Si solo está mostrando los gráficos en un tamaño estático, diría que no hay diferencia y tal vez su cadena de herramientas puede convertir los activos en gráficos de mapa de bits antes del tiempo de ejecución. Sin embargo, si se muestran en varios tamaños o en un mundo en 3D, necesitará texturas mapeadas que requieren más memoria. Tomarán mucha memoria si realmente quieres ver su fidelidad 'de cerca' con una textura más grande.

Espero que esto ayude.

ShaneC
fuente
6

Hay algunas formas de representar gráficos vectoriales. Como menciona TheBuzzSaw, NVIDIA tiene una extensión que puede generar rutas generales con bastante rapidez (pero, por supuesto, solo funciona en las GPU NVIDIA). Y Alan Wolfe menciona los métodos de superficie implícitos (Loop-Blinn / campos de distancia), que definen una función que dice si está dentro o fuera de una forma, y ​​colorea los píxeles en función de esa función. Otro método es stencil-and-cover, donde representa la ruta en un búfer de stencil y usa el recuento par-impar para determinar si la ruta cubre un píxel.

Sin embargo, en general, la compensación es que el ráster de renderizado será más rápido, pero es más susceptible al alias (incluso los campos de distancia se descomponen en escalas altas y bajas). La representación de rutas requiere mucha configuración, pero en teoría se puede escalar a cualquier resolución.

Jim Van Verth
fuente