8

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

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

将其绑定到缓冲区并使用 aglVertexAttribArray将数据广播到瓦片数组(点精灵)(在本例中为 10x10 数组),这适用于静态图像。

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

目前我已经建立了缓冲区:

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

其中 buffer_data 是 numpy 数组。我可以传递什么(如果有的话)(也许是一些指向内存的指针?)

4

2 回答 2

2

如果你想快速渲染一个快速变化的 numpy 数组,你可以考虑看看glumpy。如果您确实使用纯 pyopengl 解决方案,我也很想知道它是如何工作的。

编辑:有关如何使用 Glumpy 查看不断更新的 numpy 数组的示例,请参阅我的答案here

于 2012-12-18T03:05:28.100 回答
1

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

你想要的是:

glMapBuffer / glUnmapBuffer

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

glBufferSubData

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

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

于 2013-02-19T07:56:01.580 回答