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