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


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-03-08 (金) 18:06:03