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);
打電話給你以頂點緩衝區爲參數的內核:
visData<<<BLOCKS, THREADS>>>(data, ptr);
取消映射你的頂點緩衝
cudaGraphicsUnmapResources(1, &_vb_resource, 0);
和你做。 OpenGL現在可以呈現您的數據。
而且CUDA可與DirectX 10和11互操作(甚至是9,但是不贊成這種方式和壓抑)
看一看發表馬丁·貝克特的樣本。這不是那麼棘手。
編輯:有點提示: 禁用vsync可能會導致更好的計算性能。 vsync默認啓用。如果你只對線程渲染和計算VSYNC將你的計算FPS率下降到所使用的顯示器垂直同步率(60Hz)的
要在Windows和Linux禁用垂直同步使用:
// 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