可编程渲染管线(SRP)已经支持很久了,但项目里用到的还是很少。此前项目优化时都是较多的使用CommandBuffer绘制。其实CommandBuffer也算是可编程管线里的内容,只是CommandBuffer的粒度很粗,而URP(LWRP)则粒度细化到了方便控制整个渲染管线。

开始升级一个已有的工程:

1,清理干净工程;

2,安装Universal RP: Window -> Unity Packages: 找到并安装 Universal RP和URP Core;

3,新建一个管线配置:

4,把新建的管线配置托到Project Setting -> Graphics的Scriptable Render Pipleline Setting;

5,然后可以看到很多Shader报错,主要分为两类:

1)ASE Shader报错: failed to open source file: 'Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl' ...

2)其他shader都是手写的,也是粉色的了

修复错误:

1,开始我强制设置Shader Include Path还是报错;

3,安装了最新的unity2020.2.0f1版本,重新打开URP Demo不再报错;

4,使用unity2020.2.0f1打开自己的工程,很多报错。原因是我之前把UniversalRender RP

拷贝一份在Asset下。删除后备份,而且把Library\PackageCache也一并删除。

5,升级Shader,就没有报错了。shader还是粉色的。

1)需要将CG字样修改为HLSL。 将CGPROGRAM-ENDCG 修改为 HLSLPROGRAM - ENDHLSL; 将CGINCLUDE-ENDCG修改为HLSLINCLUDE - ENDHLSL;

最终放弃修改自定义PBR渲染,我的PBR渲染和Unity Standard Buildin流程嵌入太多。在URP中lit(PBR-M/R)把整个流程重写了一边,核心的光照处理,以及光照衰减,和BRDF实现都优化了。升级改动基本就是重新写一套了,我原先的PBR走的还是unity的PBR框架,改进的是BRDF(Hair-kajiayaKay,DissneyPBR,Skin-SSS),以及去掉了宏编译开关,将多光源在同个pass计算。综合考虑下来还是放弃原先Unity PBR各种实现,转而重新改URP版本PBR嵌入自己的流程。

URP 特性梳理:

0,URP管线流程:

ForwardRenderData -> UniversalRenderPipelineAsset -> UniversalRenderPipeline -> Render

ForwardRendererData:设置后处理资源(shader,texture资源索引),以及RenderFeature配置;

UniversalRenderPipelineAsset:配置ForwardRendererData UniversalRenderPipeline工作的一系列配置

UniversalRenderPipeline:使用UniversalRenderPipelineAsset初始化管线;

Render开始渲染:

1)每帧设置shader全局常量;

2)按照Priority渲染每个相机;先渲染base camera,再依次渲染camera stack;

初始化相机数据,这里URP写了两个API:InitializeStackedCameraData和InitializeAdditionalCameraData,这么做是因为Camera还是以前我们熟悉的BuildinRendererPipleLine里的camera,URP额外的数据走的是UniversalAdditionalCameraData处理的;所以初始化时需要把这两部分数据合并起来。最后按照顺序调用RenderSingleCamera渲染每个相机;

3)RenderSingleCamera:裁剪;设置渲染数据(光照;阴影;后处理);提交渲染;

UniversalRenderPipelineCore里主要是一些核心的数据结构,和一系列对核心数据结构的处理函数。

1,光照实现:

URP中灯光的实现(ForwardLights),AOI计算动态光源,并且保证同屏生效的光源数量限制,这个AdditionalLight 数量是自己控制的。

在传入GPU中时,urp对不同硬件做了不同兼容。

1)当前非手机平台走structured buffer:存储在_AdditionalLightsBuffer,相当于把一个light的position,color,attenuation,spotDirection信息存储在一个struct里。

其他平台lights的position,color,attenuation,spotDirection存储在_AdditionalLightsPosition,_AdditionalLightsColor,_AdditionalLightsAttenuation,_AdditionalLightsSpotDir;

2)mobile:gles2.0 光源数量限制:除了主光源外,最多额外支持4栈存储

