Untiy 推出SRP 已经接近一年了,其中官方宣称 LWRP 在2018年年底时已经处于 production ready 既随时可以做产品了,于是改名为URP, 不过 HDRP 还需要2019.4 的到来才能到达完整版。 不过在我看来 URP 还不能说是 production ready 还处于玩具阶段。而且有时候觉得Unity官方对于技术路线偶尔会出现不明确,左右摇摆的情况。比如Unity 2018 新出的Camera.AddCommandBuffer 来做自定义渲染, 这在 Unity 2019 被废除了,取而代之使用 Render Feature /ScriptableRenderPass 来实现,不过这东西也处于实验阶段。

SRP不做任何修改是否可以直接提高项目性能,答案是可以直接减少CPU给GPU准备阶段的性能大约10%左右。无法直接提升GPU的渲染性能,对于不使用任何光照的项目且处于Opengl ES2.0 这类低端机,基本没有任何GPU性能提升。

以目前使用的SRP 有大量Bug 举两个例子

1. [In order to call GetTransformInfoExpectUpToDate, RendererUpdateManager.UpdateAll must be called first.] 莫名的内置渲染错误,无法自己修改。

官方Issue链接

https://issuetracker.unity3d.com/issues/errors-message-at-editor-play?_ga=2.202176470.695125147.1571176891-1511937231.1511185188

2. 使用渲染指令Blit 后,会导致RenderTarget 无法自动恢复原始RenderTarget,需要手动还原SetRenderTarget,这个在之前的CommandBuffer 里都不曾遇到

在项目中期切换到SRP可以直接优化的地方

1.相机Culling优化

https://connect.unity.com/p/unityzhi-zuo-ren-zhuan-chang-unity-aaayou-xi-shen-du-you-hua-zhu-ti-yan-jiang

根据官方优化参考,使用SRP后,可以控制相机 Culling(裁剪)行为,对于项目中有自己实现基于投影器Projector的阴影相机可以复用主相机的 Culling结果, 对于UI上模型RT相机可以不做任何Culling

2.相机 Stack 优化

SRP废弃了多个相机的实现,无法再使用多个相机 (比如我们项目1个GamePlay, 1个HUD, 1个UI相机的。使用官方SRP模板,UI相机背景色会盖住场景内容),原因为

如果只使用1个相机,渲染结果可以直接写入BackBuffer

如果有多个相机,由于第二个相机需要第一个相机结果填充画布后再渲染,因此至少需要一张RenderTexture的临时缓冲,且还需要针对不同的Viewport做裁剪等等,写入backBuffer的时机也会延迟

官方文档废弃Camera Stack原因

https://docs.google.com/document/d/1GDePoHGMngJ-S0Da0Fi0Ky8jPxYkQD5AkVFnoxlknUY/edit

3.UI OverDraw 优化

使用同一个相机绘制UI后,可以考虑给UI添加模板测试,将UI挡住场景的部分,场景可以不被绘制到。

4.UI 批次合并(Opengl 3.0+ Unity2019.2+ with SRP Batcher)

对于场景特效类,基本都无缘SRP batcher 他对Cbuffer的容量有限制

对于UI如果全局自定义Shader可以使用 SRP Batcher 不过目前还是实验阶段。

最后来说下 Camera.AddCommandBuffer 这个功能在 Unity 2019 替换为 ScriptableRenderPass 后如何实现一个XRay

使用 CommandBuffer时仅仅需要 camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, m_XRayBuffer);

然后再XRayBuffer.drawRenderer(renderer, XrayMat)即可

在2019里 需要创建XrayRenderPassFeature 类来实现

public class XRayRenderPassFeature : ScriptableRendererFeature

ScriptableRendererFeature有2个接口要实现分为

Creata() 创建一个实现具体Xray Pass的接口

AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) 将创角的pass 添加进renderer 队列

在XRayRenderPassFeature 里实现一个 CustomRenderPass : ScriptableRenderPass 来编写具体Xray逻辑

Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) 准备阶段

Execute(ScriptableRenderContext context, ref RenderingData renderingData) 渲染阶段

FrameCleanup(CommandBuffer cmd) 清理阶段

基本实现都在Configure里

if (null != m_xrayMaterial)
{CommandBuffer xraycmd = CommandBufferPool.Get(m_profilerTag);xraycmd.DrawMesh(m_drawMesh, m_xrayTarget.transform.localToWorldMatrix, m_xrayMaterial);context.ExecuteCommandBuffer(xraycmd);CommandBufferPool.Release(xraycmd);
}

大致流程是,Renderer 会根据 pass 的 renderPassEvent 进行和内置其他pass 比如天空盒,点光,深度 等等其他pass 一起sort, 之后分别在渲染前,渲染,渲染后调用接口

以官方的SRP FPS Demo 基础来实现XRay

git: https://github.com/Unity-Technologies/UniversalRenderingExamples

1.在FpsSetup 预制体里添加刚刚创建的Feature

2.编写一个简单ZTest Greater的Shader 用来绘制被遮挡的部分

