找回密码
 立即注册
查看: 207|回复: 0

Unity Shader Variant应用规则简单说明

[复制链接]
发表于 2022-8-30 10:32 | 显示全部楼层 |阅读模式
起因

本来是没有要记录的打算的,但是昨天有同事突然说在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之类的!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 01:34 , Processed in 0.116466 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表