共计 2492 个字符,预计需要花费 7 分钟才能阅读完成。
【博物纳新】专栏是 UWA 旨在为开发者 举荐新鲜、易用、乏味的开源我的项目 ,帮忙大家在我的项目研发之余发现世界上的热门我的项目、前沿技术或者令人惊叹的视觉效果,并摸索将其利用到本人我的项目的可行性。 很多时候,咱们并不知道本人想要什么,直到某一天咱们遇到了它。
随着越来越多的我的项目应用 URP 管线,以及更多的我的项目的特效压力越来越大,因而本篇文章基于 GitHub 上的一个我的项目将其从 Builtin 管线下移植到 URP 修改版,给大家提供了 URP 管线下升高特效 GPU 压力的做法,以供大家参考。
GitHub 我的项目:OffScreenParticleRendering
https://github.com/slipster21…
这个库做的工作是将粒子系统或者半透明的渲染对象独自渲染到 RenderTexture 中,而后再将 RenderTexture 与不通明的渲染进行混合。独自渲染到 RenderTexture 的益处是能够通过升高 RenderTexture 的分辨率从而缩小 GPU 的渲染压力。
Builtin 管线下最终交融成果
Builtin 管线下 RenderTexture 的渲染成果
为了能将此性能移植到 URP 下,咱们先阐明一下原始我的项目中 Builtin 管线下性能实现的关键点,具体细节在原 GitHub 我的项目的阐明文档中有阐明,次要步骤如下图 1,2,3,4。
#1 主相机中渲染不通明对象,且因为渲染半透明时须要做深度比拟,因而主相机的 depthTextureMode 须要设置为 DepthTextureMode.Depth。
#2 在 OnRenderImage 中将_CameraDepthTexture 进行 DownSample。
#3 在 OnRenderImage 中从主相机复制一个相机,此相机渲染到 RenderTexture,且 RenderTexture 能够调整分辨率,在此相机中独自渲染粒子系统和其余半透明对象。调用拷贝的离线渲染相机的 Camera.Render,这样能够保障离线相机的渲染程序是在主相机之后渲染的,否则设置了 RenderTarget 的相机会优先比没有设置 RenderTarget 的相机先渲染。半透明的对象的 Shader 须要做非凡解决,须要将半透明对象和渲染场景生成的深度进行比拟,比不通明对象离相机更近的像素才会被“绘制”到 RenderTexture 上。
PS:在原始我的项目中渲染 Particle 的 Shader 中少了“COMPUTE_EYEDEPTH(o.projPos.z);”,所以成果看上去不太对,在 vert 函数中增加上这句就 OK 了。
#4 在 OnRenderImage 的最初通过 OffScreenParticle_Upsample Shader 将 Particle 等半透明的 RenderTexture 交融到不通明场景中。此 Shader 中将 RenderTexture 的色彩通过 Blend SrcAlpha OneMinusSrcAlpha 的形式进行原色混合,从而和主场景进行混合。
以上就是原始 Builtin 管线下的实现思路,转到 URP 下,有几个问题须要思考:
- OnRenderImage 在 URP 下是不反对的。
- 是否还须要额定的相机来实现半透明对象的渲染。
- 如何解决最初的交融操作。
在 URP 下,对于第一个问题,有专门的 RenderFeature 能够对应 OnRenderImage 的操作;第二个问题,并不需要额定的相机来渲染半透明对象,只须要模拟 URP 自带的 CopyColor 来实现渲染另外 RenderTexture 的操作即可,只是 BlitCopy 应用的材质球不一样;第三个问题,同样用另外一个 RenderFeature 来实现即可。
URP 下的实现成果:
URP 下 RenderTexture 中渲染 OffScreen Particle 的成果如下:
在此工程中,次要的点如下:
1、移除额定的 Camera,勾销了 OffScreenParticleCamera 脚本的作用。主相机须要开启 Copy Depth。额定加了一个 Particle 的 Layer,粒子特效的层改成 Particle 了。
2、新增了两个 RenderFeature,OffScreenParticleFeature 和 OffScreenMergeFeature。后面的是用来绘制 Particle 的,前面的是用来做主场景和 Particle 交融的。在 OffScreenParticleFeature 中增加了 2 个 Pass,一个绘制 Particle 到_ParticleRT,一个对 Depth 进行降采样,绘制到_CameraDepthLowRes,OffScreenMergeFeature 中有一个 Pass,应用 MergeShader 进行交融。
3、OffScreenMergeFeature 用到的 Shader 是 MergeShader,依据原工程中 OffScreenParticle_Upsample Shader 进行批改的。
4、为了让 Particle 层只在 OffScreenParticleFeature 中进行渲染,须要将两个 Shader 的 LightMode 更改为一个自定义的字符串,并且在 OffScreenParticleFeature 中将这个“OffScreenParticle”退出到 ShaderTagList 中,ShaderTagList 的值是由 Pass 中的 Tags 外面的 LightMode 的值决定的。
最终在 FrameDebugger 中确定好渲染队列:
- 渲染场景中不通明物体;
- Copy Depth 到_CameraDepthTexture 中;
- 应用 OffScreenParticlePass 进行 Particle 层对象的渲染,能够通过 DownSample 来调整 RT 的大小,原始大小或者 1 / 2 或者 1 /4;
- 对 Depth 进行降采样,渲染最终 Merge 中用到的_CameraDepthLowRes;
- 应用 MergePass 进行最终的 Merge,应用的是 MergeShader。
Unity Demo 下载链接:
https://pan.baidu.com/s/1Zi1a…
明码:bksb