从 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 数据的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL 内核不向主机程序返回字符数据

在 OpenCl 中,多个 gpu 比单个 gpu 慢。我怎样才能更快?

VBo修改uuid

同一 GPU 上的 OpenCL 和 CUDA 内核

使用 OpenCL 内核的最近邻插值代码

从opencl内核中调用一个具有通过值概念的函数。