3)mobile:非gles2.0 光源数量限制:除了主光源外,最多额外支持8栈存储

URP MainLight:如果没有设置sun light,URP会采用强度最大的方向光来当作主光源;详见UniversalRenderPipleline:GetMainLightIndex

此外MainLight和BuildinPipleline在shader中的相关变量也不一样:

URP:_MainLightPosition.xyz; _MainLightColor.rgb;

BuildinRendererPipeline:_WorldSpaceLightPos0.xyz;_LightColor0.rgb;

阴影部分:主光源生成阴影,额外的光源里只有聚光灯生成阴影(这个具体原因暂时还未深挖)。

2,Pass实现

起初我并没有理解到URP关于自定义的ScriptableRendererFeature和ScriptableRendererPass的精髓所在。对CommandBuffer比较熟悉,此前CommandBuffer操作后处理一般都是需要把Camera的colorBuffer或者DepthBuffer拷贝回来,然后在用CommandBuffer进行Blit操作,最后再Blit回FrameBuffer。或者直接使用CommandBuffer drawMesh或者DrawMeshInstance。

简单看了下ScriptableRendererPass的绘制还是使用了CommandBuffer,于是就纳闷这个ScriptRendererPass的高效率来自于哪里?于是我周一【20201228】细看了,发现原来CommandBuffer并不是直接操作RenderTexture了,而是操作RenderTargetHandle,RenderTargetHandle是类似shader propertry ID一样。这样CommandBuffer操作的只是id,并不需要gpu回传后处理的纹理等信息,因此提升了效率。

3,Camera stack实现:URP的开始的版本不支持Camera Stack,不太清楚从哪个版本开始起支持了。

URP的Camera和以前BuitinRendererPipeline的Camera还是同一个,差异在于URP的额外强制绑定了UniversalAdditionalCameraData用于记录camera的一些配置,比如camera stack references 和一些区别于RenderPipelineAsset的全局设置。

base camera 排序按照Priority排序,和以前的Depth含义一样;但是如果是overlay camera,则没有Priority属性,overlay camera的渲染顺序是按照先渲染其挂载的base camera,再依次渲染挂载在camera stack上的相机;

4,SRP Batch:结合使用constant buffer使用,类似在gpu中对使用同个shader的物件进行for循环处理。原先的内置渲染管线可以使用CommandDrawMeshInstanced绘制同个mesh同个材质,并使用gpu instance来优化

总结:

URP新管线实现和BuildinRendererPipleline两者是完全不一样的实现,不能兼容。项目开始制定了采用哪种渲染管线,后续改动可能会很痛苦。从URP改回BuildinRendererPipeline可能还好点。从BuildinRendererPipeline改到URP可能就更痛苦了,项目中期在抽调人去处理这块的东西可能又导致其他开发进度滞后,而招人未必就能立马找到合适的。所以项目立项之初就要考虑使用哪种管线。

建议制作对性能要求比较高得项目尽可能采用URP,比如跑图类RPG游戏,大规模3d单位战斗的SLG,赛车竞速类的,开放世界类的,以及一些对后处理要求较高的游戏。其他则采用URP和BuildinRendererPipeline都可以,看个人意愿。

抛砖引玉,欢迎拍砖交流。

