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

For simple rendering: Is OpenCL faster than OpenGL?

我需要绘制数百个半透明圆圈作为我的 OpenCL 管道的一部分。

目前,我正在使用 OpenGL(带 alpha 混合),使用 clFinish 和 glFinish 与我的 OpenCL 队列同步(为了便携性)。

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

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

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

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

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

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

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

现在,如果您想变得更聪明,可以进行剔除,以便每个工作组只获得保证至少影响其特定区域内的某些像素的圆圈。这实际上是一个预处理过程,您甚至可以在 CPU 上执行此操作,因为它可能并不那么昂贵。