2012-07-01 20 views
7

Próbuję napisać moduł w Pythonie, który narysuje numpy tablicy kolorów danych (rgb) na ekranie. W tej chwili jestem obecnie stosując 3-wymiarową tablicę kolorów tak:bufor bufora dynamicznego odczytany z tablicy numpy

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

wiążący go do bufora i za pomocą glVertexAttribArray do transmisji danych do tablicy płytek (duszków punktowych) (w tym przypadku 10x10 tablica) i działa dobrze dla statycznego obrazu.

Ale chcę mieć możliwość zmiany danych w tablicy i mieć bufor odzwierciedlający tę zmianę bez konieczności odbudowywania go od nowa.

Obecnie mam wbudowany bufor z:

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

gdzie buffer_data jest numpy tablicy. Co (jeśli cokolwiek) mógłbym przekazać zamiast tego (może jakiś wskaźnik w pamięci?)

+0

Być może buffer_data.ctypes.data? Jestem też ciekawy; daj nam znać, jeśli to zrozumiesz. – Luke

+0

Poszedłem trochę dalej, próbując teraz użyć funkcji glMap/UnmapBuffer. Mogę z powodzeniem odczytać zawartość bufora do tablicy przy użyciu ctypes i numpy.frombuffer, ale nawet z flagą GL_READ_WRITE w glMapBuffer nie mogę pisać do tej tablicy (nie mogę nawet ustawić flagi zapisu na True!). Więc nie jestem pewien, co się tam dzieje ... (Używam kodu odwzorowania z modułu vbo) – user1483596

Odpowiedz

2

Jeśli chcesz szybko renderować szybko zmieniającą się tablicę numpy, możesz rozważyć spojrzenie na glumpy. Jeśli pójdziesz z czystym roztworem pyopengl, również chciałbym zobaczyć, jak to działa.

Edit: see my answer here na przykład jak używać Glumpy aby stale aktualizując NumPy tablicę

0

glBufferData jest dla aktualizowania cały bufor jak utworzy nowy bufor za każdym razem.

Co chcesz jest:

glMapBuffer/glUnmapBuffer.

glMapBuffer kopiuje bufor do pamięci klienta i zmienia wartości lokalnie, a następnie przesyła zmiany z powrotem do GPU za pomocą glUnmapBuffer.

glBufferSubData

ta pozwala na aktualizację małe odcinki bufora, zamiast całej rzeczy.

Wygląda na to, że chcesz również, aby niektóre klasy automatycznie zmieniały te zmiany. Nie mogę potwierdzić, czy jest to dobry pomysł, ale można zawinąć lub rozszerzyć numpy.array i przeładować wbudowaną metodę setitem.