ase支持 urp不_粗见URP
可编程渲染管线(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相关推荐
- 魔百盒CM201-1、CM211-1朝歌ZG_支持UWE5621WiFi驱动_免拆卡刷固件包
魔百盒CM201-1.CM211-1朝歌ZG_支持UWE5621WiFi驱动_免拆卡刷固件包 图片 刷机方法: 把下载的刷机包文件解压一次,复制到U盘根目录!update.zip升级包不能解压,原原本 ...
- 创维E900V21E/E900V22E_S905L3B/S905L2B通刷_支持5621DS无线_完美语音线刷固件
创维E900V21E/E900V22E_S905L3B/S905L2B通刷_支持5621DS无线_完美语音线刷固件 固件特点: 1.修改dns,三网通用: 2.开放原厂固件屏蔽的市场安装和u盘安装ap ...
- ase支持 urp不_urp管线的自学hlsl之路 第一篇 序言
入坑unity学习已经有一年半了,shader很早就在用连连看学习和使用(lwrp hdrp的shadergraph和build in的ase).但是随着对于画质和效果的追求和提高,使用手写shade ...
- 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 ...
- mysql数据库支持的函数_数据库MySQL--常见函数
函数:将一组逻辑语句封装在函数体中,对外暴露函数名 调用:select 函数名() from 表:(若用到表中的字段则家上'from 表') 函数分类: 1.单行函数(例:concate.leng ...
- Markdown 基础语法_粗体斜体
Markdown 支持将字体设置为粗体或斜体. 粗体 Markdown 中,只要在文本的前后加两个 * 或者 _ 即可完成字体加粗. 语法: **要加粗的文本内容**或__要加粗的文本内容__ 渲染效 ...
- 广数系统u盘支持什么格式_支持转换50+种三维软件格式还能减面还是免费的,什么工具这么强大?...
插件作者:Samuel T 当前版本:1.0.2 发布时间:2020.1.3 插件来源: https://sketchucation.com/pluginstore?pln=universal_imp ...
- python完全支持面向对象编程_[Python] 类与面向对象编程
1. class语句 类通常是由函数.变量和属性组成的集合.使用class语句可以定义类,例如: class Account(object): num_accounts = 0 def __init_ ...
- bb10系统支持java吗_黑莓BB10怎么样 BlackBerry 10系统好用吗?
曾几何时黑莓Blackberry OS是一款十分受用户欢迎的手机系统,不过随着手机系统市场已经被苹果iOS.谷歌安卓.微软Windows Phone三分天下,致使曾经的黑莓帝国逐渐沦陷,体验和性能都已 ...
最新文章
- 那些年我用过的SAP IDE
- 每天一个linux命令(27):linux chmod命令
- 获取VirtualBox COM对象失败,Unable to start the virtual device
- javaweb项目部署到tomcat之后java文件没有编译
- cygwin下使用gcc编译c可执行程序
- cloudwatch_将CloudWatch Logs与Cloudhub Mule集成
- Override Fuction 调用——到底使用的是谁的函数
- 面试题 04.03. 特定深度节点链表
- mysql只update不做修改_105岁老人抽烟喝酒不运动,长寿秘诀:只做4件事,不做1件事...
- 数据结构 - AVL木
- godaddy 安装 ssl
- loj #6122. 「网络流 24 题」航空路线问题
- java如何将json转换为数组_如何将JSON数组转换为普通Java数组?
- 专利申请--权利要求书vs说明书
- 19、【易混淆概念集】第十一章3 应急计划 VS 弹回计划 实施风险应对 监督风险
- 火狐浏览器“正在检查您的附件组件与Firefox此版本的兼容性” -- 解决方案
- 计算机有哪些交叉专业研究生,与理工科交叉的计算机专业考研方向有哪些?
- wps的linux文字显示模糊,wps电脑打开文字模糊怎么办
- 什么是实人认证?需要用到哪些api接口
- 或再被“转手”,家乐福中国还能“攀”上哪座靠山?