- 在渲染管线中,pass 与 shader 是两个紧密关联但概念层级不同的部分:
Shader(着色器)
- 是运行在 GPU 上的程序代码,使用 HLSL/GLSL 等着色语言编写。
- 按功能分为不同阶段的着色器,例如顶点着色器(VS)、像素着色器(PS)、计算着色器(CS)等。
在引擎的 HLSL 文件中,例如 CS_Entry_ ****** _readback 就是一个计算着色器入口函数,它会被编译成 GPU 可执行的着色器对象。
Pass(渲染通道)
- 是渲染流程中的一个执行单元,定义了在一次绘制调用中使用哪些着色器、渲染状态、输入输出资源等。
- 一个 pass 会绑定具体的 shader 程序(或多个阶段的 shader),并配置渲染目标、混合模式、深度测试等状态。
在引擎的 shader 配置中,可以看到类似:
pass hiz_occlusion_query_meshComputeShader = compile cs_5_0 CS_Entry_hiz_occlusion_query_mesh();
这里的 pass 名称是 hiz_occlusion_query_mesh,它指定了使用 CS_Entry_hiz_occlusion_query_mesh 这个计算着色器入口函数来执行。
两者的关系
Shader 是代码实现,Pass 是调度和配置。
一个 shader 函数(如 CS_Entry_shadow_hzb_culling_width_readback)只有在被某个 pass 引用并编译绑定后,才会在渲染过程中被执行。
一个 pass 可以引用一个或多个 shader 阶段(例如同时指定 VS 和 PS),也可以只引用一个计算着色器(CS)。
同一个 shader 代码可以被多个 pass 复用,不同 pass 可以使用相同的 shader 但配合不同的渲染状态和资源,达到不同的渲染效果。
结论:
在渲染中,shader 是 GPU 执行的具体程序代码,负责处理顶点、像素或计算任务;pass 是渲染流程中的一个配置单元,负责组织和调用 shader,并设置渲染状态与资源。Pass 决定了何时、以何种方式执行某个 shader,shader 则定义了执行时的具体计算逻辑。两者结合,构成了渲染管线的基本执行结构。
