Prestazioni della grafica vettoriale rispetto a bitmap o grafica raster


20

A volte utilizzo la grafica vettoriale, semplicemente perché in alcuni casi sembrano leggermente più belli, altre volte utilizzo la grafica bitmap / raster.

Mi chiedevo, ci sono differenze di prestazioni significative tra queste due opzioni?


6
Davvero, dipende da molti fattori. NVIDIA fornisce l'accelerazione hardware per la grafica vettoriale. Lo hai visto? developer.nvidia.it/nv-path-rendering-videos
TheBuzzSaw

Risposte:


15

Come ha detto TheBuzzSaw, dipende da molte cose, tra cui le implementazioni della grafica rasterizzata rispetto alla grafica vettoriale.

Ecco alcuni metodi di grafica vettoriale ad alte prestazioni che vengono resi utilizzando metodi di rasterizzazione tradizionalmente.

Loop e Blinn mostrano come eseguire il rendering di una curva bezier quadratica di grafica vettoriale eseguendo il rendering di un singolo triangolo e utilizzando le coordinate della trama in uno shader pixel per dire se un pixel si trova sopra o sotto la curva: http: //www.msr-waypoint. net / en-us / um / persone / cloop / LoopBlinn05.pdf

L'idea di base è che si impostano le posizioni degli angoli del triangolo in modo che siano le 3 posizioni dei punti di controllo e che le coordinate della trama in ciascun angolo siano rispettivamente (0,0), (0,5,0) e (1,1). Nel tuo shader, se la coordinata della trama interpolata (x * xy) è <0, il pixel si trova sotto la curva, altrimenti è sopra la curva.

Puoi vederne un'implementazione falsa su shadertoy qui: https://www.shadertoy.com/view/4tj3Dy

Per quanto riguarda il secondo metodo, ecco un metodo di Valve, in cui le distanze da una forma sono memorizzate in una trama, anziché i dati pixel, consentendo di disegnare grafica vettoriale utilizzando il campionamento delle trame. La decodifica è così semplice che potrebbe essere implementata anche su hardware a funzione fissa usando solo un test alfa! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Per darti un'idea di come funziona la seconda tecnica, questa immagine di baffi 1024x768 è stata generata da un'immagine di origine 64x32 che aveva un singolo canale di colore! (aka 2 KB non compresso)

inserisci qui la descrizione dell'immagine

Ho anche scritto alcune cose a riguardo sul mio blog: http://blog.demofox.org/2014/06/30/distance-field-textures/

Ecco alcuni esempi di codice OpenCL per mostrare quanto sia semplice:

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

Entrambe queste tecniche sono super veloci e sfocano un po 'il confine tra grafica vettoriale e rasterizzata. Sono resi usando tecniche di rasterizzazione, ma hanno proprietà di zoom / ridimensionamento come le tecniche di grafica vettoriale.



sì, questa è una tecnica molto interessante, questa è la seconda tecnica che ho citato e anch'io mi collego allo stesso pdf sopra.
Alan Wolfe,

Woops, mi è mancato, scusa.
Internet è fatto di Catz il

1
Una soluzione adattiva per l'antialiasing dei campi di distanza è disponibile qui: essentialmath.com/blog/?p=151 .
Jim Van Verth,

8

Ci potrebbe essere.

Risposta meno tecnica:

Se stai costruendo un sito Web o un'altra applicazione in cui non hai nulla a che fare con la programmazione grafica, probabilmente la risposta è sì. Le API sottostanti proveranno a indovinare come renderle e memorizzarle nella cache in modo efficiente. Tuttavia, poiché l'applicazione viene eseguita e l'API a volte indovina in modo errato, potrebbe essere necessario eseguire nuovamente il rendering delle cose e influire sulle prestazioni.

Più tecnico:

Tieni presente che, a meno che tu non stia utilizzando una delle GPU più recenti e una libreria per disegnare i percorsi vettoriali sulla GPU, tutte le trame bitmap vengono renderizzate dalla GPU.

Prenderò in considerazione il caso tipico in cui la grafica vettoriale viene renderizzata alle trame. Qui le prestazioni dipendono dalla tua toolchain, se l'applicazione sta creando dinamicamente trame dalle risorse vettoriali e se la grafica viene visualizzata a vari livelli di zoom. Ci sono due problemi coinvolti: generazione di risorse e texture. Se stai visualizzando solo la grafica a dimensioni statiche, direi che non c'è differenza e forse la tua toolchain può convertire le risorse in grafica bitmap prima del runtime. Tuttavia, se vengono visualizzati in varie dimensioni o in un mondo 3D, avrai bisogno di trame mappate con mip che occupano più memoria. Prenderanno molta memoria se vuoi davvero vedere la loro fedeltà "da vicino" con una trama più grande.

Spero che aiuti.


6

Esistono alcuni modi per eseguire il rendering della grafica vettoriale. Come menziona TheBuzzSaw, NVIDIA ha un'estensione che può rendere i percorsi generali abbastanza rapidamente (ma ovviamente funziona solo su GPU NVIDIA). E Alan Wolfe menziona i metodi di superficie impliciti (Loop-Blinn / campi distanza), che definiscono una funzione che dice se sei all'interno o all'esterno di una forma e colora i pixel in base a quella funzione. Un altro metodo è stencil-and-cover, in cui si esegue il rendering del tracciato in un buffer stencil e si utilizza il conteggio pari-dispari per determinare se il percorso copre un pixel.

In generale, tuttavia, il compromesso è che il rendering del raster sarà più veloce, ma è più suscettibile all'aliasing (anche i campi di distanza vengono suddivisi su scale basse e alte). I percorsi di rendering richiedono molta configurazione, ma in teoria possono essere ridimensionati a qualsiasi risoluzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.