2012-07-01 23 views
7

Estoy tratando de escribir un módulo en python que dibuje una numpy matriz de datos de color (rgb) en la pantalla. En el momento actualmente estoy usando una matriz de color dimensional 3 como esto:pyopengl buffer dynamic read from numpy array

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

unión a un tampón y el uso de un glVertexAttribArray para transmitir los datos a una serie de azulejos (sprites de puntos) (en este caso un 10x10 array) y esto funciona bien para una imagen estática.

Pero quiero poder cambiar los datos en la matriz y hacer que el búfer refleje este cambio sin tener que volver a generarlo desde cero.

Actualmente he construido con el buffer:

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

donde buffer_data es la matriz numpy. ¿Qué (si hay algo) podría pasar en su lugar (algún puntero en la memoria, tal vez?)

+0

Quizás buffer_data.ctypes.data? Tengo curiosidad también; Háganos saber si lo resuelve. – Luke

+0

He progresado un poco, tratando de usar glMap/UnmapBuffer. Puedo leer con éxito los contenidos del búfer en una matriz usando ctypes y numpy.frombuffer, pero incluso con el indicador GL_READ_WRITE en glMapBuffer no puedo escribir en esta matriz (¡ni siquiera puedo configurar la marca de escritura en True!). Así que no estoy seguro de lo que está pasando allí ... (Estoy usando el código de mapeo del módulo vbo) – user1483596

Respuesta

2

Si desea renderizar rápidamente una matriz numpy rápidamente cambiante, puede considerar echar un vistazo a glumpy. Si vas con una solución pura de pyopengl, también me gustaría saber cómo funciona.

Editar: see my answer here para un ejemplo de cómo utilizar Glumpy para ver una serie numpy actualizando constantemente

0

glBufferData es para la actualización de toda la memoria intermedia, ya que creará un nuevo buffer cada vez.

Lo que se quiere es o bien:

glMapBuffer/glUnmapBuffer.

glMapBuffer copia el búfer en la memoria del cliente y modifica los valores localmente, luego envía los cambios a la GPU con glUnmapBuffer.

glBufferSubData

Esto le permite actualizar las pequeñas secciones de un tampón, en lugar de toda la cosa.

Parece que también quiere una clase que recoja automáticamente estos cambios. No puedo confirmar si esta es una buena idea, pero podría envolver o extender numpy.array y anular el método integrado setitem.