CUDA < - > OpenGLは非常に簡単です。
あなたはこのようなOpenGLの頂点バッファを作成します。
unsigned int _vbo;
cudaGraphicsResource *_vb_resource;
glGenBuffers(1, &_vbo);
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW);
CUDAに登録:あなたの可視化カーネルを呼び出す前に
cudaGraphicsGLRegisterBuffer(_vb_resource, _vbo, FLAGS);
マップを:
vertex_t *ptr = NULL;
size_t size;
cudaGraphicsMapResources(1, &_vb_resource, 0);
cudaGraphicsResourceGetMappedPointer(ptr, &size, _vb_resource);
はあなたを呼び出します頂点バッファを引数とするカーネル:
0お使いの頂点バッファ
cudaGraphicsUnmapResources(1, &_vb_resource, 0);
とあなたの完了アンマップ
visData<<<BLOCKS, THREADS>>>(data, ptr);
。 OpenGLでデータをレンダリングできるようになりました。
はマーティンベケットにより投稿されたサンプルを見てください
はまた、CUDAは、DirectX 10および11と相互運用することができます(でも9が、これは廃止され、憂鬱)。それは難しいことではありません。
編集:少しヒント: vsyncを無効にすると、計算パフォーマンスが向上する可能性があります。 vsyncはデフォルトで有効になっています。あなたは
は、WindowsとLinux上でVSYNCを無効にするために使用される表示のVSYNC率(60Hzの)に自分の計算fpsレートをドロップしますレンダリングや計算のVSYNCのためのスレッド上でのみ持っている場合は使用します。
// turn off vsync
#ifndef _WIN32
// or just try it for non Windows
if (glXGetProcAddress((const GLubyte*) "glXSwapIntervalMESA") != NULL)
((void (*)(int))glXGetProcAddress((const GLubyte*) "glXSwapIntervalMESA"))(0);
else if (glXGetProcAddress((const GLubyte*) "glXSwapIntervalSGI") != NULL)
((void (*)(int))glXGetProcAddress((const GLubyte*) "glXSwapIntervalSGI"))(0);
#else
wglSwapIntervalEXT(0);
#endif