Hugo Future Imperfect Slim

L-Lawliet's Blog

记录游戏开发的点点滴滴

Unity URP issue

URP的疑难杂症

Lawliet

1 分钟

Colourful

总结在URP项目中遇到的疑难杂症

版本

  • URP: 10.10.1

URP合批失败

隐藏的Keywords导致的合批失败

问题描述:

  1. 开启了SRP Batch时,两个模型使用了相同的shader,并且使用相同的变体,但无法SRP合批。
  2. FrameDebugger中提示“SRP:Node use different shader keywords”,但使用中的keywords是一样的。

问题原因:

  1. 材质球中残留了关键字导致的,虽然在实际使用中并没有用到,但Unity会认为两者使用了不同变体,而不会让其合批。
  2. 例如创建了材质球,先使用shaderA(例如lit.shader),调整了自发光设置,材质就会多了_EMISSION关键字,然后再替换成shaderB(没有_EMISSION关键字),这样材质球就残留了对应的keyword,而实际上shaderB没有_EMISSION和对应的变体。

参考: SRP Batch竟然和RenderQueue有关,有解吗

打包shader丢失Pass/Variant

打包出来的shader(安装包、ab包)会丢失掉Pass、Variant等。

问题描述:

  1. 打包出来的shader(安装包、ab包)会丢失掉LightMode为ShadowCaster的Pass。
  2. 检查了Shader并没有问题
  3. Editor下运行没有问题
  4. Editor下查看shader编译的文件没有问题

问题原因:

  1. UnityEditor.Rendering.Universal.ShaderPreprocessor在检测GraphicsSettingsQualitySettings中的PipelineAsset时,发现没有supportsMainLightShadowssupportsAdditionalLightShadows时,会剔除掉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.AdditionalLightShadowsShaderFeatures.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_PROCEDURALDrawProceduralGLES20
_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阴影捕获PassShaderFeatures.MainLightShadowsShaderFeatures.AdditionalLightShadows未激活

Other

其他剔除情况,剔除情况如下:

Keyword说明剔除条件
_ALPHATEST_ON启动AlphaTestLit.shader,并且ShaderFeatures.TerrainHole未激活
Pass(Name)说明剔除条件
GBufferGBuffer的PassShaderFeatures.DeferredShading未激活
GBufferGBuffer的PassShaderFeatures.DeferredWithAccurateGbufferNormals激活
_GBUFFER_NORMALS_OCT未激活
GBufferGBuffer的PassShaderFeatures.DeferredWithoutAccurateGbufferNormals激活
_GBUFFER_NORMALS_OCT激活

说些什么

评论

还沒有留言。

最新文章

Colourful

HLSL

分类

关于

记录游戏开发的点点滴滴