pyopengl缓冲区动态读取numpy数组

时间:2012-07-01 16:23:50

标签: python opengl numpy buffer pyopengl

我正在尝试在python中编写一个模块,它将绘制一个numpy数组颜色数据(rgb)到屏幕。目前我正在使用这样的三维颜色数组:

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

将它绑定到一个缓冲区并使用glVertexAttribArray将数据广播到一个tile数组(点精灵)(在本例中为10x10数组),这对于静态图像效果很好。

但我希望能够更改数组中的数据并让缓冲区反映此更改,而无需从头开始重建。

目前我用以下内容构建了缓冲区:

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

其中buffer_data是numpy数组。我可以传递什么(如果有的话)(某些指针可能会进入内存?)

2 个答案:

答案 0 :(得分:2)

如果您想快速渲染快速变化的numpy数组,可以考虑查看glumpy。如果你选择纯粹的pyopengl解决方案,我也很想知道它是如何工作的。

编辑:see my answer here以获取如何使用Glumpy查看不断更新的numpy数组的示例

答案 1 :(得分:1)

glBufferData用于更新整个缓冲区,因为它每次都会创建一个新的缓冲区。

你想要的是:

glMapBuffer / glUnmapBuffer

glMapBuffer将缓冲区复制到客户端内存并在本地更改值,然后使用glUnmapBuffer将更改推送回GPU。

glBufferSubData

这允许您更新缓冲区的小部分,而不是整个缓冲区。

听起来你也想要一些自动获取这些变化的课程。 我无法确认这是否是一个好主意,但您可以包装或扩展numpy.array并覆盖内置方法setitem