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の方が速いこともある.


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-11-30 (水) 13:48:06