2012-07-01 3 views
7

Я пытаюсь написать модуль в python, который нарисовал бы массив массивных данных цвета (rgb) на экран. На данный момент я в настоящее время с использованием 3-мерного цветом массива как это:pyopengl buffer dynamic read from numpy array

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

связывание его в буфер и используя glVertexAttribArray для передачи данных в массив плиток (точечные спрайтов) (в данном случае 10x10 массив), и это отлично работает для статического изображения.

Но я хочу иметь возможность изменять данные в массиве и иметь буфер, отражающий это изменение без необходимости его восстановления с нуля.

В настоящее время я построил буфер:

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, но даже с флагом GL_READ_WRITE в glMapBuffer я не могу писать в этот массив (не могу даже установить для записываемого флага значение True!). Так что не уверен, что там происходит ... (Я использую код отображения из модуля vbo) – user1483596

ответ

2

Если вы хотите быстро визуализировать быстро меняющийся массив numpy, вы можете рассмотреть возможность взглянуть на glumpy. Если вы пойдете с чистым пиопенглым решением, мне также будет интересно узнать, как это работает.

Edit: see my answer here для примера того, как использовать Glumpy для просмотра постоянно обновляемого Numpy массиву

0

glBufferData для обновления всего буфера, поскольку это создаст новый буфер каждый раз.

То, что вы хотите, или:

glMapBuffer/glUnmapBuffer.

glMapBuffer копирует буфер в память клиента и локально изменяет значения, а затем возвращает изменения на GPU с помощью glUnmapBuffer.

glBufferSubData

Это позволяет обновлять небольшие участки в буфере, а не всей вещи.

Похоже, вам также нужен какой-то класс, который автоматически подбирает эти изменения. Я не могу подтвердить, если это хорошая идея, но вы можете обернуть или расширить numpy.array и перегрузить встроенный метод setitem.