Actualmente estoy investigando la posibilidad de la representación de los gráficos vectoriales de un archivo SVG utilizando OpenGL y OpenGL ES. Tengo la intención de destino de Windows y Android. Mi solución ideal sería tener un mínimo de biblioteca de C que genera un polígono de triangulación a partir de un determinado archivo SVG. Esto podría generar estándar o OpenGL ES llama, y el uso de una lista de visualización o vbo para la optimización de cuando volver a dibujar. Yo simplemente dibujar una lista de visualización para dibujar el vector de la imagen después de traslación y rotación, lo que me permite mezclar esto con otras llamadas a OpenGL.

Hasta ahora veo que las sugerencias son, en primer lugar el uso de QT o el Cairo. – Esto no es una opción, dado que quiero administrar mi propio contexto OpenGL sin hinchada bibliotecas (en el contexto de lo que estoy tratando de lograr). Tampoco es apropiado para Android.

Segunda opción es el uso de las bibliotecas que hacen a una textura. Mientras que esto puede estar bien para la estática de gráficos vectoriales, no es eficiente o opción viable para los juegos donde la escala y rotaciones se producen con frecuencia.

En tercer lugar, hay la posibilidad de usar OpenVG. Hay algunos opensource implementaciones de la OpenVG especificación (ShivaVG etc), pero todavía tengo que encontrar una biblioteca que es capaz de generar la correspondiente OpenVG llamadas de un determinado archivo SVG en tiempo de ejecución, y no veo cómo optimizar esto como deseemos con una lista de visualización o vbo.

Todos los tres métodos de sufrir limitaciones. Creo que la opción más prometedora es el uso de un OpenVG aplicación si no hay otra solución existe. Así que mi pregunta es, ¿hay alguna de las bibliotecas, hay que hacer lo que yo quiero, o cerca de lo que quiero? Si no, hay una buena razón por qué no? Y no sería mejor intentar hacerlo desde el suelo hasta el lugar?

  • el análisis de un archivo svg para una ruta de acceso no es difícil. compruebe lo siguiente para la elaboración de una curva de bézier cuadrática. opengl.org/resources/code/samples/redbook/bezcurve.c
  • glEvalCoord no existe en OpenGL ES; y tampoco GLU, el tesselator de lo que habría sido crucial, por ejemplo, los polígonos convexos. @me232 buena pregunta, upvote d & favorito d
  • +1 Buena investigación y muy bien enmarcada en cuestión
  • sí su razón, que fue arrojado por la mínima C parte de la biblioteca.
  • En respuesta a la Qt parte: puede utilizar Necessitas para desarrollar aplicaciones de C++ usando Qt en Android. Funciona de maravilla y en mi caso no se ejecuta como si estuviera hinchado, pero YMMV de curso. Link: necessitas.kde.org
  • Para los que vienen a esta cuestión más adelante: «zShapes es una herramienta que permite representar independiente de la resolución de gráficos vectoriales en tiempo real en la GPU. La herramienta puede convertir cualquier Java2D forma a un conjunto de triángulos que más tarde pueden ser prestados con OpenGL. El Antialiasing es también compatible». java-gaming.org/index.php?topic=14778.0 Que podría no ser utilizable fuera de la caja, pero señala algunas grandes ideas.
  • Este es un ligeramente versión especializada de las preguntas stackoverflow.com/questions/4129932/… y stackoverflow.com/questions/4054612/…. La especialización consiste en preguntar acerca de SVG en lugar de los gráficos vectoriales en general.
  • También es básicamente un duplicado de stackoverflow.com/questions/1027179/…

InformationsquelleAutor Matt Esch | 2011-06-09

