它们具有相同的通用目的,真正的区别在于计算着色器是图形 API 的扩展,例如 OpenGL 和 Direct3D。计算着色器允许您绕过正常的可编程图形管道(例如顶点->镶嵌->几何->片段)并访问主机 GPU 的底层计算能力,而无需将您的算法硬塞到上述管道中的某个地方。计算着色器中工作组中的调用之间绝对存在共享内存/同步。
另外,我不知道“像素”这个概念是从哪里来的。创建计算着色器的全部目的是减轻仅适用于实际图形管道(例如顶点、片段/像素)的构造的开发负担,并将所有内容剥离为通用(因此称为GPGPU)计算/内存功能。诚然,当使用 D3D/OpenGL 计算着色器而不是 OpenCL 或 CUDA 等专用 API 时,通常是为了完成与渲染相关的事情,但这绝不是必需的。
要将所有这些放在更正式的上下文中,请考虑 GLSL 规范如何引入计算处理器。摆脱这一点的关键是它们是一种新型着色器,但不是图形管道中的一个新阶段——它们是独立存在的。
计算处理器
计算处理器是独立于其他着色器处理器运行的可编程单元。
[...]
计算着色器可以访问与片段和其他着色器处理器相同的许多资源,包括纹理、缓冲区、图像变量和原子计数器。它没有任何预定义的输入,也没有任何固定功能的输出。它不是图形管道的一部分,其可见的副作用是通过更改图像、存储缓冲区和原子计数器。
计算着色器对称为工作组的一组工作项进行操作。工作组是执行相同代码的着色器调用的集合,可能是并行的。工作组内的调用可以通过共享变量与同一工作组的其他成员共享数据,并发出内存和控制屏障以与同一工作组的其他成员同步。