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,但这已被弃用且令人沮丧)互操作
查看 Martin Beckett 发布的示例。这不是那么棘手。
编辑: 一点提示:
禁用 vsync 可能会带来更好的计算性能。默认情况下启用 vsync。如果您只有在线程上进行渲染和计算,则 vsync 会将您的计算 fps 速率降低到所用显示器的 vsync 速率(60Hz)
要在 Windows 和 Linux 上禁用 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