shader自定义宏
我们可以在 shader 中添加自定义宏来简化多条件分支的代码编写
unity称为shader变体
原理
unity实际上是根据你定义的宏的不同取值编译出多个不同的shader变体
然后根据条件使用具体的某个变体
定义宏
-
主要有这4个函数:
- #pragma multi_compile
- #pragma multi_compile_local
- #pragma shader_feature
- #pragma shader_feature_local
-
multi_compile 和 shader_feature 的区别是
multi_compile 定义的宏是为了让你在代码中使用,在打包时会生成所有组合的变体
shader_feature 定义的宏是为了让你在材质中使用,在打包时只会打包材质中使用到的变体 -
带 local 后缀和不带的区别是
不带 local 后缀定义的是全局宏,也就是其它 shader 文件也能使用,整个工程所有 shader 文件最多有 256个,unity 内部使用 64个
带 local 后缀的定义的是本地宏,只能在本 shader 文件中使用,每个文件限制 64个 -
multi_compile用法(其它3个类似)
HLSLPROGRAM 放在 HLSL 代码块中
#pragma multi_compile A B C 把互相排斥的宏定义在一行,A B C只能有一个定义,默认为 A
#pragma multi_compile __ D E 2个下划线表示都不定义的情况,这2行将产生 3x