CUDAとVBO†
OpenGLで確保したVBOをCUDAから使うことができる.
VBOをCUDAに登録する関数は以下.
| cudaError_t cudaGLRegisterBufferObject(GLuint bufObj);
cudaError_t cudaGLUnregisterBufferObject(GLuint bufObj);
|
使用する際のマッピング関数は以下.
| cudaError_t cudaGLMapBufferObject(void **devPtr, GLuint bufObj);
cudaError_t cudaGLUnmapBufferObject(GLuint bufObj);
|
cudaGLRegisterBufferObject
でVBOを登録し,使用する前に
cudaGLMapBufferObject
でマップさせ,使い終わったら
cudaGLUnmapBufferObjectでアンマップします.
VBOを破棄する際には,
cudaGLUnregisterBufferObject
で登録を外してからOpenGL側で破棄処理をする.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| | GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
cutilSafeCall(cudaGLRegisterBufferObject(vbo));
float *dPtr;
cutilSafeCall(cudaGLMapBufferObject(&dPtr, vbo));
cutilSafeCall(cudaGLUnmapBufferObject(vbo));
cutilSafeCall(cudaGLUnregisterBufferObject(vbo));
glDeleteBuffers(1, (const GLuint*)&vbo);
|
マップされている状態のVBOをOpenGLから用いることはできない(VBOが未定義となる).アンマップしてから使用する.また,CUDAへのマップは現在のところ,GPU内でのデータコピーを伴うためとても遅いようである.場合によってはcudaMemcpyの方が速いこともある.