【问题标题】:Can OpenCL trigger renders in OpenGL?OpenCL 可以在 OpenGL 中触发渲染吗?
【发布时间】:2017-07-27 15:34:42
【问题描述】:

我有一个复杂的迭代优化问题,涉及多个步骤。其中一个步骤涉及获取当前迭代,并使用其中的值来渲染数十个版本的简单场景,然后获取这些渲染并对像素执行一些计算以创建值,然后将这些值反馈到优化算法中。这些步骤重复了很多次。

这个伪代码大致说明了我的想法

array_A[100]
array_b[100]
fill array_A from CPU
Loop 100 times
{
    perform step 1 on array_A
    use values in array_A as angles to render 100 images of a cube with different rotations
    sum pixels in each image, and write results to array_B
    add array_B to array_A
}
Transfer array_A back to CPU

一种方法是使用 CPU 从 OpenCL 获取信息,使用它来渲染所有这些场景,然后将内核排入队列以处理渲染。但是,更快的方法肯定是将所有内容都保留在 GPU 上,而不涉及 CPU。

这可能吗?

【问题讨论】:

    标签: opengl opencl gpu gpgpu


    【解决方案1】:

    可以在 opencl 和 opengl 之间进行“互操作”。

    需要的更改是:

    • 查询设备是否支持cl_khr_gl_sharing
    • 需要使用旨在与 opengl 共享的参数来查询和创建 Opencl 上下文。比如clGetGLContextInfoKHRCL_GL_CONTEXT_KHR,。需要opengl上下文句柄。

    • 需要使用 clCreateFromGLBufferclCreateFromGLTexture 从 opengl 源(例如缓冲区、渲染目标和纹理)创建 Opencl 缓冲区

    • cl 和 gl 之间的每次转换(在共享共享缓冲区之前),都需要同步点。如果 opencl 先计算,用clEnqueueReleaseGLObjectsclFinish() 完成它。然后opengl就可以参与了,完成后,在clEnqueueAcquireGLObjects之前需要glFinish()才能再次控制opencl的缓冲区。

    这样,如果缓冲区在 gpu 内存中,它将保留在那里。只有到达 CPU 的东西将是同步和命令消息,而不是数据。

    Opencl 有事件和事件回调。您可以使用clSetEventCallback 注册一个回调函数,这样它会比等待clFinish() 更快,因为事件等待也是一个同步点,并且速度更快。然后你可以从回调重定向到 opengl api 例程。或者只是简单地使用 clFinish 并将 opengl 函数放在后面。最快的解决方案可能是GL_ARB_cl_event 进行 gpu 端 cl-to-gl 事件处理,但我没有尝试过。

    array_A[100]
    fill array_A from CPU
    Loop 100 times
    {
        compute on A with opencl
        clfinish
        cast shadows on A using opengl
        glfinish
    
    }
    Transfer array_A back to CPU
    

    您可以复制 A 数组以进行双缓冲,以便能够流水线/重叠 cl 和 gl 计算并获得更快的速度。

    【讨论】:

    • 感谢您的回复。但是 OpenCL 可以在 OpenGL 中触发渲染,还是只有宿主才能做到?
    • clCreateEventFromGLsyncKHR 如果cl_khr_gl_event 存在,那么 gl 可以触发 cl 和 GL_ARB_cl_event 触发 cl 到 gl 但我还没有尝试过。并非所有 gpus 都支持它们。
    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 2017-11-09
    • 2010-10-01
    • 2013-01-24
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多