Unity URP issue
URP的疑难杂症

总结在URP项目中遇到的疑难杂症
版本
- URP: 10.10.1
URP合批失败
隐藏的Keywords导致的合批失败
问题描述:
- 开启了SRP Batch时,两个模型使用了相同的shader,并且使用相同的变体,但无法SRP合批。
- 在
FrameDebugger中提示“SRP:Node use different shader keywords”,但使用中的keywords是一样的。
问题原因:
- 材质球中残留了关键字导致的,虽然在实际使用中并没有用到,但Unity会认为两者使用了不同变体,而不会让其合批。
- 例如创建了材质球,先使用shaderA(例如lit.shader),调整了自发光设置,材质就会多了
_EMISSION关键字,然后再替换成shaderB(没有_EMISSION关键字),这样材质球就残留了对应的keyword,而实际上shaderB没有_EMISSION和对应的变体。
参考:
SRP Batch竟然和RenderQueue有关,有解吗
打包shader丢失Pass/Variant
打包出来的shader(安装包、ab包)会丢失掉Pass、Variant等。
问题描述:
- 打包出来的shader(安装包、ab包)会丢失掉LightMode为
ShadowCaster的Pass。 - 检查了Shader并没有问题
- Editor下运行没有问题
- Editor下查看shader编译的文件没有问题
问题原因:
- UnityEditor.Rendering.Universal.ShaderPreprocessor在检测
GraphicsSettings和QualitySettings中的PipelineAsset时,发现没有supportsMainLightShadows和supportsAdditionalLightShadows时,会剔除掉LightMode为ShadowCaster的Pass。
ShaderFeatures
记录shader特性的枚举值,可用于后续剔除Pass、Variants的枚举值
| Feature | 说明 | 条件 |
|---|---|---|
| MainLight | 主光源 | 一定激活 |
| MainLightShadows | 主光源阴影 | supportsMainLightShadows |
| AdditionalLights | 多光源 | additionalLightsRenderingMode == LightRenderingMode.PerPixel |
| AdditionalLightShadows | 多光源阴影 | AdditionalLights && supportsAdditionalLightShadows |
| VertexLighting | 顶点光照 | additionalLightsRenderingMode == LightRenderingMode.PerVertex |
| SoftShadows | 软阴影 | (MainLightShadows || AdditionalLightShadows) && supportsSoftShadows |
| MixedLighting | 混合光照 | supportsMixedLighting |
| TerrainHoles | 地形挖空 | supportsTerrainHoles |
| DeferredShading | 延迟渲染 | renderingMode == RenderingMode.Deferred |
| DeferredWithAccurateGbufferNormals | 高精度GBuffer法线纹理 (延迟渲染) | 所有Renderer.accurateGbufferNormals == true |
| DeferredWithoutAccurateGbufferNormals | 非高精确GBuffer法线纹理 (延迟渲染) | 所有Renderer.accurateGbufferNormals == false |
| ScreenSpaceOcclusion | 屏幕空间环境光遮蔽 (SSAO) | 任意Renderer激活ScreenSpaceAmbientOcclusion |
StripUnusedFeatures
主要为剔除没有使用的特性,剔除情况如下:
| Keyword | 说明 | 剔除条件 |
|---|---|---|
_MAIN_LIGHT_SHADOWS | 主光源阴影 | ShaderFeatures.MainLightShadows未激活 |
_MAIN_LIGHT_SHADOWS_CASCADE | 主光源级联阴影 | ShaderFeatures.MainLightShadows未激活 |
_SHADOWS_SOFT | 软阴影 | ShaderFeatures.SoftShadows未激活 |
_MIXED_LIGHTING_SUBTRACTIVE | 混合光照相减 | ShaderFeatures.MixedLighting未激活 |
LIGHTMAP_SHADOW_MIXING | 光照贴图混合 | ShaderFeatures.MixedLighting未激活 |
SHADOWS_SHADOWMASK | 阴影遮罩 | ShaderFeatures.MixedLighting未激活 |
_ADDITIONAL_LIGHT_SHADOWS | 多光源阴影 | ShaderFeatures.AdditionalLightShadows或ShaderFeatures.AdditionalLightShadows未激活 |
_DEFERRED_ADDITIONAL_LIGHT_SHADOWS | 多光源阴影(延迟渲染) | ShaderFeatures.AdditionalLightShadows未激活 |
_ADDITIONAL_LIGHTS | 多光源(逐像素) | ShaderFeatures.AdditionalLights未激活 |
_ADDITIONAL_LIGHTS_VERTEX | 多光源(逐顶点) | ShaderFeatures.VertexLighting未激活 |
_SCREEN_SPACE_OCCLUSION | 屏幕空间环境光遮蔽 | ShaderFeatures.ScreenSpaceOcclusion未激活 |
StripInvalidVariants
主要为剔除不合法的shader变体,剔除情况如下:
| Keyword | 说明 | 剔除条件 |
|---|---|---|
_MAIN_LIGHT_SHADOWS_CASCADE | 主光源的级联阴影 | _MAIN_LIGHT_SHADOWS未激活 |
_ADDITIONAL_LIGHT_SHADOWS | 多光源阴影 | _ADDITIONAL_LIGHTS未激活 |
_DEFERRED_ADDITIONAL_LIGHT_SHADOWS | 多光源阴影(延迟渲染) | _ADDITIONAL_LIGHTS未激活 |
_SHADOWS_SOFT | 软阴影 | _MAIN_LIGHT_SHADOWS、_MAIN_LIGHT_SHADOWS、_ADDITIONAL_LIGHTS都未激活 |
StripUnsupportedVariants
主要为剔除不支持的shader变体,剔除情况如下:
| Keyword | 说明 | 剔除条件 |
|---|---|---|
DIRLIGHTMAP_COMBINED | 烘培开启方向图 | LIGHTMAP_ON未激活 |
_USE_DRAW_PROCEDURAL | DrawProcedural | GLES20 |
_MAIN_LIGHT_SHADOWS_CASCADE | 主光源的级联阴影 | GLES20 |
_DETAIL_MULX2 | 两倍的Detail纹理 | GLES20 |
_DETAIL_SCALED | 自定义缩放的Detail纹理 | GLES20 |
_CLEARCOAT | 透明图层(车漆)效果 | GLES20 |
_CLEARCOATMAP | 透明图层(车漆)效果纹理 | GLES20 |
StripUnusedPass
主要为剔除没有在用的Pass,剔除情况如下:
| Pass(LightMode) | 说明 | 剔除条件 |
|---|---|---|
Meta | 生成Lightmapping的Pass | 一定剔除 |
ShadowCaster | 阴影捕获Pass | ShaderFeatures.MainLightShadows、ShaderFeatures.AdditionalLightShadows未激活 |
Other
其他剔除情况,剔除情况如下:
| Keyword | 说明 | 剔除条件 |
|---|---|---|
_ALPHATEST_ON | 启动AlphaTest | Lit.shader,并且ShaderFeatures.TerrainHole未激活 |
| Pass(Name) | 说明 | 剔除条件 |
|---|---|---|
GBuffer | GBuffer的Pass | ShaderFeatures.DeferredShading未激活 |
GBuffer | GBuffer的Pass | ShaderFeatures.DeferredWithAccurateGbufferNormals激活_GBUFFER_NORMALS_OCT未激活 |
GBuffer | GBuffer的Pass | ShaderFeatures.DeferredWithoutAccurateGbufferNormals激活_GBUFFER_NORMALS_OCT激活 |
