#pragma shader_feature __ TEST_STUFF
注:Unity中最多可以有128个关键字,但是Unity自己已经定义了一部分了,所以实际上会更少。所以使用multi_compile和shader_feature的时候,就需要特别注意不要超过这个限制。
Unity自身还内建一些multi_compile的快捷写法:
multi_compile_fwdbase:为基本前向渲染通道编译多个变体,不同的变体可能需要处理不同的光照贴图类型,或者一些使用了主平行光的阴影,而另一些禁用了。(参考Unity渲染管线)
multi_compile_fwdadd:为附加前向渲染通道编译多个变体,不同的变体可能需要处理不同类型的光源——平行光、聚光灯或者点光源,亦或者它们附带cookie纹理的版本。
multi_compile_fwdadd_fullshadows:同上,不过包含了可以让光源拥有实时阴影的功能。
multi_complie_fog:为处理不同的雾效类型(off/linear/exp/exp2)扩展了多个变体。
大部分内建快捷写法会导致许多shader变体,如果某些不需要使用,那么可以使用#pragma skip_variants来忽略它们。
#pragma multi_compile_fwdadd
// will make all variants containing
// "POINT" or "POINT_COOKIE" be skipped
#pragma skip_variants POINT POINT_COOKIE
使用multi_compile的目的一般是为了创建一些fallback或者简化shader,它们在同一个目标平台(例如OpenGL ES)的高端硬件和低端硬件上都可以高效地运行。这种时候,我们可以使用shader硬件变体来为不同性能等级的硬件创建一个特殊优化的变体集合。
为了生成shader硬件变体,需要添加#pragma hardware_tier_variantsrenderer,这里renderer表示某个可运行的渲染平台。使用这个指令,Unity会对每个shader生成3个shader变体(其他关键字会不起作用),而对应的关键字是:
UNITY_HARDWARE_TIER1
UNITY_HARDWARE_TIER2
UNITY_HARDWARE_TIER3
在编辑器里,可以通过Graphics Emulation菜单来测试他们。
注:这些shader并不受Quality Setting的影响,它们纯粹是通过检测GPU的相关性能来决定的。