2012-07-01 2 views
7

화면에 색상 데이터 (rgb)의 numpy 배열을 그리는 python 모듈을 작성하려고합니다. 순간 I는 현재 다음과 같이 3 차원 컬러 배열을 사용하고 :pyopengl 버퍼 numpy 배열에서 동적 읽기

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

버퍼에 결합하고 (이 경우 타일 (포인트 스프라이트) 배열로 데이터를 방송하는 10 ×을 glVertexAttribArray를 사용 배열) 및 정적 이미지를 잘 작동합니다.

하지만 배열의 데이터를 변경하고 버퍼를 처음부터 다시 만들 필요없이이 변경 사항을 반영 할 수 있기를 원합니다. buffer_data이 NumPy와 배열입니다

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

:

는 현재 내가 가진 버퍼를 구축했습니다. 어떤 경우 (무엇이라도) 대신 전달할 수 있습니까? (일부 포인터는 아마도 메모리에 있습니까?)

+0

아마도 buffer_data.ctypes.data? 나도 궁금해. 알아 내면 알려주세요. – Luke

+0

지금 glMap/UnmapBuffer를 사용하려고 조금 해 봤습니다. 성공적으로 버퍼 내용을 ctypes 및 numpy.frombuffer를 사용하여 배열로 읽을 수 있지만 glMapBuffer의 GL_READ_WRITE 플래그로도이 배열에 쓸 수 없습니다 (쓰기 가능 플래그를 True로 설정할 수 없습니다). 그래서 거기에 무슨 일이 일어나고 있는지 확실하지 않습니다 ... (나는 vbo 모듈에서 매핑 코드를 사용하고 있습니다) – user1483596

답변

2

빠르게 변화하는 numpy 배열을 빠르게 렌더링하려면 glumpy을 고려해야합니다. 당신이 순수한 pyopengl 솔루션을 가지고 있다면 어떻게 작동하는지 궁금 할 것입니다.

편집 : Glumpy를 사용하는 방법의 예 see my answer here

0

glBufferData 그것이 새로운 버퍼 매번 생성하므로 전체 버퍼를 업데이트하는 끊임없이 갱신 NumPy와 배열 볼.

glMapBuffer/glUnmapBuffer :

은 당신이 원하는 것은 하나입니다.

glMapBuffer는 클라이언트 메모리에 버퍼를 복사하고 로컬에서 값을 변경 한 다음 glUnmapBuffer를 사용하여 변경 사항을 다시 GPU로 푸시합니다.

glBufferSubData

이 대신 전체 것은, 당신이 버퍼의 작은 부분을 업데이트 할 수 있습니다.

이러한 변경 사항을 자동으로 선택하는 클래스가 필요합니다. 이것이 좋은 생각인지 확인할 수는 없지만 numpy.array를 감싸거나 확장하고 내장 된 메서드 setitem을 오버라이드 할 수 있습니다.