CUDAとVBO†OpenGLで確保したVBOをCUDAから使うことができる. VBOをCUDAに登録する関数は以下. nonumber 使用する際のマッピング関数は以下. nonumber cudaGLRegisterBufferObject でVBOを登録し,使用する前に cudaGLMapBufferObject でマップさせ,使い終わったら cudaGLUnmapBufferObjectでアンマップします. VBOを破棄する際には, cudaGLUnregisterBufferObject で登録を外してからOpenGL側で破棄処理をする. 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の方が速いこともある. |