6 Comentarios

  1. 3

    De http://shivavg.svn.sourceforge.net/viewvc/shivavg/trunk/src/shPipeline.c?revision=14&view=marcado :

    static void shDrawVertices(SHPath *p, GLenum mode)
    {
    int start = 0;
    int size = 0;
    
    /* We separate vertex arrays by contours to properly
    handle the fill modes */
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, sizeof(SHVertex), p->vertices.items);
    
    while (start < p->vertices.size) {
    size = p->vertices.items[start].flags;
    glDrawArrays(mode, start, size);
    start += size;
    }
    
    glDisableClientState(GL_VERTEX_ARRAY);
    }

    Así se hace uso de un VBO. Por lo que me sugieren hacer su propio SVG analizador /el uso de un pre-hechos uno, y reenviar las llamadas a ShivaVG.

    Usted todavía tiene el problema de que ShivaVG está en C (y no en Java) y se crea un contexto opengl (y no opengles, si he leído el código correctamente). Así que incluso si usted compilar usando Android NDK, tendrás que modificar el código ( por ejemplo, yo he visto un par de glVertex3f alrededor, pero no parecen ser muy necesario… espero que para bien). La otra opción, por supuesto, al puerto el código de C a Java. Tal vez no es tan doloroso como que usted se pueda imaginar.

    Buena suerte !

    • Gracias, voy a echar un vistazo a esto. Estoy sorprendido de que, dada la demanda de aceleración de hardware de gráficos vectoriales y el hecho de que OpenVG fue diseñado con dispositivos móviles en mente, que no hay una aplicación que funciona fuera de la caja. Soy consciente de un proyecto escrito en C# que intenta hacer algo muy similar con resultados exitosos http://neuronspew.wordpress.com/category/svg-game-engine-project/ voy a estar seguro para hacer mi código pública si puedo conseguir este trabajo.
    • Gracias ! Favor de actualizar este hilo el día haya terminado con él ?
    • ShivaVG no uso Orv. Uso de glVertexPointer() no implica el uso de un VBO; en este código, los vértices son tomadas de la memoria apuntada por p>los vértices.elementos. Sé que esto de tener que depurar una situación en la que un VBO quedaba obligado por la otra parte del programa cuando se llama a esta función.
  2. 12

    Retirar MonkVG un OpenVG como la API de la aplicación en la parte superior de OpenGL ES.

    También, SVG representación en la parte superior de OpenVG (MonkVG) checkout MonkSVG.

    MonkVG ha sido construido para iOS, OSX, y plataformas Android.

    Soy el autor de ambas bibliotecas y estaría encantado de responder a cualquier pregunta.

    • Hola Miqueas. He encontrado el proyecto de Windows para MonkVG y logró construir con VS2010. Hay ejemplos de trabajo que compilar para Windows? Mi intento de seguir el ejemplo se estrelló. Puedo crear mi propia ventana y el contexto de forma manual, pero supongo que un EXCESO de solución de base está bien si usted tiene un ejemplo basado en él.
  3. 12

    Mi respuesta es acerca de la visualización de gráficos vectoriales con OpenGL en general, porque todas las soluciones para este problema puede apoyar, más trivialmente SVG en particular, aunque ninguno de apoyo animados SVGs (SMIL). Ya no había nada dijo acerca de la animación, supongo que la pregunta implícita estática SVGs sólo.

    Primero, yo no se moleste con OpenVG, ni siquiera con MonkVG, que es probablemente el más moderno, aunque incompleta aplicación. El OpenVG comité ha doblado en 2011 y la mayoría, si no todas las implementaciones son abandonware o en el mejor de legado de software.

    Desde 2011, el estado de la técnica la Marca Kilgard del bebé, NV_path_rendering, que actualmente es de sólo un proveedor (Nvidia) la extensión como usted puede haber adivinado ya de su nombre. Hay un montón de materiales en que:

    Usted puede, por supuesto, la carga de SVGs y tal https://www.youtube.com/watch?v=bCrohG6PJQE. También apoyan la PostScript sintaxis para las rutas. También se puede mezclar ruta de representación con otras OpenGL (3D) de las cosas, como se demostró en:

    NV_path_rendering ahora es utilizado por Google Skia biblioteca detrás de las escenas, cuando esté disponible. (Nvidia contribuido el código a finales de 2013 y 2014.) Uno de el cairo devs (que es un Intel empleado así) parece demasiado http://lists.cairographics.org/archives/cairo/2013-March/024134.html, aunque no estoy [sin embargo] consciente de hormigón esfuerzos de el cairo para uso NV_path_rendering.

    NV_path_rendering tiene algunas pequeñas dependencias en la tubería fija, por lo que se puede un poco de molestia para el uso de OpenGL ES. Este problema documentado en los oficiales de extensión doc vinculado anteriormente. Para una solución véase, por ejemplo, lo que Skia/Cromo ha hecho: https://code.google.com/p/chromium/issues/detail?id=344330

    Un advenedizo tener incluso menos (o francamente no) proveedor de apoyo académico o de ostentación es NanoVG, que actualmente es desarrollado y mantenido. (https://github.com/memononen/nanovg) Dado el número de 2D bibliotecas de más de OpenGL que han venido y se han ido con el tiempo, usted está tomando una gran apuesta con algo que no es apoyado por un proveedor importante, en mi humilde opinión.

  4. 7

    Actualmente estoy investigando la posibilidad de la representación de los gráficos vectoriales de un archivo SVG > usando OpenGL y OpenGL ES. Tengo la intención de destino de Windows y Android. Mi solución ideal
    sería para tener una mínima biblioteca de C que genera un polígono de triangulación a partir de un determinado
    Archivo SVG. Esto podría generar estándar o OpenGL ES llama, y el uso de una pantalla
    lista o vbo para la optimización de cuando volver a dibujar. Yo simplemente dibujar una lista de visualización para dibujar
    el vector de la imagen después de traslación y rotación, lo que me permite mezclar esto con otros OpenGL > llamadas.

    Si sólo desea transformar SVG formas vectoriales en OpenGL|ES, entonces le sugiero hacer el analizador y la lógica de ti mismo. Tenga en cuenta que SVG es una enorme especificación, con diferentes características, como la pintura de los servidores (gradientes, patrones …), las referencias, los filtros, recortes, manejo de fuentes, animaciones, secuencias de comandos, enlaces, etc, etc.

    Si quieres completo soporte de svg, entonces hay una biblioteca en http://code.google.com/p/enesim llamado egueb (y en particular esvg) que utiliza enesim (una biblioteca de procesamiento que tiene el software y opengl backend) para el dibujo. En la mayoría de los casos se usa shaders y todo lo que se representa en una textura, la biblioteca es muy flexible que le permite adaptarse a sus necesidades particulares, como la modificación de la representación de la escena, transformar, etc. Debido a que el gl dibujo se hace siempre en una textura.

    Hasta ahora veo que las sugerencias son, en primer lugar el uso de QT o el Cairo. – Esto no es una opción
    dado que quiero administrar mi propio contexto OpenGL sin hinchada bibliotecas (en la
    contexto de lo que estoy tratando de lograr). Tampoco es apropiado para Android.

    Segunda opción es el uso de las bibliotecas que hacen a una textura. Mientras que esto puede estar bien para
    estática de gráficos vectoriales, no es eficiente o opción viable para los juegos donde el escalado
    y rotaciones se producen con frecuencia.

    En el caso particular de la gl backend, enesim no crear un GLX (o cualquier otra ventana dependiente del contexto), usted tiene que proporcionar, por lo que se adapta perfectamente a su situación ya que sólo usa GL llamadas.

    El único inconveniente es que la biblioteca no está completa todavía en términos de contabilidad de apoyo o completa de la especificación SVG apoyo, pero dependiendo de tus necesidades, me parece una buena opción.

    • Qué algoritmo se utiliza para convertir una curva de bézier cúbica (ruta de acceso) para OpenGL ? ¿Qué acerca de anti-aliasing
  5. 7

    Necesita ser dicho que la representación SVG o OpenVG con o OpenGL ES fundamentalmente una mala idea. Hay razones de la OpenVG implementaciones son todos tan lento y abandonadas. El proceso de tessellating caminos (el fundamento de toda SVG/OpenVG de representación) en el triángulo de las listas como lo requiere OpenGL es, fundamentalmente, lento e ineficiente. Básicamente se requiere la inserción de una especie/algoritmo de búsqueda en la representación 3D de tuberías, que paraliza el rendimiento. También existe el problema de que una dinámica esquema de asignación de memoria es necesaria debido a que el tamaño del conjunto de datos es desconocido desde SVG no impone límites a la complejidad de la ruta de la geometría. Un muy mal diseño.

    SVG y OpenVG fueron creados por los desarrolladores que tenían poca comprensión de cómo modernos gráficos en 3D de hardware motores en realidad el trabajo (triángulo de las listas). Fueron creados para ser un alternativa a Adobe Flash, que también tiene el mismo defectuosa de la arquitectura que se ha hecho en Flash injurias en la industria para impredecibles en el rendimiento.

    Mi consejo es que reconsiderar su diseño y el uso de OpenGL triángulo de las listas directamente. Usted tiene que escribir más código, pero su aplicación va a realizar sobre una y mil veces mejor y más fácilmente puede depurar el código de alguien más.

    • Sólo una nota: Hay un montón de maneras de dibujar SVG con OpenGL, y tessellating rutas de acceso a los triángulos es, probablemente, el peor de ellos. ¿Qué acerca del uso de shaders?
  6. 1

    Usted puede tener una mirada en AmanithVG, parecen haber implementado una buena caminos -> triángulos de tuberías. He probado el iOS GL tigre ejemplo, y parece que la triangulación no es un verdadero cuello de botella.

Dejar respuesta

Please enter your comment!
Please enter your name here