Disegno con accelerazione hardware di forme curve


11

Come disegnare rapidamente una forma curva?

  • "rapidamente" presumo che si dovrebbe usare il più possibile le strutture hardware

  • per "curvo" intendo i confini definiti da curve di Bezier quadratiche o cubiche

  • per "forma" intendo sia un tratto "grasso" (cioè più di 1px di larghezza) o "poligono curvo 2D" pari / dispari pari a zero, possibilmente con fori (cioè lettera "O")

Lo sto chiedendo perché le opzioni che conosco presentano diversi inconvenienti:

  • triangolando la forma e inviandola a OpenGL - fa il lavoro più difficile sulla CPU e potrebbe usare troppi / pochi triangoli (cioè sprechi / grossolani)

  • atlante delle trame - deve ricalcolare / caricare la trama ad ogni modifica (forma, scala, rotazione, ...)

  • Campo della distanza firmato: su larga scala i dettagli non sembrano belli o devono ricalcolare / caricare la trama

  • NV_path_rendering - potrebbe essere, se non funzionasse solo sulle carte di Nvidia

  • OpenVG - potrebbe essere, se non funzionasse solo su dispositivi mobili

  • ?


* Mi sembra che OpenVG non stia esattamente andando avanti, per dirla in parole povere. Qualcuno sa qualcosa delle sue prospettive future? Vale la pena tenerlo d'occhio ai giorni nostri?

** OpenGL 4+ fornisce mezzi per tassellare al volo i poligoni. Potrebbe in qualche modo essere usato per affinare la mesh dall'opzione "triangolazione" in modo che il contorno della forma almeno non sembri "angolato"?


2
Questo articolo GPU Gems rasterizza le curve quadratiche identificando le parti dello scafo che sono curve e calcolando analiticamente la copertura nel pixel shader, potrebbe valere la pena dare un'occhiata: developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html
yuriks

2
@yuriks Sì, Loop & Blinn, se ne sono completamente dimenticati. Ma non è brevettato?
Ecir Hana,

Vedi anche Grafica vettoriale massicciamente parallela , pubblicata in SIGGRAPH Asia 2014.
lhf

Tra le opzioni che hai elencato nella tua domanda e il documento Loop e Blinn, penso che tu abbia praticamente esaurito tutte le possibilità.
Nathan Reed,

Puoi tessellare una linea, come descritto qui . Oppure puoi triangolare in uno shader di calcolo.
nikitablack,

Risposte:


2

Puoi usare gli shader di tassellatura OpenGl 4.x per convertire i punti di controllo di Bezier in poligoni.

Una ricerca su Google per "tessellation shader bezier" ha trovato questo schema che descrive la tassellatura delle superfici e delle curve di Bezier:

http://web.engr.oregonstate.edu/~mjb/cs519/Handouts/tessellation.1pp.pdf

Ciò scarica la valutazione di Bezier dalla CPU alla GPU e riduce il flusso di dati attraverso il bus.


3
Potresti migliorare questa risposta elaborando un po ', o anche semplicemente collegandoti a qualcosa che spiega ulteriormente.
Nathan Reed,

1
Un modo per espandere questa risposta sarebbe quello di affrontare gli svantaggi menzionati dall'autore e spiegare come il tuo approccio aiuta con quelli.
trichoplax,

0

Si può fare un disegno curvo con l'hardware. C'è un metodo descritto in GPU Gems 3 che descrive come farlo. L'utente @yuriks in realtà lo commenta. In realtà ho realizzato una rapida e sporca demo da dare un'occhiata.

curva

Immagine 1 : curva curva HW accelerata (tracciata da un triangolo) e sorgente webgl

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.