2010-11-09 13 views
15

C'è un modo per caricare un file di grafica vettoriale e quindi renderlo usando OpenGL? Questa è una domanda vaga in quanto non so molto sui formati di file per la grafica vettoriale. So di SVG, però.Rendering grafica vettoriale in OpenGL?

Passare al raster non è molto utile in quanto voglio fare lo zoom in tempo reale sugli oggetti.

+0

Il monitor è un display raster, quindi a un certo punto finirà per essere rasterizzato, la domanda è se la rasterizzazione avvenga o meno in uno stadio sufficientemente avanzato da rendere conveniente fare le cose che vuoi fare. OpenGL non ha alcun supporto specifico per qualsiasi formato di file (tranne forse il codice scritto nel linguaggio shader), quindi tutto si riduce a ciò che sei disposto a scrivere. –

+1

Fondamentalmente, questa è la stessa domanda di http://stackoverflow.com/questions/4054612/2d-vector-graphic-renderer-for-opengl – Fizz

risposta

6

Lasciatemi espandere la risposta di Greg.

È vero che Qt ha una classe di rendering SVG, QSvgRenderer. Inoltre, qualsiasi disegno che fai in Qt può essere fatto su qualsiasi "QPaintDevice", dove siamo interessati ai seguenti "dispositivi di pittura":

  • Un widget Qt;
  • In particolare, un widget Qt basato su GL (QGLWidget); immagine
  • Un Qt

Quindi, se si decide di utilizzare Qt, le opzioni sono:

  1. Smettere di usare il vostro attuale metodo di creazione della finestra (e il contesto GL), e iniziare a utilizzare QGLWidget per tutto il rendering, incluso il rendering SVG. Questo potrebbe essere un piccolo cambiamento, a seconda delle tue esigenze. QGLWidget non è particolarmente limitante nelle sue capacità.
  2. Utilizzare QSvgRenderer per eseguire il rendering su una QImage, quindi inserire i dati da tale QImage in una texture GL (come si farebbe normalmente) e renderlo come desiderato (ad esempio in un GL_QUAD rettangolare). Potrebbe avere prestazioni peggiori rispetto all'altro metodo, ma richiede la minima modifica al codice.

Ti chiedi cosa fa esattamente QGLWidget? Bene, quando invii i comandi di rendering Qt a un QGLWidget, essi vengono tradotti in chiamate GL per te. E questo succede anche quando i comandi di rendering sono emessi dal renderer SVG. Alla fine, il tuo SVG finirà per essere sottoposto a rendering tramite una serie di primitivi GL (linee, poligoni, ecc.).

Questo ha uno svantaggio. Diverse videocards implementano OpenGL in modo leggermente diverso, e Qt non (e non può) tiene conto di tutte queste differenze. Quindi, per esempio, se il tuo utente ha una scheda video Intel on-board a basso costo, la sua scheda video non supporta l'antialiasing di OpenGL, e questo significa che il tuo SVG apparirà anche alias (jaggy), se lo rendi direttamente su un QGLWidget. Passare attraverso una QImage evita tali problemi.

È possibile utilizzare il metodo QImage quando si esegue lo zoom in tempo reale. Dipende solo da quanto velocemente hai bisogno che sia. Potresti aver bisogno di attente ottimizzazioni come riutilizzare lo stesso QImage e abilitare il clipping per QPainter.

2

Qt ha un buon supporto per il rendering diretto di immagini SVG utilizzando la funzionalità OpenGL (consultare la documentazione per QSvgRenderer).

Spero che questo aiuti.

5

Questa non è un'implementazione, ma è molto pertinente per la tua domanda e i tuoi spettatori.

Capitolo 25. rendering vettoriale arte sulla GPU https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html

+1

Il collegamento è interrotto (e questa è essenzialmente una risposta solo per collegamento ...) – chtz

+0

Non importa che sia una risposta solo per collegamento, è comunque utile. –

8

vedo la maggior parte delle risposte sono circa Qt in qualche modo, anche se la domanda iniziale non ne parla. Ecco la mia risposta in termini di OpenGL da solo (che beneficia anche notevolmente dal passaggio del tempo, come non potrebbe essere dato nel 2010):

Dal 2011, lo stato dell'arte è il figlio di Mark Kilgard, NV_path_rendering , che al momento è solo un'estensione del fornitore (Nvidia) come si potrebbe già intuire dal suo nome. Ci sono un sacco di materiali su questo:

NV_path_rendering è ora utilizzato da biblioteca Skia di Google dietro le quinte, se disponibile. (Nvidia ha fornito il codice alla fine del 2013 e 2014.)

Naturalmente è possibile caricare SVG e tali https://www.youtube.com/watch?v=bCrohG6PJQE. Supporta anche la sintassi PostScript per i percorsi. È anche possibile mescolare percorso di rendering con altre cose OpenGL (3D), come demoed a:

un parvenu avere ancora meno (o addirittura nessuna) supporto del fornitore o sfarzo accademico è NanoVG, attualmente sviluppato e gestito. (https://github.com/memononen/nanovg) Dato il numero di librerie 2D su OpenGL che sono andate e venute nel tempo, si sta facendo una grande scommessa usando qualcosa che non è supportato da un importante fornitore, a mio modesto parere.

Problemi correlati