2012-07-01 56 views
7

我想在Python中編寫一個模塊,它將繪製一個顏色數據(rgb)的numpy數組來屏幕。目前我目前使用的是3維顏色陣列是這樣的:從numpy數組動態讀取pyopengl緩衝區

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

綁定到緩衝器並使用glVertexAttribArray到數據廣播到瓦片(點精靈)的陣列(在此情況下一個10×10數組),這對靜態圖像工作正常。

但我希望能夠更改數組中的數據並使緩衝區反映此更改,而無需從頭重新構建它。

目前我已經建立了緩衝區:

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

其中buffer_data是numpy的陣列。我可以通過什麼(如果有的話)(可能是一些指向內存的指針?)

+0

也許buffer_data.ctypes.data?我也很好奇;讓我們知道你是否知道它。 – Luke

+0

我已經進展了一下,現在嘗試使用glMap/UnmapBuffer。我可以成功使用ctypes和numpy.frombuffer將緩衝區內容讀入數組,但即使使用glMapBuffer中的GL_READ_WRITE標誌,我也無法寫入此數組(甚至無法將可寫入標誌設置爲True!)。所以不知道那裏發生了什麼... (我使用vbo模塊的映射代碼) – user1483596

回答

2

如果你想快速渲染一個快速變化的numpy數組,你可以考慮看看glumpy。如果你確實使用了一個純粹的pyopengl解決方案,我也會好奇它是如何工作的。

編輯:see my answer here對於如何使用Glumpy一個例子,以查看一個不斷更新numpy的陣列

0

glBufferData是用於更新整個緩衝區,因爲它會在每次創建一個新的緩衝區。

你想要的是兩種:

glMapBuffer/glUnmapBuffer

glMapBuffer將緩衝區複製到客戶端內存並在本地更改值,然後使用glUnmapBuffer將更改推回到GPU。

glBufferSubData

這使您可以更新緩存的小部分,而不是整個事情。

這聽起來像你還想要一些自動獲取這些更改的類。 我無法確認這是否是一個好主意,但是您可以打包或擴展numpy.array並覆蓋內置方法setitem