【Shader】变体keyword的声明

1、shader_feature_local声明方式

带_local只在局部(自己所在的shader生效)

与multi_compile_local和multi_compile区别:

变体是局部的所以不会增加全局变体的数量,全局变体会受限制在几十个以内,所以当你确实不需要全局时 应当尽可能地使用_local的。(multi_compile_local同理)

最关键区别:shader_feature声明的变体 它必须要在材质球默认激活才会打到游戏包体里,如果默认没有激活,在打出包体后会找不到这个变体。而multi_compile(_local)声明的变体都会全部打进去。

如果发现变体不生效,基本可以检查是否默认开启,可以将全部shader_feature的默认开启 或 改成multi_compile(_local)声明。或者强制将一个带有开启shader_feature声明变体的shader拖拽进"always included shaders"列表。

2、shader_feature声明方式(不在阐述)

3、multi_compile_local声明(不在阐述)

带_local只在局部(自己所在的shader生效)

4、multi_compile声明(不在阐述)

5、坑爹点:

代码使用

[Toggle(_FLOWLIGHT)]
_EnableFlowLight("Enable Flow Light", Int) = 0

使用了一个Toggle去开启/关闭变体_FLOWLIGHT。

在C#代码里直接去写SetInt("_EnableFlowLight", 1)或SetInt("_EnableFlowLight", 0)都是无法正常激活或关闭变体_FLOWLIGHT的。

必须使用Material的EnableKeyword和DisableKeyword才可行。

不过应该也有办法能刷新材质球状态可能就会切到正确的状态,因为Insperator窗口的toggle已经是设置成正确的状态了。我懒得找了怎么刷了,反正就必须要使用这2个API才能正常设置变体。

你可能感兴趣的:(Unity3d,Shader,unity,游戏引擎)