24

考虑一下标题中问题的完整形式:由于 OpenCL 可能是未来严重 GPU 编程的通用标准(在其他设备编程中),为什么不在为 OpenGL 编程时——以一种面向未来的方式——利用所有 GPU OpenCL 上的操作?这样您就可以获得 GLSL 的优势,而不受其编程限制。

4

4 回答 4

19

GLSL 是OpenGL着色语言。它最初旨在用于控制图形管道。

另一方面,OpenCL 是开放计算语言。它不控制图形,而是控制计算。

这两种技术针对不同的能力和功能。

话虽如此,展望未来,他们可能很少有理由将 GLSL 用于计算目的。然而,截至今天,比 OpenCL 更多的供应商完全支持 GLSL,因此它仍然可用于计算目的,尽管它受到限制,因为这不是它的核心目的,至少现在是这样。

于 2010-09-10T21:31:11.537 回答
4

未来 OpenCL 可能会取代 GLSL。与此同时,OpenGL 互操作仍然存在一些问题,至少在最重要的(NVidia/ATI)实现中是这样。

不过, OpenCL不会完全取代 OpenGL。OpenGL 在光栅图形方面做得更多。OpenCL 中唯一的光栅图形基元是纹理/图像,它根本无法渲染图形。

于 2010-09-12T00:49:38.487 回答
3

GLSL 是一种“着色语言”。它用于 3D 渲染,并具有对此特别有用的特殊数据类型(例如长度为 4 的向量和秩为 4x4 的矩阵)。顶点和片段着色器位于渲染管道内定义明确的位置,它们会在数据流经此管道时自动触发。着色器还可以直接访问 3D 管道的转换和投影矩阵。

OpenCL 是一种“计算语言”。它不是专门为我们在 3D 渲染中看到的计算任务而设计的,而是 C 的一个子集。OpenCL 确实具有类似于 GLSL 中的向量和矩阵的数据类型(float4、float16),但它们使用起来不太方便。此外,您没有图形上下文(这可能是优点或缺点),并且 OpenCL 内核不驻留在 3D 渲染管道中。

如果您想要插入 3D 渲染管道并由渲染管道触发的计算模块,请使用 GLSL。如果您想在 3D 渲染管道之外的 GPU 上进行一般计算,请使用 OpenCL。

这并不意味着 OpenCL 不能用于渲染 3D 图形。它可以。事实上,您可以只在 OpenCL 中实现自己的管道,然后将您的绘图复制到帧缓冲区。但如果你只是想画一些 3D 图形,复制 SGI、Nvidia、Intel 和 AMD 工程师的所有工作可能不值得麻烦。然后更容易使用 GLSL 并将着色器插入到一个即用型且高性能的 OpenGL 管道中。想想看,编写 Mesa 是一项艰巨的任务,开源的 OpenGL 实现。

于 2014-02-24T00:48:05.940 回答
-3

@dietr:让我在这里生态你!CL/GL 互操作性会极大地损害整体性能,特别是在处理大量对象缓冲区(例如>100)时。上下文更改开销和缺乏对缓冲区结构或缓冲区指针的支持只会杀死我的应用程序,因此我正在认真考虑使用几何着色器来替换我的 opencl 代码。不要自欺欺人,用 opencl 完全替换整个 opengl 将需要一个完整的重新编码过程,这不仅会很长而且没有那么有利。此外,正如上面的人所说,opengl 所做的不仅仅是管道计算。我想说,如果您打算使用 CL/GL iterop,请尝试在顶点/几何着色器上重写您的代码。

于 2010-11-14T17:43:19.763 回答