URP(Universal Render Pipeline)渲染管线在使用中的一些分享
本篇文章整理了URP管线使用中的一些简单的心得记述
1.使用ScriptableRendererFeature自定义渲染特性
在内建(Build-in)管线中可以使用CommandBuffer并添加到摄像机上来实现自定义的特性。在URP管线中,处理方法变成了RendererFeature
RendererFeature不需要绑定到相机;而是挂载到渲染器(如ForwardRenderer)的设置里。
在Project面板点击右键Create/Rendering/Universal Render Pipeline/Renderer Feature可以创建Renderer Feature模板。
模板中Feature带有一个CustomRenderPass的嵌套类;并且在AddRenderPasses
函数中被添加进pass队列。
ScriptableRenderPass可以指定需要的渲染步骤,如:
m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
由于一个效果往往需要多个pass不同阶段处理;这样的方式显然比较友好。
在之前内建的渲染管线中;CommandBuffer只能执行预先设定好的一些步骤,这样多少有些不方便。在自定义管线中CommandBuffer变成了立即执行,
现在可以在ScriptableRenderPass
中直接通过context
来立即执行CommandBuffer:
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get("MyCommandBuffer");
//CommandBuffer的操作
context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd);
}
此外,标记Profiling后,可在FrameDebugger中直接查看标记Profiling的对象:
{
ProfilingSampler mProfilingSampler = new ProfilingSampler("Test1");
CommandBuffer cmd = CommandBufferPool.Get("Test1 Cmd");
using (new ProfilingScope(cmd, mProfilingSampler))
{
MeshRenderer meshRenderer = Resources.Load<MeshRenderer>("TestModel");
cmd.DrawRenderer(meshRenderer, meshRenderer.sharedMaterial);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
}
而打开了管线设置中的Debug Level后;可以通过这个参数看见更多的调试信息
如UniversalRenderPipeline.cs的RenderSingleCamera
方法里:
static void RenderSingleCamera(...)
{
...
asset.debugLevel >= PipelineDebugLevel.Profiling ? ...
这段代码在勾选这个设置后可以在FrameDebugger内显示不同的相机名。
2.使用DrawRenderers进行大批量绘制
在内建管线中,通常使用CommandBuffer.DrawRenderer
来绘制一些指定的对象,
不过绘制对象一多这样做就不太方便。
在URP的自定义pass中可以使用ScriptableRenderContext
上下文里的DrawRenderers
接口进行批量绘制,
它可以拿到当前相机的剔除结果(CullingResults),通过FilteringSettings参数再进行一次过滤。
FilteringSettings里还可以设置renderingLayerMask
,renderingLayerMask
可在MeshRenderer、SkinnedMeshRenderer
等渲染器组件中设置,独立于旧的Layer。
借助传入的DrawingSettings
,RenderStateBlock
参数可指定是否写入Stencil、是否写深度等信息,最终完成绘制,如:
context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref m_FilteringSettings,
ref m_RenderStateBlock);
如果要绘制的内容第一次相机剔除时没有,也可以再进行一次相机剔除:
context.Cull(...)
使用新的结果来绘制。
以前抓取uGUI的绘制内容较为困难,现在也可以用这种办法把UI分成几部分绘制,并且控制每一部分是否写入指定RT了,
并且还可以通过自定义的Feature和context.DrawRenderers
把UI绘制的步骤单独挪出来自行控制(但是Stencil会丢掉,酌情使用)。
还可以先修改RenderTarget再执行context.DrawRenderers
绘制,这样就可以把内容批量绘制到指定RT上:
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get("tempRt");
int tmpRt = Shader.PropertyToID("_TempRt");
cmd.GetTemporaryRT(tmpRt, mDesc);
cmd.SetRenderTarget(tmpRt);
context.ExecuteCommandBuffer(cmd); context.DrawRenderers(...); CommandBufferPool.Release(cmd);
}
(这里的RenderTexture应该在Configure中绑定)
注意,内建管线中使用CommandBuffer时可以直接填写-1、-2等宽高参数获得1/2,1/3等大小的RenderTexture,在自定义管线中
不再可用。
更多的绘制方法可以参考Render Objects(Runtime/RendererFeatures/RenderObjects.cs)或
DrawObjectsPass.cs(Runtime/Passes/DrawObjectsPass.cs)的做法。
3.相较内建管线的优化
在URP中单个对象支持的最大灯光数量是8盏;光照处理的操作在一个pass中完成。
虽然有数量限制;但这样整个场景的Batches数量得到了控制,这一点体现较为明显。
而阴影方面目前只能支持主光源平行光的阴影和聚光灯的阴影(v7.3.1)。
其次就是SRP Batches等技术,这方面暂未深入了解。
URP(Universal Render Pipeline)渲染管线在使用中的一些分享的更多相关文章
- 1.3:Render Pipeline and GPU Pipeline
文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 在学习SubShader之前,我们有必要对 Render Pipeline ...
- 1.5:Unity Render Pipeline
文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 这一节主要是为上一节中没有提到的一些概念作补充. 上一节提到了Unity中 ...
- Lightweight Render Pipeline
(翻译) Lightweight Render Pipeline (LWRP),轻量级渲染管线,是一个Unity预制的Scriptable Render Pipeline (SRP).LWRP可以为移 ...
- Scriptable Render Pipeline
Scriptable Render Pipeline SRP的核心是一堆API集合,使得整个渲染过程及相关配置暴露给用户,使得用户可以精确地控制项目的渲染流程. SRP API为原有的Unity构件提 ...
- [Unity] Shader Graph Error 当前渲染管道与此主节点不兼容(The current render pipeline is not compatible with this master node)
Shader Graph Error : The current render pipeline is not compatible with this master node 问题产生环境: Un ...
- 可编程渲染管线(Scriptable Render Pipeline, SRP)
原文链接 可编程渲染管线处理数据的流程可分为以下3大阶段 1. 应用阶段 这个阶段大概会由CPU处理4件事情.首先会对模型数据进行可见性判断.模型数据由顶点位置.法线方向.顶点颜色.纹理坐标等构成.然 ...
- DirectX 11游戏编程学习笔记之6: 第5章The Rendering Pipeline(渲染管线)
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...
- Scriptable render pipeline unity
https://www.youtube.com/watch?v=zbjkEQMEShM LWRP https://blogs.unity3d.com/cn/2018/02/21/the-lightwe ...
- unity render pipeline
post process v2 GUI temp8->TaregtPool0->temp8 tem8 temp8->backbu ...
- 改写画质、突破性能, Unity 全面升级!
技术变革,时代更迭.从<神庙逃亡>.<暗影之枪>等主流手游到独立联网的大型游戏,从绚丽多彩的影视动画到具备极致体验的运输建筑制造行业,从传统的2D 到立体3D 乃至沉浸式的VR ...
随机推荐
- 2024最新AIGC系统ChatGPT网站源码,GPTs应用,Ai绘画网站源码
一.前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型+国内AI全模型.本期针对源码系统整体测试下来非常完美,那么 ...
- 成长计划校园极客秀 | 玩转OpenHarmony开发智能煤气检测系统
成果展示 1.整体展示 2.碰一碰无感配网 3.报警 简介 目前,煤气泄漏给居民生活带来伤害的事情仍时有发生,但我相信万物互联能够有效避免这种伤害,于是我基于OpenHarmony设计了一款煤气检测装 ...
- vue3 快速入门系列 —— vue3 路由
vue3 快速入门系列 - vue3 路由 在vue3 基础上加入路由. vue3 需要使用 vue-router V4,相对于 v3,大部分的 Vue Router API 都没有变化. Tip:不 ...
- DevEco Studio强大的预览功能让开发效率大大提升!
原文:https://mp.weixin.qq.com/s/C5DL0wBubDX3exvPpeXBPQ,点击链接查看更多技术内容. 应用的开发过程中,往往需要多次调试和修改,如果支持实时预览,边 ...
- 【直播回顾】Hello HarmonyOS系列应用篇完美收官!
6月15日晚上19点,Hello HarmonyOS系列应用篇第七期直播 <分布式应用开发>,在HarmonyOS社群内成功举行.随着本系列直播最后一课的完美收官,开发者们在逐渐掌握技术知 ...
- 顺通ERP:精细敏捷的设计理念,得到了消费者的喜爱
顺通ERP是近年来备受关注的一款ERP品牌,其设计精细,操作便捷,备受消费者喜爱.那么,顺通ERP到底怎么样呢?属于什么档次呢? 首先,从品质上来看,顺通ERP具备高度的稳定性,能够确保企业的日常运营 ...
- 牛客网-SQL专项训练17
①SQL查询中使用WHere子句指出的是:查询条件 ②Mysql中表student_table(id,name,birth,sex),查询重复姓名.重复次数,并按重复次数降序排列,正确的是(A)? 解 ...
- 科普达人丨漫画图解SGX加密计算黑科技
介: 运行态的数据也可以被加密,实现数据可用不可见. 01 从一场朋友圈的"赛富"说起 最近,小明买基金赚了不少钱,开始膨胀了,开始在朋友圈里晒豪车.晒爱马仕.小红表示不服,&qu ...
- 网易:Flink + Iceberg 数据湖探索与实践
导读:今天主要和大家交流的是网易在数据湖 Iceberg 的一些思考与实践.从网易在数据仓库建设中遇到的痛点出发,介绍对数据湖 Iceberg 的探索以及实践之路. 主要内容包括: 数据仓库平台建设的 ...
- DataWorks 功能实践速览03期 — 生产开发环境隔离
简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 往期回顾: DataWorks 功能实践速览01期--数据同步解决方案:为您介绍不同场景下可选的数据同 ...