jquave 发表于 2022-8-30 10:32

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]
查看完整版本: Unity Shader Variant应用规则简单说明