从 OpenCL 内核修改 VBO 数据
Posted
技术标签:
【中文标题】从 OpenCL 内核修改 VBO 数据【英文标题】:Modify VBO data from OpenCL kernel 【发布时间】:2016-01-22 15:37:13 【问题描述】:我希望直接在屏幕上绘制我的 OpenCL 程序的输出,而不是从 GPU 下载然后再次上传。我如何将数据从内核放入我的顶点数组?我正在使用 glfw3 并在 c++ 中与 nVidia 的默认 OpenCL 库一起使用。
【问题讨论】:
enja.org/2010/08/27/… 可能会有所帮助。我在某处有一个正在运行的示例,稍后我会尝试查找。您基本上只需要创建一个 GL/CL 共享上下文。之后一切都很容易。 好像就是这样,我需要什么。谢谢! @DarkZeros,我建议您将您的评论作为答案,以便将其标记为正确。 【参考方案1】:这个例子可能会有所帮助: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
;
窗户:
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);
【讨论】:
wglGetCurrentDisplay() 和 wglGetCurrentContext() 定义在哪里? 它们是“glx.h”的一部分。不过你也可以使用glGetCurrentContext()
。
原来,我需要 "wglew.h" :-)!以上是关于从 OpenCL 内核修改 VBO 数据的主要内容,如果未能解决你的问题,请参考以下文章