- 0
- 0
- 0
分享
- URP系列教程 | 新功能Decal System贴花系统
-
原创 2022-02-22
贴花 Decals 是现代游戏中非常常见的功能,很多用户会因为 URP 中缺失贴花系统而放弃使用 URP。所以 URP 拥有其内置的贴花解决方案变得非常重要。Unity 在 URP 12.0 及以上版本中将贴花 Decals 在 Renderer Feature 中完全模块化;并且实现了贴花投影(Decals Projector )、贴花网格以及贴花着色器(Decal Shader Graph)。
本篇教程将会从以下几个方面来给大家讲解 URP Decal System。
5. 透明表面贴花支持计划
游戏中贴花的应用场景
贴花 Decals,顾名思义,允许在物体表面上添加图案(贴花),包括基于物理的照明。如果你想向物体表面添加任何细节,那么贴画系统是一个非常强大的解决方案。贴花 Decal 在游戏中是一种非常常见的效果,举几个常见的用例是:比如在游戏中墙壁上的涂鸦、地毯上的花纹或者在射击游戏中的血迹、弹孔等等效果。
正因为贴花 Decals 是现代游戏中非常常见的功能,很多用户会因为 URP 中缺失贴花系统而放弃使用 URP。虽然也有些用户会为管线缺少的功能编写自己的解决方案。但是创造一个高质量的贴花系统并非易事,因为贴花系统最佳解决方案与渲染逻辑是密切相关。所以 URP 拥有其内置的贴花解决方案变得非常重要。
Unity 在 URP 12.0 及以上版本中将贴花 Decals 在 Renderer Feature 中完全模块化;并且实现了贴花投影(Decals Projector)、贴花网格以及贴花着色器(Decal Shader Graph)。
URP中的两种贴花解决方案介绍
第一种 Screenspace decals(屏幕空间贴花)
屏幕空间贴花通过在不透明对象之后渲染贴花作为额外的渲染通道来工作,并且根据渲染目标(如 forward/deferred)会有轻微的变化。屏幕空间贴花解决方案虽然在视觉上非常有限,但它不需要深度预通(depth prepass),这使 Screen space decals(屏幕空间贴花)解决方案非常适合基于 tile 的渲染设备(移动设备)。
其中 Normal Blend 属性中的选项(Low、Medium 和 High)确定 Unity 在从深度纹理重建法线向量时所采用的深度纹理的样本数。质量越高,重建的法线越准确,性能影响越大。(Low 表示 Unity 在重建法线时采用一个深度样本、Medium 表示 Unity 在重建法线时采用三个深度样本、High 表示 Unity 在重建法线时采用七个深度样本)
其中 Use GBuffer 属性 :在延迟渲染路径中使用此选项。在延迟渲染路径中,贴花影响基础颜色、自发光颜色和法线。
第二种是 DBuffer(贴花缓冲区)
贴花缓冲区 DBuffer 解决方案与 GBuffer 贴花非常相似,Unity 将贴花渲染到贴花缓冲区 (DBuffer)。然后 Unity 在渲染不透明对象期间将 DBuffer 的内容覆盖在不透明对象之上。
如下图所示:首先我们先在 depthprepass 渲染深度图,然后将贴花(Decal)渲染到类似 GBuffer 的 DBuffer 上,然后再渲染 GBuffer 的时候,直接应用同样的位置对 DBuffer 进行采样,融合到 GBuffer 中。之后根据渲染路径的不同:
前向 - 在渲染不透明对象期间,每个对象将 _DBufferTexture0-3 应用于其表面数据 Surface Data。
延迟 - 在渲染 GBuffer 期间,每个对象都将 _DBufferTexture0-3 应用于其表面数据 Surface Data。
当我们选择 DBuffer 这个解决方案时,会在 Technique 属性下显示 Surface Data 属性。Surface Data 属性允许我们指定贴花的哪些 Surface Data 表面属性与底层网格混合。为了更好地控制性能我们通过 Surface Data 属性来进行控制。
Surface Data 属性具有以下选项:
Albedo Normal MAOS:贴花影响基础颜色、自发光颜色、法线、金属值、平滑度值和环境光遮挡值。
DBuffer 贴花技术需要 Depth Normal Prepass,这使得此技术在实现基于 tile 的渲染的 GPU 上效率较低。所以它不适合移动平台,比较适合 PC 和 Console 平台。(高清渲染管线 HDRP 目前在采用这种贴花方案)
如何使用URP Decal System
创建FPS游戏中的弹孔效果
那么接下来,我们就是通过一个实战的案例来教大家如何使用 URP Decal System。
首先我们新创建一个 URP 的工程,我将项目命名为 BulletDecals,然后在 Edit>Project settings 中找到 URP Asset。
接着点击 URPAsset_Renderer,在 Inspector 面板中添加 Decal Renderer Feature 到 URPAsset_Renderer 当中。
添加完成 Decal Renderer Feature 之后,将 Technique 设置为 Automaic;这样的话 Unity 会自动根据所构建的平台和系统的兼容性选择最合适的 Decal 渲染技术;Max Draw Distance 设置为 100,代表 Unity 渲染贴花时距相机得到最大距离为 100,大于这个距离,Unity 将不渲染对应的贴花(如下图举例所示)。
接着我们创建一个材质,将其命名为 MetalBulletHole;然后的话为其指定 Shader Graphs/Decal 着色器。材质只有使用 Decal 着色器,URP Decal Projector 贴花投影仪才可以将材质投影为贴花,这里我们将 Decal 着色器也命名为了 MetalBulletHole;
双击 Edit..., 打开 URP 预置的 Decal Shader Graphs 模板,我们可以看到预置的 Decal Shader Graph 具有以下属性(下图中1,2,3):Base Map、Normal Map、Normal Blend 分别代表的是材质的基础纹理、法线贴图以及法线贴图与所投影到的材质得到法线贴图混合的比例。(0代表贴花不影响其投影到的材质;1代表贴花的法线贴图替换了它所投影的材质的法线贴图)
除此之外我们在贴花材质的 Inspector 面板还有一些“高级选项”。(上图中4)
Enable GPU Instancing:启用此选项可让 URP 在一个 Batch 中渲染具有相同几何体和材质的 Mesh。从而加速渲染(后面我们会开启 GPU Instancing 进行测试)。
Priority:这个属性定义 URP 在场景中绘制贴花的顺序。URP 首先绘制具有较低优先级值的贴花,然后在具有较低优先级值的贴花之上绘制具有较高优先级值的贴花。因此它不必渲染重叠区域两次,我们可以使用这个属性来减少设备上的 Overdraw。
如果场景中有多个具有相同优先级的贴花材质,URP 会按照材质的创建顺序渲染它们。
Mesh Bias Type:这个属性仅适用于具有直接指定贴花材质类型(比如我们可以将贴花着色器的材质直接分配给游戏对象)。而如果使用 Decal Projector 来指定贴花材质则可以忽略这个属性。在这种情况下 Mesh Bias 可让防止贴花游戏对象与其重叠的游戏对象之间发生 z-fighting。
View Bias:绘制贴花游戏对象时,Unity 将游戏对象的每个像素沿视图向量移动该值。正值将像素移动到更靠近相机的位置,以便 Unity 在重叠的 Mesh 顶部绘制贴花游戏对象,从而防止 z-fighting。
Depth Bias:在绘制 Decal GameObject 时,Unity 通过这个值改变 GameObject 的每个像素的深度值。负值会使像素更靠近相机,以便 Unity 在重叠的网格上绘制贴花游戏对象,从而防止 z-fighting。
为了能够控制贴图的颜色与法线强度,这里我们在内置的 Decal Shader Graph 上增加了两个节点 Multiplay 与 Normal Strength;并在 Shader Graph 中添加两个属性 Color 和 Normal Strength,这样我们就可以在编辑器的 Inspector 界面对其进行修改。
在材质的 Inputs 属性中选择添加对应的 Albedo 贴图和 Normal 贴图。选择 Color 为白色,并将 NormalStrength 的强度调节为 0.547;
创建一个空的 GameObject,将其命名为 MetalBulletHole,将 URP Decal Projector 组件添加到 MetalBulletHole 身上。调整大小与深度值使其显示在金属板面上,将我们之前创建的 MetalBulletHole 材质添加到 Material 属性上。当选择 Decal Projector 时,Unity 会显示其边界和投影方向。Decal Projector 在边界框内的每个 Mesh 上绘制贴花材质。其中白色箭头表示投影方向。箭头的底部是坐标轴点。
最后,为了使我们的效果更加逼真,我们在 MetalBulletHole 加上子弹与金属碰撞产生的火花 Sparks 与烟尘 Dust 的粒子效果。
按照上面的方式,我们接着实现与子弹与墙面的贴花效果和子弹与木材的贴花效果;最终的效果如下:
URP Decal System性能优化
URP 支持材质的 GPU 实例化。如果场景中的贴花使用相同的材质,并且材质启用了启用 GPU Instancing 实例化属性,则 URP 会实例化材质并减少对性能的影响。
我们尝试在该项目中开启所有的贴花材质的 GPU Instancing,通过对比统计窗口的合批数和渲染线程的节省的时间都有了明显的提升。
另外由于 URP Decal System 采用了类似 ECS 的实现方法,所以在使用 URP 贴花系统的时候如果和 jobify 和 burst 一起使用效果会更好。
我们来做一个简单性能测试,我们在场景中创建了 10000 个 Decal,对比使用 Burst 前后性能的对比:通过 Profiler 中的数据我们也可以明显的看到使用 Burst 后,帧率得到了提升并且更加稳定。
透明表面贴花支持计划
最后 URP Decal System 目前还不能在透明表面上起作用。但是这个功能已经在 HDRP 中已经使用 Cluster decal 解决方案进行实现了。所以我们的计划目标是将 HDRP 贴花解决方案移植到 URP,以致于使它满足 URP 对移动设备友好性。
点击“阅读原文”,即可解锁本教程的视频版。
长按关注
第一时间了解Unity引擎动向,学习最新开发技巧
-
阅读原文
* 文章为作者独立观点,不代表数艺网立场转载须知
- 本文内容由数艺网收录采集自微信公众号Unity官方平台 ,并经数艺网进行了排版优化。转载此文章请在文章开头和结尾标注“作者”、“来源:数艺网” 并附上本页链接: 如您不希望被数艺网所收录,感觉到侵犯到了您的权益,请及时告知数艺网,我们表示诚挚的歉意,并及时处理或删除。