着色器本质上就是我们对在 GPU 中运行的程序的称呼。如果我们谈论的是像 CUDA、SYCL 和 OpenCL 这样的严格计算流水线,我们通常称之为”内核”。如果我们在像 OpenGL、Vulkan 或游戏引擎这样的图形化环境中,我们称之为”着色器”。它们或多或少是同一个东西。
着色器 (Shader)
着色器是图形渲染管线中运行在 GPU 上的小程序。常见的着色器类型包括:
- 顶点着色器 (Vertex Shader):处理每个顶点的位置变换、法线变换等
- 片元着色器 (Fragment/Pixel Shader):计算每个像素的最终颜色,处理光照、纹理采样等
- 几何着色器 (Geometry Shader):可以新增或删除图元
- 计算着色器 (Compute Shader):不属于传统渲染管线,用于通用计算任务
着色器使用专用的着色器语言编写,如 GLSL(用于 OpenGL/Vulkan)、HLSL(用于 DirectX)或游戏引擎提供的着色器语言。
内核 (Kernel)
内核是 GPGPU(通用 GPU 计算)框架中对 GPU 程序的称呼。与着色器不同,内核不关心图形渲染管线,而是把 GPU 当作大规模并行计算设备来使用。典型的框架包括 NVIDIA 的 CUDA、跨平台的 OpenCL 以及较新的 SYCL。内核通常用 C/C++ 的扩展语法编写,处理的是数据并行计算任务,比如矩阵运算、物理模拟、机器学习推理等。
核心区别
虽然底层都是在 GPU 的计算单元上执行并行程序,但两者的编程模型和关注点不同。着色器嵌入在图形管线中,输入输出由管线阶段定义(顶点、像素等);内核则是独立调度的,开发者自行定义线程网格和数据映射。不过随着计算着色器的出现,图形 API 也能做通用计算,两者的边界在逐渐模糊。