Shader "Unlit/XrayShader"
{SubShader{Tags { "RenderType"="Opaque" "LightMode"="LightweightForward" }LOD 100Pass{ZTest greateroffset -1,-1HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/core.hlsl"struct appdata{float4 vertex : POSITION;};struct v2f{float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);return o;}float4 frag (v2f i) : SV_Target{return float4(1,0,0,1);}ENDHLSL}}
}

3.在场景中放置一个示例Cube,取名为XRayTarget

最后运行游戏

Cube被遮挡的部分被绘制为红色

最后 使用自定义 ScriptableRendererFeature 的话,还需要自己编写对应的Editor代码,比之前繁琐许多。

如果自己来编写SRP的话,RenderPassFeature 需要自己维护pass列表来实现, 也可以仅仅去实现自定义的ForwardRenderer,可以减少很多功能的重复造轮子。

unity两个项目合并 同名_从实际项目升级中关于 Unity SRP 的一些评测相关推荐

  1. unity两个项目合并 同名_表格合并,你还在复制粘贴?教你一键合并,超简单!...

    当我们有多个表格的内容需要合并到一个表格中,很多人会采取复制粘贴的方式. 表格数量少时可能影响不大,数量多了,[表格合并]功能就会大显神威. 下面教大家如何快速完成多表格合并. 温馨提示:如果图片用手 ...

  2. 两个listmap合并去重_我是如何用单机实现亿级规模题库去重的?

    题外话:欢迎将公众号设置为星标,技术文章第一时间看到.我们将一如既往精选技术好文,提供有价值的阅读.如有读者想要投稿,可以在公众号任意文章下留言,技术博主奖励丰厚. 作者:haolujun cnblo ...

  3. 两个listmap合并去重_单机亿级规模题库去重,如果是你会怎么做?

    作者:haolujun原文:https://www.cnblogs.com/haolujun/p/8399275.html 背景 最近工作中遇到了一个问题:如何对大规模题库去重?公司经过多年的积累,有 ...

  4. 开源项目是什么_在开源项目之前要了解什么

    开源项目是什么 贵公司将内部项目作为开源发布. 恭喜你! 您知道您的代码已经准备就绪,但是您准备好承担所有新职责吗? 项目作为开源发布后,您的公司不仅要对该项目负责,而且还要对将围绕该项目形成的社区负 ...

  5. 3项目估算表_浮动油封生产项目可行性研究报告

    浮动油封生产项目可行性研究报告 项目名称:浮动油封生产项目 项目投资额:22000.00 万元 项目建设性质:新建项目 项目所属行业:制造业 - 通用设备制造业 - 通用零部件制造 - 其他通用零部件 ...

  6. 第一次做项目经理总结_干货:项目结束后,哪些经验教训要总结?

    正所谓"前事不忘后事之师",经验教训总结是项目管理中最重要的环节之一,它不仅可以让项目经理得到更好的成长,更是为后来的新项目开展提供了借鉴参考资料. 成功的项目总结经验.失败的项目 ...

  7. 两封邮件合并转发_用Python发送自定义电子邮件

    电子邮件仍然是生活中的一个事实.尽管存在各种缺陷,但它仍然是向大多数人发送信息的最佳方式,尤其是以允许消息排队等待收件人的自动化方式. 我的工作重点之一是Feddora社区行动和影响协调员给人们一个关 ...

  8. 两封邮件合并转发_卖家直呼!低价订单过多,listing合并竟被亚马逊封号!

    更多文章,百度或 文末扫码入群,对接跨境资源  你的关注和转发,是我们坚持的动力 马逊平台,为了规范卖家运营,平台并不允许一个店铺多账号运营的情况.但近年来,不少卖家察觉亚马逊对多账号运营,似乎要求并 ...

  9. 两个列表合并去重_把两个pdf合并成一个如何解决?

    PDF文件在我们日常工作中使用的越来越多了,所有不可避免的我们会遇到要将多个PDF文件合并成为一个文件的情况,那么如何将两个PDF文件进行合并呢?可能大家都想要了解一下! 对于PDF文件这个问题,这里 ...

最新文章

  1. 如何实现分享链接到微信朋友圈时显示自定义LOGO以及名称介绍
  2. 使用win32 API 下载文件
  3. boost::hana::detail::wrong用法的测试程序
  4. 关于fragment backstate的运用
  5. 测试基础【第二篇】软件测试模型
  6. 每个时代都有每个时代的风口
  7. win10 pin码如何设置
  8. Python虚拟机之if控制流(一)
  9. excel几个数相加等于某个数_『excel表如何从一列数据中筛选出合计等于某数的某些数?』...
  10. pm8060raid卡命令
  11. 安装Vista与XP双系统后如何做好备份
  12. BIOS设置中功能的翻译及介绍
  13. 资源管理器 右键 反应慢 现象解决方案
  14. 约瑟夫环问题:有n个人围成一圈,顺序编号。从第1个人开始报数(从1-3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?
  15. 【期望】几何分布的期望
  16. iOS开发 --- AlipaySDK接入(version:15.6.4 motify:2019.06.11)
  17. 小说作者推荐:休屠城合集
  18. 苹果开放降级通道_iOS 12.2的验证通道已关闭,两款机型可降级!
  19. 【JavaWeb学习】JavaScript(基础)
  20. 读IC封装基础与工程设计实例记录一

热门文章

  1. 华为oj平台的新网址
  2. ARM1176JZF-S/S3C6410 内存地址转换
  3. 第十五章 五虎上将中谁最冷血
  4. apache 虚拟主机如何配置
  5. python字符串、元组常用操作
  6. zabbix 安装使用
  7. Codeforces 486D. Valid Sets
  8. 基于指令和混合的前端通用埋点方案
  9. POJ 3320 Jessica's Reading Problem (尺取)
  10. Java Web开发中路径问题小结