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?
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?
Respuestas:
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)
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.
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.
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.