2010-11-09 11 views
15

¿Hay alguna manera de cargar un archivo de gráficos vectoriales y luego renderizarlo con OpenGL? Esta es una pregunta vaga ya que no sé mucho sobre los formatos de archivo para gráficos vectoriales. Sé de SVG, sin embargo.Representación de gráficos vectoriales en OpenGL?

Convertirlo en raster no es realmente útil, ya que quiero hacer zoom en los objetos en tiempo real.

+0

Su monitor es una pantalla rasterizada, por lo que terminará rastrillándose en algún momento, la pregunta es si esa rasterización ocurre o no en una etapa lo suficientemente tarde como para que sea conveniente hacer las cosas que desea hacer. OpenGL no tiene soporte específico para ningún formato de archivo (excepto tal vez el código escrito en el lenguaje de sombreado), por lo que todo se reduce a lo que está dispuesto a escribir. –

+1

Básicamente, esta es la misma pregunta que http://stackoverflow.com/questions/4054612/2d-vector-graphic-renderer-for-opengl – Fizz

Respuesta

6

Permítanme ampliar la respuesta de Greg.

Es cierto que Qt tiene una clase de procesador SVG, QSvgRenderer. Además, cualquier dibujo que haga en Qt se puede hacer en cualquier "QPaintDevice", donde estamos interesados ​​en los siguientes "dispositivos de pintura":

  • Un widget Qt;
  • En particular, un artilugio Qt basado en GL (QGLWidget); imagen
  • Un Qt

lo tanto, si usted decide usar Qt, sus opciones son:

  1. no utilizar más el método actual de la configuración de la ventana (y el contexto GL), y comenzar a usar QGLWidget para toda su representación, incluyendo la representación de SVG. Esto podría ser un cambio bastante pequeño, dependiendo de sus necesidades. QGLWidget no es particularmente limitante en sus capacidades.
  2. Usa QSvgRenderer para renderizar en una QImage, luego coloca los datos de esa QImage en una textura GL (como lo harías normalmente) y renderízalos de la forma que desees (por ejemplo, en un GL_QUAD rectangular). Puede tener un rendimiento peor que el otro método, pero requiere el menor cambio en su código.

¿Se pregunta qué hace QGLWidget exactamente? Bueno, cuando emite los comandos de renderizado Qt a un QGLWidget, estos se traducen en llamadas GL por usted. Y esto también ocurre cuando los comandos de renderización son emitidos por el renderizador SVG. Entonces, al final, tu SVG terminará siendo renderizado a través de un grupo de primitivas GL (líneas, polígonos, etc.).

Esto tiene una desventaja. Las diferentes tarjetas de video implementan OpenGL de forma ligeramente diferente, y Qt no tiene en cuenta (y no puede) todas esas diferencias. Entonces, por ejemplo, si su usuario tiene una tarjeta de video Intel a bordo barata, entonces su tarjeta de video no admite el antialiasing de OpenGL, y esto significa que su SVG también se verá con alias (irregular) si la procesa directamente en un QGLWidget. Pasar por QImage evita tales problemas.

Usted puede utilice el método QImage cuando amplíe en tiempo real, también. Solo depende de qué tan rápido lo necesite. Es posible que necesite optimizaciones cuidadosas, como reutilizar la misma QImage y habilitar el recorte para su QPainter.

2

Qt tiene una buena compatibilidad para representar directamente imágenes SVG utilizando la funcionalidad OpenGL (consulte la documentación para QSvgRenderer).

Espero que ayude.

5

Esto no es una implementación, pero es muy relevante para sus preguntas y lectores.

Capítulo 25. representación de arte vectorial en la GPU https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html

+1

El enlace está roto (y esta es esencialmente una respuesta de solo enlace ...) – chtz

+0

No importa que sea solo una respuesta de enlace, sigue siendo útil. –

8

veo la mayoría de las respuestas son sobre Qt alguna manera, a pesar de que la pregunta original no lo menciona. Aquí está mi respuesta en términos de OpenGL solos (que también se beneficia en gran medida del paso del tiempo, ya que no podría haber sido dado en 2010):

Desde 2011, el estado de la técnica es el bebé de la marca Kilgard, NV_path_rendering , que actualmente es solo una extensión de proveedor (Nvidia) como ya habrás adivinado por su nombre. Hay una gran cantidad de material en que:

NV_path_rendering ahora es utilizado por la biblioteca Skia de Google detrás de las escenas, cuando estén disponibles. (Nvidia contribuyó con el código a finales de 2013 y 2014.)

Por supuesto, puede cargar archivos SVG y tales https://www.youtube.com/watch?v=bCrohG6PJQE. También son compatibles con la sintaxis de PostScript para las rutas. También se puede mezclar ruta de reproducción con otras cosas OpenGL (3D), que hizo una demostración en:

un advenedizo tener incluso menos (o francamente no) el soporte del proveedor o brillo académico es NanoVG, que está actualmente desarrollado y mantenido. (https://github.com/memononen/nanovg) Dada la cantidad de librerías 2D sobre OpenGL que han ido y venido a través del tiempo, usted está haciendo una gran apuesta utilizando algo que no es respaldado por un proveedor importante, en mi humilde opinión.

Cuestiones relacionadas