- 追加された行はこの色です。
- 削除された行はこの色です。
- CUDAとVBO へ行く。
*CUDAとVBO [#jb3bbe3b]
OpenGLで確保したVBOをCUDAから使うことができる.
VBOをCUDAに登録する関数は以下.
#code(C,nonumber){{
cudaError_t cudaGLRegisterBufferObject(GLuint bufObj);
cudaError_t cudaGLUnregisterBufferObject(GLuint bufObj);
}}
使用する際のマッピング関数は以下.
#code(C,nonumber){{
cudaError_t cudaGLMapBufferObject(void **devPtr, GLuint bufObj);
cudaError_t cudaGLUnmapBufferObject(GLuint bufObj);
}}
[[cudaGLRegisterBufferObject:http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/online/group__CUDART__OPENGL_g007799061a53c40d49696b94908fac05.html]]
でVBOを登録し,使用する前に
[[cudaGLMapBufferObject:http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/online/group__CUDART__OPENGL_g9af8ea709470748d17bed128627f4a2e.html#g9af8ea709470748d17bed128627f4a2e]]
でマップさせ,使い終わったら
[[cudaGLUnmapBufferObject:http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/online/group__CUDART__OPENGL_ge0b087bcfe521b66fe21d5845f46e59f.html#ge0b087bcfe521b66fe21d5845f46e59f]]でアンマップします.
VBOを破棄する際には,
[[cudaGLUnregisterBufferObject:http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/online/group__CUDART__OPENGL_g2edd5be9aadf75d30dadc0faf07c7189.html#g2edd5be9aadf75d30dadc0faf07c7189]]
で登録を外してからOpenGL側で破棄処理をする.
#code(C){{
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// VBOをCUDAに登録
cutilSafeCall(cudaGLRegisterBufferObject(vbo));
float *dPtr;
cutilSafeCall(cudaGLMapBufferObject(&dPtr, vbo));
// 処理
cutilSafeCall(cudaGLUnmapBufferObject(vbo));
// VBOのCUDA登録を外す
cutilSafeCall(cudaGLUnregisterBufferObject(vbo));
glDeleteBuffers(1, (const GLuint*)&vbo);
}}
マップされている状態のVBOをOpenGLから用いることはできない(VBOが未定義となる).アンマップしてから使用する.また,CUDAへのマップは現在のところ,GPU内でのデータコピーを伴うためとても遅いようである.場合によってはcudaMemcpyの方が速いこともある.