在标题中考虑这个问题的完整形式:由于OpenCL可能是未来严格GPU编程的通用标准(在其他设备编程中),为什么不在为OpenGL编程时 - 以面向未来的方式 - 利用OpenCL上的所有GPU操作?这样你就可以获得GLSL的优势,而不受其程序限制。
答案 0 :(得分:19)
GLSL是OpenGL Shading Language。它最初用于控制图形管道。
另一方面,OpenCL是Open Computing Language。它不控制图形,而是控制计算。
这两项技术的目标是不同的功能和功能。
话虽如此,向前推进,他们可能没有理由将GLSL用于计算目的。但是,截至今天,更多的供应商完全支持GLSL而不是OpenCL,所以它仍然有用于计算目的,即使它是有限的,因为这不是它的核心目的,至少现在。
答案 1 :(得分:4)
将来OpenCL可能会取代GLSL。与此同时,OpenGL互操作仍然存在一些问题,至少在最重要的(NVidia / ATI)实现方面存在问题。
OpenCL将不完全取代OpenGL。在光栅图形方面,OpenGL做得更多。 OpenCL中唯一的光栅图形基元是纹理/图像,它根本无法渲染图形。
答案 2 :(得分:3)
GLSL是一种“着色语言”。它用于3D渲染,并且具有特别适用于该目的的特殊数据类型(例如,长度为4的向量和秩为4×4的矩阵)。顶点和片段着色器位于渲染管道内的明确定义的位置,并且它们在流经此管道的数据上自动触发。着色器还可以直接访问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管道中。只要考虑编写开源OpenGL实现Mesa是一项重大任务。
答案 3 :(得分:-3)
@dietr:让我在这里生活吧! CL / GL互操作性可能会严重损害整体性能,特别是在处理大量对象缓冲区时(例如,> 100)。上下文改变开销和缺少对缓冲区结构或缓冲区指针的支持只会杀死我的应用程序,因为我正在认真考虑使用几何着色器来替换我的opencl代码。并且不要欺骗自己,用opencl完全替换整个opengl需要一个完整的重新编码过程,这个过程不仅会很长,而且也不是那么有利。此外,正如上面的人们所说,opengl不仅仅是管道计算。我想如果您打算使用CL / GL iterop,请尝试在顶点/几何着色器上重写代码。