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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS