
引言:变体爆炸是后期项目的必修课材质特性叠加到十几个(法线、自发光、溶解、天气交互)后,手动维护#pragma multi_compile必然遭遇变体爆炸:编译等待半小时、打包内存溢出。变体管理不是"写完 Shader 顺手处理"的小事,而是需要自动化工具链支撑的工程体系。一、变体机制:条件编译与打包语义1.1 组合爆炸的数学每个布尔关键字把变体数翻倍:5 个特性产生 32 个变体,10 个特性就是 1024 个,且多组 multi_compile 之间是乘法关系。变体数量同时放大编译时间、包体体积与内存占用,还会触碰引擎的关键字数量限制。控制组合空间是变体管理的第一原则。1.2 multi_compile 与 shader_feature 的语义差异// multi_compile:全部组合都编译进包(运行时可能动态启用的状态用) #pragma multi_compile _ _NORMALMAP // shader_feature:只编译被材质实际引用的组合(材质静态特性用) #pragma shader_feature _ _EMISSION float4 frag(v2f i) : SV_Target { float3 normal = i.normal; #if defined(_NORMALMAP) normal = UnpackNormal(tex2D(_BumpMap, i.uv)); #endif float3 color = LightingLambert(normal, _Ligh