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 激活 |
评论
还沒有留言。