Unity项目升级支持HDRP管线实践

本文地址:https://blog.csdn.net/t163361/article/details/127530893

前段时间把产品从Unity2018升级到Unity2021,遇到了一些小问题,整体过程比较顺利。
最近升级到HDRP,过程就比较坎坷了。
Unity版本2021.3.0f1c1
下面是踩坑记录。

加载Assetbundle场景效果和原场景效果不一致

我们的场景是美术单独用Unity打包的,和程序工程相互独立,然后生成assetbundle,主工程加载,发现效果对不上。
解决方案:

  • 解决效果不一致问题之前,一定要保证,使用相同的Unity版本,HDRP版本也要保持一致
  • 使用相同的RenderPipelineAsset。
    包括HDRenderPipelineAsset和HDRenderPipelineGlobalSettings两个文件,以及GlobalSettings中引用的VolumeProfiles和DiffusionProfileAssets文件。同时需要保证两个项目中的Graphics和Quality中设置的RenderPipelineAsset需要相同(Graphics和Quality可以设置不同的asset文件,但需要两个工程保持一致),其中GlobalSettings文件中的VolumeProfiles和DiffusionProfileAssets文件也需要保持一致。同时最关键的需要保证两个项目中以上所有文件对应的meta文件需要保持一致,不然会导致加载后索引不到对应的引用而产生画面差异。如果你发现场景光没啥大问题,但是某些场景物件有细微差别,那大概率是DiffusionProfileAssets文件不同导致的。
  • Decal无法看到的问题
    上面说所的文件不一致导致的,HDRenderPipelineAsset文件中有个开关Rendering->Decals.同时Unity2021.3.0f1c1对应的HDRP版本中有个Bug,Decal开关会影响到场景中物体的反射/金属度效果。
  • 远处的纹理分级模糊
    在这里插入图片描述
    Quality中的Anisortopic Textures需要修改成Forced On
  • 场景中支持透明的纹理模糊闪烁
    关闭HDRenderPipelineAsset文件中的Rendering->Low res Transparency
  • 给相机设置的RenderTexture纹理半透丢失
    将HDRenderPipelineAsset文件中的Rendering->ColorBufferFormat设置为R16G16B16A16

功能失效

有一些功能在HDRP下面已经无法使用了

  • 所有使用OnPostRender支持的功能都失效
    此函数在HDRP中不支持,需要自己写CustomPass自己实现
  • Graphics.DrawMeshNow无法渲染模型
    此函数无法在HDRP中使用,需要自己写CustomPass,拿去pass中提供的CommandBuffer,然后调用DrawMesh函数渲染
  • GL.Draw和GL.Vector3等无法使用
    此函数无法在HDRP中使用,需要自己写CustomPass,拿去pass中提供的CommandBuffer,然后调用DrawMesh函数渲染。也有一些其他方案可以看这个贴子gl-draw-in-hdrp

功能异常

  • UI显示异常
    当UI使用Screen Space - Camera或者World Space时,UI也会被后处理所影响,需要把Enviroment中的VolumeMask和Probe Layer Mask关闭对应的后效
  • UI相机和场景相机叠加异常
    当UI相机和场景相机同时往一个Display输出时,UI相机会导致场景相机的效果异常,解决方案,把相机相机输出到RenderTexture作为UI的背景RawImage。官方文档里还有一些其他处理方案Working with UI in the High Definition Render Pipeline
  • ShaderGraph的半透混合支持不完整
    ShaderGraph中的Blending Mode所支持Alpha,Additive,Premultiply都无法生成 SrcAlpha OneMinusSrcApha这种混合方式,需要写HLSL的Shader才行。貌似自己手动改Material可以支持这种混合方式。
  • Shader中的Transparent有上限
    之前一些shader里面设置RenderQueue会设置的比较高比如
    Tags {“Queue”=“Transparent+800” “IgnoreProjector”=“True” “RenderType”=“Transparent”}
    现在貌似最高支持到"Queue"=“Transparent+500
  • 多相机半透出问题
    当Shader中的混合使用Blend SrcAlpha OneMinusSrcAlpha,导致半透里面混合了其他相机的画面。解决方案在Shader里面添加ColorMask RGB(同事查出来的)
  • Assetbundle打包的场景内物体显示不全
    当相机的Layer没有设置为Everything时,物体显示不全。
    开始使用测试场景有问题,后来用正式场景没问题了。猜测和不同工程中的Layer设置不一致有关系。

AssetBundle打包问题

  • AssetBundle中模型使用HDRP/Lit,关闭Decals选项失效
    12.1.3版本的HDRP和12.1.6版本的HDRP中Decal对应的Keyword发生了变化,导致老版本打的assetbundle在新版本里不生效。统一版本就好了
  • AssetBundle中模型的金属度贴图失效
    当使用命令行导入模型,设置金属度贴图时,Unity并没有正确触发_MaskMap对应shader变体的生成。设置好贴图后,重新设置一次shader就好了
  • 构建命令中包含-nographics导致报错
    删掉就不会报错了,貌似也没啥问题。

猜你喜欢

转载自blog.csdn.net/t163361/article/details/127530893