OpenCL可以在OpenGL中触发渲染吗?

OpenCL可以在OpenGL中触发渲染吗?,opengl,opencl,gpu,gpgpu,Opengl,Opencl,Gpu,Gpgpu,我有一个复杂的迭代优化问题,涉及几个步骤。其中一个步骤涉及进行当前迭代,并使用其中的值渲染几十个版本的简单场景,然后进行这些渲染并对像素执行一些计算以创建值,然后将这些值反馈到优化算法中。这些步骤重复了很多次 这个伪代码大致说明了我的想法 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

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

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

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

这是可能的吗?

通过opencl和opengl之间的“互操作”是可能的

所需的改变是:

  • 查询设备上是否支持
    cl\u khr\u gl\u共享
  • 需要使用用于与opengl共享的参数查询和创建Opencl上下文。例如
    clGetGLContextInfoKHR
    CL\u GL\u CONTEXT\u KHR,
    。需要opengl上下文的句柄

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

  • cl和gl之间的每次转换(在共享共享缓冲区之前)都需要同步点。如果opencl首先进行计算,请使用
    clenqueurereleaseGlobjects
    clFinish()
    完成计算。然后opengl可以参与,当它完成时,
    glFinish()
    需要在
    clEnqueueAcquireGLObjects
    之前再次获得opencl的缓冲区控制权

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

Opencl有事件和事件回调。您可以使用
clSetEventCallback
注册回调函数,因此它比等待
clFinish()
更快,因为事件等待也是一个同步点,速度更快。然后您可以从回调重定向到OpenGLAPI例程。或者只是简单地使用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之间的“互操作”实现

所需的改变是:

  • 查询设备上是否支持
    cl\u khr\u gl\u共享
  • 需要使用用于与opengl共享的参数查询和创建Opencl上下文。例如
    clGetGLContextInfoKHR
    CL\u GL\u CONTEXT\u KHR,
    。需要opengl上下文的句柄

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

  • cl和gl之间的每次转换(在共享共享缓冲区之前)都需要同步点。如果opencl首先进行计算,请使用
    clenqueurereleaseGlobjects
    clFinish()
    完成计算。然后opengl可以参与,当它完成时,
    glFinish()
    需要在
    clEnqueueAcquireGLObjects
    之前再次获得opencl的缓冲区控制权

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

Opencl有事件和事件回调。您可以使用
clSetEventCallback
注册回调函数,因此它比等待
clFinish()
更快,因为事件等待也是一个同步点,速度更快。然后您可以从回调重定向到OpenGLAPI例程。或者只是简单地使用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\u khr\u gl\u事件
存在,那么gl可以触发cl和
gl\u ARB\u cl\u事件
来触发cl到gl,但我还没有尝试这些。并非所有GPU都支持它们。感谢您的回复。但是OpenCL可以在OpenGL中触发渲染吗,或者只有主机可以这样做吗?
clCreateEventFromGLsyncKHR
如果
cl\u khr\u gl\u事件
存在,那么gl可以触发cl和
gl\u ARB\u cl\u事件
来触发cl到gl,但我还没有尝试这些。并非所有GPU都支持它们。