2009-12-20 12 views
8

Ho un'applicazione che disegna la vista mappa in 3D con linee marcate che mostrano varie caratteristiche. Sto trasferendo la mappa su un'architettura OpenGL-ES, ma sto avendo un po 'di problemi a capire come visualizzare le linee tratteggiate.Disegno linee tratteggiate con OpenGL-ES

Facendo un sacco di google, ho trovato molti riferimenti all'idea che il disegno di linee tratteggiate e poligoni è stato rimosso da OpenGL-ES in quanto possono essere facilmente emulati utilizzando triangoli di trame. È grandioso, ma non riesco a trovare nessuno che faccia effettivamente questa emulazione e/o abbia una descrizione dei passaggi coinvolti.

Un esempio di un problema che ho riscontrato provando a prototipare questo concetto è la prospettiva che stringe le mie linee all'invisibile mentre vanno verso l'orizzonte. Utilizzando LINE_STRIP, ciò non accade e le linee rimangono una larghezza costante nella mappa.

Qualsiasi consiglio su come ottenere linee tratteggiate a larghezza costante in una vista prospettica sarebbe molto apprezzato.

+0

Hai provato una linea normale: le fa scomparire all'orizzonte o solo se le usi? –

+0

Le linee normali sono disegnate correttamente, ma non posso usarle. Ho provato ad applicare una texture a LINE_STRIP, ma questo non sembrava fare nulla. Cercando che ho trovato un consiglio che indicava che non funzionava e triangoli strutturati era la strada da percorrere. Se la trama LINE_STRIPs può essere fatta funzionare, sarebbe grandiosa. PS - Sto usando egl 1.1. – Piklor

risposta

5

Credo che si possa applicare una trama a una linea, non solo un triangolo. Avrai bisogno di impostare le coordinate della trama per ciascuna estremità della linea; la trama verrà interpolata linearmente lungo la linea.

L'efficacia di questa soluzione deve essere invariata rispetto all'utilizzo di linee o strisce di linee: le strisce di linea sono solo un modo per creare linee con meno vertici.

C'è un altro problema: la tendenza del modello di trama a diventare compatta mentre una linea si allontana dalla fotocamera. Ciò accade perché l'interpolazione della coordinata della trama è corretta anche in prospettiva per le linee (vedere la sezione 3.5 delle specifiche GL).

Ci sono due modi per aggirare questo:

  1. Se è possibile calcolare una "q" di coordinate per la texture che annulla la prospettiva, è possibile ripristinare schermo-spazio texturing. Questa tecnica è probabilmente troppo costosa.

  2. È possibile proiettare la trama nello spazio per gli occhi (ad esempio glTexGen).

coordinare Texture generazione è, naturalmente, non è disponibile in GLES 1.1, ma se si utilizza i vertici da array, si può fingere da:

  • Impostazione coordinare la vostra struttura array per essere coordinare il vostro vertice array e
  • Utilizzo della matrice texture per "trasformare" i vertici.

Lo svantaggio di questa tecnica è che il modello di trama si troverà nello spazio fisso dello schermo, ovvero la trama non scorrerà lungo le linee.

+0

Grazie, ci provo. Ho provato a texturing la linea in precedenza, ma non ha funzionato - potrei aver rinunciato a presto. Vorrei ripetere la trama in modo da ottenere un trattino costante sulla linea, indipendentemente da quanto tempo è cresciuto. – Piklor

+1

Senza shader non penso che si possa fare questo senza calcolare i coords ST per frame. Con gli shader, è necessario: - Codificare la direzione della linea nello spazio modello sulla mesh. - Nel vertex shader, trasformarlo in coordinate occhio-spazio. - Genera la mappa UV effettiva nello spazio dello schermo (per pixel) - Ruota il campionamento della mappa UV tramite il vettore di direzione della linea trasformata (e normalizzata). Basti dire che questo non è affatto banale se non si è molto a proprio agio con le trasformazioni e gli spazi di coordinate della matrice. :-( –

+1

Inoltre, si potrebbe desiderare di guardare a questo: http://homepage.mac.com/arekkusu/bugs/invariance/HWAA.html Sembra un sacco di GPU di consumo non fare stipple proprio in una varietà di condizioni: per le punteggiature orizzontali e verticali (uno dei pochi casi che ottengono correttamente) è sufficiente proiettare una scacchiera ripetendo la trama: –

3

Se tutto ciò che si desidera è disegnare linee tratteggiate, basta passare da GL_LINE_STRIP a GL_LINES. In questo modo, open GL collegherà i vertici 1 & 2, 3 & 4, 5 & 6, ma non 3 & 4, o 4 & 5 lasciando gli spazi lì.Sarà essenzialmente una linea tratteggiata metà/metà rapporto-- l'equivalente approssimativo di glLineStipple (1, 0101);

IE: nell'array vertice

[0,0,1,1,2,2,3,3,4,4,5,5,6,6]

OpenGL si connetterà (0,0) a (1,1), ma non si connetterà (1,1) a (2,2) [mentre lo farebbe con GL_LINE_STRIP]. Quindi collegherà (3,3) a (4,4), ma NON (4,4) a (5,5). La connessione finale sarà (5,5) a (6,6).

Questo è quello che sembra quando ho fatto:

Dotted Lines on Android

La linea tratteggiata non è 50/50/vuoto perchè nel mio caso, essa rappresenta la posizione di un'entità gioco ogni frame del gioco - e i frame di gioco non sono necessariamente tutti della stessa lunghezza, quindi la linea incoerente: lo spazio.

Il codice simile a questo di disegnarlo:

draw public void (GL10 gl) { gl.glDisable (GL10.GL_TEXTURE_2D);

gl.glColor4f(color[0], color[1], color[2], color[3]/fade); 
      //pointsBuffer holds the points on the line 
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, pointsBuffer); 

    gl.glDrawArrays(GL10.GL_LINES, 0, points.length/2); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 

}

Un'idea alternativa per creare uno stipple più intenzionalmente modellata sarebbe saltare alcuni vertici da invece disegno con una matrice indici (glDrawElements). Tuttavia, non ho un esempio per mostrarti. :/

Problemi correlati