2012-11-16 5 views
7

sto lavorando disegno grandi grafo aciclico diretto in WebGL utilizzando la libreria gwt-G3D secondo la tecnica qui mostrata: http://www-graphics.stanford.edu/papers/h3/Disegno di una struttura ad albero 3D WebGL

A questo punto, ho un semplice due livelli il rendering grafico:

enter image description here

prestazioni è terribile - ci vogliono circa 1,5-2 secondi per rendere questa cosa. Non sono un esperto di OpenGL, quindi ecco l'approccio generale che sto prendendo. Forse qualcuno può indicare alcune ottimizzazioni che renderanno questo rendering più veloce.

enter image description here

Sono stupito quanto tempo ci vuole per spingere la matrice modelview e buffer per la scheda grafica. Questo è dove la parte del leone del tempo è sprecata. Dovrei invece fare le trasformazioni di MODELVIEW nel vertex shader?

Questo mi porta a credere che la manipolazione della matrice modelview e spingendolo volta per ciascun nodo non dovrebbe essere una cattiva pratica, ma i tempi non si trovano:

https://gamedev.stackexchange.com/questions/27042/translate-the-modelview-matrix-or-change-vertex-coordinates

+0

Come hai fatto a farlo? I tempi mentono. Alcuni browser sono parallelizzati, quindi i tempi sono difficili. In ogni caso, stai dicendo che ci vogliono da 1 a 2 secondi per frame? Non capisco bene cosa stai facendo, ma un semplice grafico di scena con 24 cubi tutti genitoriali per un centro dovrebbe funzionare a 60hz. Stai (1) compilando shader una volta, non nel tuo ciclo di rendering (2) Non chiamate alcuna funzione glGet nel tuo ciclo di rendering? (3) caricare i dati dei vertici solo una volta, non nel ciclo di rendering? Spero che quelle non siano domande stupide, ma dovresti essere in grado di disegnare ~ 1000 cubetti a una velocità ragionevole. – gman

risposta

2

nodi Gruppo in grande pezzi invece di renderli separatamente. Esegui il caching in background di tutta la geometria con le trasformazioni applicate che molto probabilmente non verranno modificate e memorizzarle in un buffer e renderizzarle in un'unica chiamata.

Un'altra soluzione: memorizzare i nodi (casella + linea) in un buffer (è possibile memorizzare più del necessario al momento attuale) e le loro trasformazioni in texture. applica le trasformazioni in vertex shader in base all'indice del nodo (coordinate texture) Dovrebbe essere più veloce drasticamente più veloce.

Per il supporto di prova utilizzare this site. Ho MAX_VERTEX_TEXTURE_IMAGE_UNITS | 4

La soluzione migliore sarà Geometry Instancing ma attualmente non è supportata in WebGL.

+0

Non c'è una lib, che può essere d'aiuto rendendo i nodi in gruppi? Anche Afaik d3 è utilizzato dalla tela (non solo da SVG), è buono per questo scopo? – inf3rno