2012-04-27 12 views
11

Poiché GL_LINE_SMOOTH non è hardware accelerato, né supportato su tutte le schede GFX, come si disegnano linee morbide in modalità 2D, il che risulterebbe buono come con GL_LINE_SMOOTH?Come disegnare linee morbide in scena 2D con OpenGL senza utilizzare GL_LINE_SMOOTH?

Edit2: La mia soluzione attuale è disegnare una linea da 2 quad, che svaniscono a zero trasparenza dai bordi e i colori tra questi 2 quad sarebbero il colore della linea. funziona abbastanza bene per il rendering delle linee semplici e non usa texturing e quindi è molto veloce da renderizzare.

+0

Vi siete escludere utilizzando quad strutturato, o quad con gradiente di colore? Sembra una soluzione possibile per me, anche se sembra che Edvard abbia già coperto quel territorio. – Tim

+0

@Tim, hm, non sono sicuro che solo quad colorati funzioneranno esattamente come linee morbide, potrebbe diventare troppo nitido ... beh, devo provarlo. – Rookie

+0

@Tim, l'ho testato ora, e come mi aspettavo, è troppo nitido (o troppo sfocato), ma per i miei scopi attuali funziona perfettamente! lo spessore della linea 1.7 sembra corrispondere molto bene a quello che fa la mia attuale linea liscia con spessore 1.1. – Rookie

risposta

1

Attualmente sto usando 2 o 3 quad per fare questo, è il modo più semplice per farlo.

  • Se lo spessore della linea < = 1px, sono necessari solo 2 quadrupli.
  • Se lo spessore della linea> 1px, è necessario aggiungere il terzo quadrante nel mezzo.
  • Lo spessore del quad del bordo in dissolvenza non deve cambiare se lo spessore della linea> = 1px.

Nell'immagine in basso è possibile vedere i quad con bordi blu. Il colore bianco significa opacità completa e il colore nero indica zero opacità (= completamente trasparente).

enter image description here

3

Attivare l'anti-aliasing a schermo intero e utilizzare un quad sarebbe la mia prima scelta.

+0

Penso che l'antialiasing a schermo intero sia un po 'eccessivo per un gioco che non rende nient'altro antialiasing tranne queste righe, che sono una piccola parte del gioco. A proposito, perché avete bisogno di entrambi, strutturato quad AND AA a schermo intero? i quads testati non sarebbero sufficienti? – Rookie

+0

Avete bisogno di entrambi perché un quad non sarebbe anti-alias a meno che non lo si anti-alias, e se la memoria serve (cosa che non potrebbe essere), ad alcuni algoritmi FSAA non piacciono le linee di antialias. Per quanto riguarda l'FSAA, è molto più economico che usare GL_LINE_SMOOTH su schede che non lo accelerano. –

+0

Ma il quadrante non sembrerebbe una linea smussata se si utilizza una trama con 1 pixel pieno opaco e 2 pixel vicini completamente trasparenti? Ho provato ancora, ma non vedo perché no ... perché nei miei test di texture ho tracciato una linea dritta nella trama e poi ho ruotato i vertici quadrangolari e la linea sembra effettivamente una linea levigata quando è ruotata, come se avesse un antialiasing su . – Rookie

10

Quindi, si vuole linee morbide senza:

  • linea di levigatura.
  • antialiasing a schermo intero.
  • shader.

OK.

La soluzione migliore è utilizzare Alpha-Tested Magnification technique di Valve. L'idea di base, per le tue esigenze, è quella di creare una trama che rappresenti la distanza dalla linea, con il centro della trama a una distanza di 1,0. Questo potrebbe probabilmente essere una texture 1D.

Quindi, utilizzando le tecniche descritte nella carta (molte delle quali funzionano con funzione fissa, inclusa la versione antialiasing), traccia un quad che rappresenti le tue linee. Ovviamente avrai bisogno di una fusione alfa (e quindi non è indipendente dall'ordine). Usa la larghezza della tua linea per controllare la distanza alla quale diventa il colore appropriato, consentendo così di creare linee strette o larghe.


Fare questo con gli ombreggiatori è praticamente identico a quanto sopra, tranne senza la trama. Invece di accedere a una trama a distanza, la distanza viene passata e interpolata dal vertex shader. Per il bordo sinistro del quad, lo shader del vertice passa 0. Per il lato destro, passa 1. Si moltiplica questo per 2, si sottraggono 1 e si assume il valore assoluto.

Questa è la tua distanza dalla linea (la linea è il centro del quad). Quindi usa questa distanza esattamente come fa l'algoritmo di Valve.

+0

conosco quella tecnica, ma non è proprio quello che sto cercando e richiederebbe molta più memoria. la mia attuale soluzione con quad con colori è veloce e non richiede alcuna memoria di texture aggiuntiva. – Rookie

+0

Sono disposto ad accettare la soluzione GLSL ora. – Rookie

+4

@Rookie: Con "molta più memoria" intendi 4KB (probabilmente la più piccola allocazione possibile per le GPU). Non hai bisogno di una trama per linea, solo un periodo di trama. E come detto, potrebbe essere una texture 1D; non deve essere particolarmente grande neanche. Una texture 'GL_LUMINANCE8' 16x1 funzionerebbe perfettamente. In qualche modo, non penso che ti mancherà quel 4K di RAM. –

Problemi correlati