2012-07-01 18 views
7

Sto provando a scrivere un modulo in python che disegnerà una serie numerica di dati a colori (rgb) sullo schermo. Al momento sto attualmente utilizzando una matrice colori dimensionale 3 simili:lettura dinamica del buffer pyopengl dall'array numpy

numpy.ones((10,10,3),dtype=np.float32,order='F') # (for 10x10 pure white tiles) 

legandolo ad un buffer e utilizzando un glVertexAttribArray per trasmettere i dati ad un array di piastrelle (sprites punto) (in questo caso un 10x10 array) e questo funziona bene per un'immagine statica.

Ma voglio essere in grado di modificare i dati nell'array e fare in modo che il buffer rifletta questo cambiamento senza doverlo ricostruire da zero.

Attualmente ho costruito il buffer con:

glBufferData(GL_ARRAY_BUFFER, buffer_data.nbytes, buffer_data, GL_DYNAMIC_DRAW) 

dove buffer_data è la matrice NumPy. Cosa (se non altro) potrei passare invece (qualche puntatore in memoria, forse?)

+0

Forse buffer_data.ctypes.data? Anch'io sono curioso; facci sapere se lo capisci. – Luke

+0

Ho progredito un po ', provando ora a usare glMap/UnmapBuffer. Posso leggere con successo il contenuto del buffer in un array usando ctypes e numpy.frombuffer, ma anche con il flag GL_READ_WRITE in glMapBuffer non riesco a scrivere su questo array (non posso nemmeno impostare il flag scrivibile su True!). Quindi non sono sicuro di cosa stia succedendo ... (sto usando il codice di mappatura dal modulo vbo) – user1483596

risposta

2

Se si desidera eseguire rapidamente il rendering di un array numpy in rapida evoluzione, si potrebbe prendere in considerazione lo glumpy. Se vai con una pura soluzione Pyopengl sarei anche curioso di vedere come funziona.

Edit: see my answer here per un esempio di come utilizzare Glumpy per visualizzare una matrice NumPy costante aggiornamento

0

glBufferData è per aggiornare l'intero buffer quanto creerà un nuovo buffer ogni volta.

quello che vuoi è uno:

glMapBuffer/glUnmapBuffer.

glMapBuffer copia il buffer nella memoria del client e modifica i valori localmente, quindi reinserisce le modifiche nella GPU con glUnmapBuffer.

glBufferSubData

Questo consente di aggiornare piccole sezioni di un buffer, invece che l'intera cosa.

Sembra che tu voglia anche una classe che prelevi automaticamente queste modifiche. Non riesco a confermare se questa è una buona idea, ma è possibile avvolgere o estendere numpy.array e scavalcare il metodo integrato setitem.