Disegno al tratto rapido con antialiasing


11

L'algoritmo di linea di Bresenham è un modo per disegnare linee rette usando solo operazioni di numeri interi veloci (addizione, sottrazione e moltiplicazione per 2). Tuttavia, genera linee con alias. Esiste un modo altrettanto veloce per disegnare linee antialiaste?


1
Un paio di domande ... stai facendo la logica di disegno sulla CPU o GPU? Inoltre, stai cercando algoritmi basati su numeri interi o in virgola mobile?
Alan Wolfe,

5
@AlanWolfe, algoritmi interi sulla CPU - lo stesso ambiente per cui è stato progettato l'algoritmo di Bresenham.
Segna l'

3
en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algorithm è quello classico, anche se la pagina di Wikipedia è abbastanza cotta e non ho accesso al documento. Sembra una domanda pigra, dal momento che è abbastanza facile trovarlo facendo qualche google di base.
yuriks,

2
Solo pensando ad alta voce, immagino che dovrebbe essere facile adattare Bresenham per disegnare linee spesse multi-pixel. Quindi è possibile eseguire l'antialias calcolando la distanza di ciascun centro di pixel dalla linea matematica ideale e applicando una funzione di decadimento.
Nathan Reed,

2
Tuttavia, non posso contrassegnare un commento come corretto.
Segna il

Risposte:


9

Esiste un modo altrettanto veloce per disegnare linee antialiaste?

No, perché per definizione una linea anti-alias tocca più pixel. Tali algoritmi saranno più lenti.


In un rasterizzatore software, il modo onnipresente per disegnare linee anti-aliasing è l'algoritmo di linea di Xiaolin Wu . Non è difficile da implementare, e comunque a quel link c'è uno pseudocodice insolitamente di alta qualità.

In un tubo raster hardware, la primitiva di linea viene espansa in un quad dello spazio dello schermo dallo shader di geometria predefinito (o fornito dall'utente) e quindi disegnata come due triangoli, che possono quindi essere anti-alias nei modi consueti.

In un raytracer, ci sono una varietà di opzioni. Vale la pena pensare a come si desidera effettivamente disegnare un oggetto 1D. Forse come un cilindro (woo shadows!). Si noti che ciò introduce problemi di prospettiva / scorcio che possono (o meno) essere ciò che si desidera. Non c'è una chiara generalizzazione. Quindi, ovviamente, qualunque cosa tu faccia, lo sostituisci e basta.


"e comunque c'è uno pseudocodice insolitamente di alta qualità a quel link", non sono d'accordo. Questo pseudo codice probabilmente non è una corretta implementazione dell'algoritmo di Wu, anche se sembra essere quello che è stato utilizzato in innumerevoli luoghi sul web. L'algoritmo originale di Wu si diresse da entrambe le estremità verso il centro ed era in realtà più veloce di quello di Bresenham perché esegue circa la metà delle operazioni anche se scrive su più pixel. Sto parlando dell'algoritmo reale di Wu non quello pubblicato nell'articolo di Wikipedia collegato.
Polpo,

@Octopus [Esprime un vago scetticismo, in particolare sul bit più veloce, ma manca di contesto per confutare o confermare - se è così, le fonti, le correzioni e le modifiche sono ovviamente benvenute.]
imallett

Dipende da ciò che conti. Se disegni da entrambe le estremità verso l'interno, l'algoritmo di Wu esegue metà dei calcoli ma raddoppia il numero di pixel che scrive. Vedi la tabella 1 nel documento di Wu, collegato su Wikipedia. Quindi, se le scritture pixel sono costose, come nel caso della scrittura su una TFT su una connessione seriale, l'algoritmo di Wu è più costoso di quello di Bresenham. (Devo ammettere che non vedo perché anche l'algoritmo di Bresenham non possa usare la simmetria.)
Jan-Åke Larsson

1
Ma sono d'accordo con @Octopus, accettando anche "disegnare da un'estremità all'altra", lo pseudocodice è l'algoritmo di Wu solo se l'aritmetica dei numeri interi è usata dappertutto. Il codice che vedo online utilizza l'aritmetica in virgola mobile, che rappresenta un cambiamento significativo. Nel documento di Wu, l'algoritmo utilizza solo l'aritmetica intera (o in realtà l'aritmetica a punto fisso).
Jan-Åke Larsson,
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.