对于简单渲染:OpenCL比OpenGL快吗?

对于简单渲染:OpenCL比OpenGL快吗?,opengl,opencl,Opengl,Opencl,我需要画数百个半透明的圆作为OpenCL管道的一部分 目前,我正在使用OpenGL(与alpha混合),使用clFinish和glFinish与我的OpenCL队列进行同步(为了可移植性) 在OpenCL中执行此渲染任务会更快吗?(假设管道的其余部分已经在OpenCL中,如果没有与OpenCL兼容的GPU可用,则可能在CPU上运行) 在圆的情况下,用一个简单的测试函数很容易替换光栅化器。blend函数要求每个片段从目标纹理进行一次读取。因此,一个简单的OpenCL实现在理论上似乎更快。但也许Op

我需要画数百个半透明的圆作为OpenCL管道的一部分

目前,我正在使用OpenGL(与alpha混合),使用clFinish和glFinish与我的OpenCL队列进行同步(为了可移植性)

在OpenCL中执行此渲染任务会更快吗?(假设管道的其余部分已经在OpenCL中,如果没有与OpenCL兼容的GPU可用,则可能在CPU上运行)


在圆的情况下,用一个简单的测试函数很容易替换光栅化器。blend函数要求每个片段从目标纹理进行一次读取。因此,一个简单的OpenCL实现在理论上似乎更快。但也许OpenGL可以并行渲染非重叠三角形(这在OpenCL中更难实现)?

基于OpenCL的处理速度可能会更快,但这只是因为您不必处理CL/GL互操作。实际上,您必须执行
glFinish/clFinish
,这是一个瓶颈

这与固定函数与着色器硬件无关。这一切都是为了摆脱同步

现在,这并不意味着使用OpenCL渲染这些东西没有错误的方法

您不想做的是用一个计算操作将颜色写入内存,然后从另一个计算操作读取、混合,然后将它们写回内存。那就是疯狂

您应该做的是在内部有效地构建一个基于平铺的渲染器。每个工作组将代表一些像素计数(实验以确定性能的最佳计数)。每次调用都在单个像素上操作。他们将使用他们的像素位置,进行数学运算以确定像素是否在圆内(以及有多少像素在圆内),然后将其与调用内部保留的局部变量混合。所以每次调用都会处理所有的圆,只在最后写出它们像素值的数据


现在,如果你想变得聪明,你可以进行剔除,这样每个工作组只会得到保证会影响其特定区域内至少一些像素的圆。这实际上是一个预处理过程,你甚至可以在CPU上完成,因为它可能没有那么昂贵。

“假设管道的其余部分已经在OpenCL中”你在说什么管道的其余部分?我的应用程序中的处理管道。我用OpenCL计算了一些图像,然后需要渲染这些圆,然后用OpenCL再次处理。如果你可以称之为光栅化或光线投射简单。我不知道有多少人会争辩说,实现这两种方法都是简单的呈现,因为有一个专门的API为您提供替代方案。这是如此依赖于平台,以至于伤害了我的眼睛。@Andreas,在我的情况下,不可能优化和维护两个不同的代码路径,以支持这两个不同的选项。特别是因为Nicol Bolas的解决方案已经在OpenCL中提供了一个有效的解决方案。