ase支持 urp不_粗见URP相关推荐

  1. 魔百盒CM201-1、CM211-1朝歌ZG_支持UWE5621WiFi驱动_免拆卡刷固件包

    魔百盒CM201-1.CM211-1朝歌ZG_支持UWE5621WiFi驱动_免拆卡刷固件包 图片 刷机方法: 把下载的刷机包文件解压一次,复制到U盘根目录!update.zip升级包不能解压,原原本 ...

  2. 创维E900V21E/E900V22E_S905L3B/S905L2B通刷_支持5621DS无线_完美语音线刷固件

    创维E900V21E/E900V22E_S905L3B/S905L2B通刷_支持5621DS无线_完美语音线刷固件 固件特点: 1.修改dns,三网通用: 2.开放原厂固件屏蔽的市场安装和u盘安装ap ...

  3. ase支持 urp不_urp管线的自学hlsl之路 第一篇 序言

    入坑unity学习已经有一年半了,shader很早就在用连连看学习和使用(lwrp hdrp的shadergraph和build in的ase).但是随着对于画质和效果的追求和提高,使用手写shade ...

  4. unity urp测试_测试Unity

    unity urp测试 It's been a fair while since we wrote a post about testing Unity, so we'd like to update ...

  5. mysql数据库支持的函数_数据库MySQL--常见函数

    函数:将一组逻辑语句封装在函数体中,对外暴露函数名 调用:select 函数名() from 表:(若用到表中的字段则家上'from 表') 函数分类:   1.单行函数(例:concate.leng ...

  6. Markdown 基础语法_粗体斜体

    Markdown 支持将字体设置为粗体或斜体. 粗体 Markdown 中,只要在文本的前后加两个 * 或者 _ 即可完成字体加粗. 语法: **要加粗的文本内容**或__要加粗的文本内容__ 渲染效 ...

  7. 广数系统u盘支持什么格式_支持转换50+种三维软件格式还能减面还是免费的,什么工具这么强大?...

    插件作者:Samuel T 当前版本:1.0.2 发布时间:2020.1.3 插件来源: https://sketchucation.com/pluginstore?pln=universal_imp ...

  8. python完全支持面向对象编程_[Python] 类与面向对象编程

    1. class语句 类通常是由函数.变量和属性组成的集合.使用class语句可以定义类,例如: class Account(object): num_accounts = 0 def __init_ ...

  9. bb10系统支持java吗_黑莓BB10怎么样 BlackBerry 10系统好用吗?

    曾几何时黑莓Blackberry OS是一款十分受用户欢迎的手机系统,不过随着手机系统市场已经被苹果iOS.谷歌安卓.微软Windows Phone三分天下,致使曾经的黑莓帝国逐渐沦陷,体验和性能都已 ...

最新文章

  1. 那些年我用过的SAP IDE
  2. 每天一个linux命令(27):linux chmod命令
  3. 获取VirtualBox COM对象失败,Unable to start the virtual device
  4. javaweb项目部署到tomcat之后java文件没有编译
  5. cygwin下使用gcc编译c可执行程序
  6. cloudwatch_将CloudWatch Logs与Cloudhub Mule集成
  7. Override Fuction 调用——到底使用的是谁的函数
  8. 面试题 04.03. 特定深度节点链表
  9. mysql只update不做修改_105岁老人抽烟喝酒不运动,长寿秘诀:只做4件事,不做1件事...
  10. 数据结构 - AVL木
  11. godaddy 安装 ssl
  12. loj #6122. 「网络流 24 题」航空路线问题
  13. java如何将json转换为数组_如何将JSON数组转换为普通Java数组?
  14. 专利申请--权利要求书vs说明书
  15. 19、【易混淆概念集】第十一章3 应急计划 VS 弹回计划 实施风险应对 监督风险
  16. 火狐浏览器“正在检查您的附件组件与Firefox此版本的兼容性” -- 解决方案
  17. 计算机有哪些交叉专业研究生,与理工科交叉的计算机专业考研方向有哪些?
  18. wps的linux文字显示模糊,wps电脑打开文字模糊怎么办
  19. 什么是实人认证?需要用到哪些api接口
  20. 或再被“转手”,家乐福中国还能“攀”上哪座靠山?

热门文章

  1. fatal error: cublas_v2.h
  2. fidder 打断点
  3. 微信公众号开发--微信JS-SDK分享到朋友圈和分享给朋友
  4. 主动保护——ACS汽车防撞安全保护器
  5. R语言输出csv文件乱码
  6. Android - JoystickView 虚拟手柄,控制盘,自定义UI
  7. 基于pointnet的3D物体分类和分割检测(复现不出来你直接敲我家门)
  8. 2020九月 京东大数据方向 Java 面试经验、面试题分享
  9. 31岁转行程序员 目前35了 分享一些我的经历和感受
  10. Dungeon Master--POJ 2251