Unity Shader Variant应用规则简单说明
起因本来是没有要记录的打算的,但是昨天有同事突然说在Android上FrameDebug到的物体使用的Shader Variant没有任何keyword,以下是Android上的截图
Android的截图
之前还遇到过在FrameDebug中没有Event的!正常情况下,这个Shader Variant应该有以下的keyword
simplelit, SubShader #0
FOG_LINEAR LIGHTMAP_ON LIGHTMAP_SHADOW_MIXING SHADOWS_SHADOWMASK _ENABLE_GI _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _SHADOWS_SOFT采样工具收集到的变体集基本如下:
- first: {fileID: 4800000, guid: a508dd1fe46c65e43b13d0815c9ca93d, type: 3}
second:
variants:
- keywords:
passType: 8
- keywords: _ALPHATEST_ON
passType: 8
- keywords:
passType: 11
- keywords: _ALPHATEST_ON
passType: 11
- keywords:
passType: 13
- keywords: _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _SHADOWS_SOFT _SHADOW_COLOR_ON
passType: 13
- keywords: LIGHTMAP_ON _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _SHADOWS_SOFT
_SHADOW_COLOR_ON
passType: 13
...
- keywords: FOG_EXP LIGHTMAP_ON _ALPHATEST_ON _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE
_SHADOWS_SOFT
passType: 13
...
- keywords: FOG_EXP LIGHTMAP_ON _ENABLE_GI _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE
_NORMALMAP _SHADOWS_SOFT _SHADOW_COLOR_ON
passType: 13
- keywords: _ALPHATEST_ON _ENABLE_GI _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE
_SHADOWS_SOFT
passType: 13
...
- keywords: FOG_EXP LIGHTMAP_ON _ALPHATEST_ON _ENABLE_DROPMAINHIGHLIGHT _ENABLE_GI
_MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _SHADOWS_SOFT
passType: 13而另外一个ShaderVariant情况就不大一样了!以下是PC上的截图
Standalone的截图
但是Android上使用的keyword组却是以下的样子:
_Lit, SubShader #0
FOG_LINEAR LIGHTMAP_ON SHADOWS_SHADOWMASK _ADDITIONAL_LIGHTS _ENABLE_GI _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MATCAPMODE_MULTIPLY _SHADOWS_SOFT 和PC上的对比,缺少了LIGHTMAP_SHADOW_MIXING!!!为什么?
原则
[*]首先是keyword的顺序不影响选择
[*]keyword最大交集多优先(交集必须和选择的变体keyword数量一致!)
[*]ShaderVariantCollection顺序前面优先
下面是例子:
假设是在Forward模式下,已经进行打包编译的keyword组合有一下:
// 按顺序从上到下
1. A B C
2. A B E
3. no keyword正确渲染使用的keyword组合实际调用的keyword组合说明A B CA B C正常匹配A Bno keyword没有匹配的变体A B C DA B C调用交集中keyword数量多的变体A B C EA B CA B C和A B E交集数量一致,但是因为A B C排在前面,优先使用了到这里,基本就能理解为什么出现第一张图的原因了!而且从svc中匹配的结果也是没有最大匹配的交集,所以智能选择no keyword了!
前面也提到遇到UI渲染的时候在FrameDebug里连Event都没有找到,原因就是除了keyword找不到外,连lightmode都没有匹配,即Forward或者Add之类的!!
页:
[1]