2016-01-22 32 views
0

我希望我的OpenCL程序的输出直接在屏幕上绘制,而不需要从GPU下载然后再次上传。我如何将数据放入内核的顶点数组中?我在C++中使用glfw3,并与nVidia的默认OpenCL库一起使用。修改来自OpenCL内核的VBO数据

+1

http://enja.org/2010/08/27/adventures-in-opencl-part-2-particles-with-opengl/可能会有所帮助。我有一个可以运行的例子,我会尽量在后面找到。你基本上需要创建一个GL/CL共享上下文。之后,一切都很简单。 – DarkZeros

+0

似乎就是这样,我需要什么。谢谢! – Addi

+0

@DarkZeros,我建议你把你的评论作为答案,以便它可以被标记为正确的。 – Dithermaster

回答

2

该示例可以帮助:http://enja.org/2010/08/27/adventures-in-opencl-part-2-particles-with-opengl/

关键要求是成立CL/GL共享的上下文。根据您的GL主机上,你需要不同的属性设置为CL背景:

苹果:

cl_context_properties props[] = 
    { 
     CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)kCGLShareGroup, 
     0 
    }; 

的Windows:

cl_context_properties props[] = 
     { 
      CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(), 
      CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(), 
      CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 
      0 
     }; 

其他:

cl_context_properties props[] = 
     { 
      CL_GL_CONTEXT_KHR, (cl_context_properties)glXGetCurrentContext(), 
      CL_GLX_DISPLAY_KHR, (cl_context_properties)glXGetCurrentDisplay(), 
      CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 
      0 
     }; 

然后,您创建上下文并使用GL缓冲区(每次获取并释放它们):

context = cl::Context(CL_DEVICE_TYPE_GPU, props); 
cl::BufferGL glbuffer(context, CL_MEM_READ_WRITE, myvbo, &err); 

for (each frame){ 
    queue.enqueueAcquireGLObjects(&glbuffer); 
    //use glbuffer as if it is a clbuffer 
    queue.enqueueReleaseGLObjects(&glbuffer); 
} 
+0

wglGetCurrentDisplay()和wglGetCurrentContext()定义在哪里? – Addi

+0

它们是“glx.h”的一部分。不过你也可以使用'glGetCurrentContext()'。 – DarkZeros

+0

原来,我需要“wglew.h”:-)! – Addi