制作多个着色器程序变体

原文:https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html?_ga=2.228081626.633808584.1574735894-1417686800.1504530937

扩展阅读:https://blogs.unity3d.com/2018/05/14/stripping-scriptable-shader-variants/

重点关注:

1.multi_compile与shader_feature的区别。
2.#pragma skip_variants skip_variants的作用。
3.与Shader LOD的区别。

在运行时,Unity从Material关键字(Material.EnableKeyword和Material.DisableKeyword)或全局着色器关键字(Shader.EnableKeyword和Shader.DisableKeyword)中选择适当的着色器变体。

multi_compile:

#pragma multi_compile FANCY_STUFF_OFF FANCY_STUFF_ON
生成两个着色器变体:一个具有FANCY_STUFF_OFF定义的着色器,另一个具有FANCY_STUFF_ON

#pragma multi_compile __ FOO_ON
这个指令产生了两个着色器变量:一个没有定义任何东西(__),另一个定义了FOO_ON。这种方式会少用一个关键字(总关键字数目有限制 256最大,内部已经用了大约60个)

#pragma multi_compile A B C
#pragma multi_compile D E
这将为第一行生成三个变体,为第二行生成两个变体。总共产生了六个着色器变体(A + D,B + D,C + D,A + E,B + E,C + E)

shader_feature:

#pragma shader_feature _ FANCY_STUFF 快捷写法 #pragma shader_feature FANCY_STUFF

shader_feature在最终版本中不包括未使用的着色器变体。

关键字限制:

使用Shader变体时,Unity中限制为256个关键字,而Unity内部使用它们中的大约60个(因此降低了可用限制)

shader_feature和multi_compile的主要缺点是,它们中定义的所有关键字都会对Unity的全局关键字计数限制(256个全局关键字加上64个局部关键字)有所贡献。为避免此问题,可以使用不同的着色器变体指令:shader_feature_local和multi_compile_local。

shader_feature_local:类似于shader_feature,但枚举关键字是局部的。
multi_compile_local:类似于multi_compile,但枚举关键字是局部的。

内置的multi_compile快捷方式:

#pragma multi_compile_fwdadd
#pragma skip_variants POINT POINT_COOKIE

可以使用#pragma skip_variants 跳过一些变体

着色器硬件变体(可以为不同级别的硬件功能提供一组经过特殊优化的变体)

平台着色器设置:

比如可能还希望调整Unity内部的#define(例如,您可能希望在移动设备上强制使用级联的阴影贴图)

你可能感兴趣的:(制作多个着色器程序变体)