我正在尝试在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数组。我可以传递什么(如果有的话)(某些指针可能会进入内存?)
答案 0 :(得分:2)
如果您想快速渲染快速变化的numpy数组,可以考虑查看glumpy。如果你选择纯粹的pyopengl解决方案,我也很想知道它是如何工作的。
编辑:see my answer here以获取如何使用Glumpy查看不断更新的numpy数组的示例
答案 1 :(得分:1)
glBufferData用于更新整个缓冲区,因为它每次都会创建一个新的缓冲区。
你想要的是:
glMapBuffer将缓冲区复制到客户端内存并在本地更改值,然后使用glUnmapBuffer将更改推送回GPU。
这允许您更新缓冲区的小部分,而不是整个缓冲区。
听起来你也想要一些自动获取这些变化的课程。 我无法确认这是否是一个好主意,但您可以包装或扩展numpy.array并覆盖内置方法setitem。