【问题标题】:Modify VBO data from OpenCL kernel从 OpenCL 内核修改 VBO 数据
【发布时间】:2016-01-22 15:37:13
【问题描述】:

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

【问题讨论】:

  • enja.org/2010/08/27/… 可能会有所帮助。我在某处有一个正在运行的示例,稍后我会尝试查找。您基本上只需要创建一个 GL/CL 共享上下文。之后一切都很容易。
  • 好像就是这样,我需要什么。谢谢!
  • @DarkZeros,我建议您将您的评论作为答案,以便将其标记为正确。

标签: c++ opengl memory opencl vbo


【解决方案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" :-)!
猜你喜欢
  • 2011-12-06
  • 1970-01-01
  • 2012-02-05
  • 2016-08-17
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多