文章摘要
Unity的Shader处理流程包括加载编译、材质绑定、变体选择和GPU执行四个阶段。首先,ShaderLab文件在导入时被解析,HLSL代码被编译为平台相关的字节码,运行时加载这些资源。材质绑定对应Shader并管理关键字状态。渲染时根据关键字选择变体,必要时创建GPU对象,设置渲染状态后发起DrawCall。SRP通过C#层指令最终交由C++层执行。整个流程涉及Shader解析、变体管理和底层图形API调用,运行时变体切换可能导致卡顿。
1. Shader的加载与编译
1.1 导入阶段(Asset Import)
- Unity编辑器导入ShaderLab文件时,C++层(ShaderImporter)会调用前面类似的解析器,将ShaderLab文本解析为内部结构(如Shader、SubShader、Pass、CGPROGRAM等)。
- 对于每个CGPROGRAM块,Unity会根据平台(DX11、OpenGL、Metal等)调用对应的后端编译器(如FXC、dxc、glslang、Metal编译器等)将HLSL/CG代码编译为目标平台的字节码(如DXBC、SPIR-V、MSL等)。
- 编译好的字节码和变体信息会序列化到
.shader
或.shadervariants
等资源文件中。
1.2 运行时加载
- 游戏运行时,Unity C