当前位置: 首页 > news >正文

[自学记录09*]关于模糊效果降采样优化性能的小实验

一、降采样在模糊中的优化

这两天接手了几个高度定制化的模糊,包括不限于放射和旋转状的径向模糊,移轴模糊,景深的散景模糊等等,这些效果在游戏中非常常见。

其实模糊的原理都差不多,无非就是对UV偏移后重新采样再求平均。

这里面最费的自然是对整张屏幕的RT采样。询问了一圈,貌似如果在低端机上采样8次就已经算非常非常高了。

那就不得不搬出一个常见的优化手段,那就是降采样。

关于降采样还有一点,在径向模糊,景深等效果中,并不是使整个屏幕的画面全部模糊,一般来说会有一段距离/一个区域是保持清晰的。(如角色释放技能,以击中点为圆心的四周一定半径范围内都是清晰的,而超出范围距离越多模糊越强烈)。

如果单纯的降采样,周围模糊的区域分辨率低又模糊了不会产生太大影响。但中间清晰的区域被降采样之后,效果会有很大折扣,这个折扣会随降采样次数增加。

所以常见的办法是渲染一张原图,再渲染一张降采样的模糊图,然后用模糊强度(以景深为例,模糊强度的插值因子就是那张做了step得到的焦距深度图)去和原图进行插值。这样没有模糊的地方就是没有被降采样的地方,效果不会变,而模糊的地方即使降采样了也不会很影响。

 

 

1.测试

由于测试机器是3060ti,加上场景压力不大,所以参数调的变态一点,先不降采样,分辨率调成4K,模糊采样2000次,可以看到,平均FPS只有10。

(1) 2 Pass,插值,无降采样,采样次数:2000

该场景分为2个Pass,先渲染一遍原分辨率的原图,然后对原图进行模糊,接着在原图和模糊的图之间进行插值。可以说是最耗,且最没有意义的测试了,因为如果不降采样没必要去多申请一张纹理再插值,当然,这部分我们后面再说。

979a5e4522888663f8c233c20f11527b.png

(2) 2 Pass,插值,降采样/8,采样次数:2000

OK,我们还是用刚才的场景,这次我们开启降采样,调为8,其它参数不变,让我们来看看。

59d29a7e3665f673211091bf0f037be2.png

FPS涨幅非常夸张,翻了40倍。当然,因为降采样/8,采样的纹理大小是原来的64分之一,也就是比原来可以多采63张图。当然这里的涨幅这么变态的原因可能是因为瓶颈就是采样次数,因为场景本身复杂度并不高。在实际项目中可能不会有如此夸张的涨幅。

 

还有一点,两张图的效果明显差距很大,这是降采样带来的画面折扣,但其实不用太担心,因为我们的采样次数是2000,所以才会出现这种情况,在16采样的情况下,其实两幅画面差距不是特别明显,如下两幅图所示。

218deeef6fbb17362dbc700bf06c60d9.png

16次RT采样,降采样/8

37ab91f649fd88259914a09d819d6115.png

16次RT采样,无降采样

某种意义上来说,降采样参数完全可以当模糊半径参数使用了。反正对清晰的部分没有影响。

 

二、先降采样再模糊or先模糊再降采样

 

1.DOF测试

我们前面的操作的顺序是这样的:

  1. 先把相机存储在一张降了分辨率的RT上。

  2. 对该降了分辨率的RT进行模糊

  3. 把该RT和相机之间插值,返回相机。

在自己亲手操刀之前查过一些资料,他们有些的顺序是这样:

  1. 先把相机以原分辨率存到一张RT上

  2. 把该RT模糊,然后存到一张降采样RT上

  3. 把降采样并且模糊了的RT和原分辨率的RT插值

  4. 返回相机

中间一些申请纹理等等操作当然可以优化的更简练一些。

但这不是重点,而是先模糊还是先降采样这个问题。我们在一、中做的实验的顺序是先降采样再模糊,所以帧数涨的才这么多,但是如果按照网上的一些资料先模糊再降采样呢?

f9708b7160c35cb08e508cefaf0b7ace.png

其他参数都不变,仍然是4K分辨率,2000次采样,降采样/8,2 Pass,插值。

唯一区别是这次是先模糊,再降采样。可以看到,是有“提升”的,从10帧到50帧,但这是提升吗?别忘了我们最初的最初在没考虑优化和效果的时候 1个 Pass就可以完成这个效果,而10FPS那个场景是有不必要的申请纹理和插值的消耗的,所以那个结果不应该拿来和这个对比。

 

 

我们重新写一个DOF的景深效果,这次我们不考虑任何优化的事情,1个Pass,4K分辨率,插值,不降采样。

0214228c8554df017d8b92c1435fb73d.png

可以看到,换成单Pass以后从10FPS变到了12FPS,提升2%左右,很好想,既然怎么弄都要插值,那最后采样的模糊图肯定越小越好,那也就很好想了。

先降采样再模糊:这种顺序会节省模糊操作的消耗,同时也会节省插值前采样模糊图的消耗。

先模糊再降采样:这种顺序只是单纯的节省了插值前采样模糊图的消耗。

 

 

但是这里仍然有一个问题,那就是DOF这个效果的特殊性,这个东西无论做成单Pass还是双Pass都需要用那张深度去插值,所以实际上插值的操作我们并没有省掉,我们换一个效果继续测试,这次我们换成放射状的径向模糊。

 

2.径向模糊测试

首先,先看一下,单Pass,无插值,采样2000次,无降采样。大概15,16FPS这样子。

1457c042d73f12e172341819cdfaedab.png

单Pass,无插值,采样2000次,无降采样

 

 

然后是,双Pass,插值,采样2000次,降采样8次,先降采样再模糊。大概400FPS。

464e6ba4285f25d6aeca54f790481c14.png

双Pass,插值,采样2000次,降采样8次,先降采样再模糊

 

 

最后,双Pass,插值,采样2000次,降采样8次,先模糊再降采样。大概100FPS。

c96e333d46e12db28ca5ae76cfd1ff09.png

双Pass,插值,采样2000次,降采样8次,先模糊再降采样

 

可以看到,与我们前面的猜测差不多。

 

 

三、结论

  1. 无论降采样的顺序如何,它都会降低开销

  2. 先模糊再降采样降低消耗相对来说较少,因为它只节省了插值那步采样的消耗

  3. 先降采样再模糊降低消耗相对来说较多,因为它节省的是每次模糊的采样消耗,采样循环次数越多,节省越明显。

 

由于本人刚刚开始实习,这也算是开始工作进入项目后负责的第二个问题吧,研究了两三天,写出这篇测试小实验的文章分享一下自己的小发现,大佬就当看个乐就得了,也主要是记录使用。总之研究完之后感悟还挺身的吧,在项目中的工作心态和之前自己写demo的心态也完全不一样,希望未来能赶上前辈们的脚步,共勉。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【异常】npm install 出错几种解决方案
  • Git 的基本概念和使用方式。
  • 期权价格的奥秘:深入理解影响因素
  • C++入门基础知识(笔记):静态成员函数,所有对象共享同一个函数静态成员函数只能访问成员变量,类外访问不到私有静态成员函数
  • 河南萌新(2024)(河南农业大学)(旅途的终点)
  • 爬虫入门--了解相关工具
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • 密码学基础:搞懂Hash函数SHA1、SHA-2、SHA3(1)
  • Golang | Leetcode Golang题解之第328题奇偶链表
  • 汽车测试,引领国际
  • [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测
  • C语言实现游戏2048(超详细!!!超易懂!!!)
  • 中职云计算实训室
  • 《密码编码学与网络安全原理与实践》第三章 传统加密技术
  • Tomcat启动控制台乱码解决方案
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 10个最佳ES6特性 ES7与ES8的特性
  • javascript 总结(常用工具类的封装)
  • java取消线程实例
  • Linux中的硬链接与软链接
  • Meteor的表单提交:Form
  • Spring-boot 启动时碰到的错误
  • spring学习第二天
  • XForms - 更强大的Form
  • Xmanager 远程桌面 CentOS 7
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 计算机常识 - 收藏集 - 掘金
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 使用 @font-face
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (21)起落架/可伸缩相机支架
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (离散数学)逻辑连接词
  • (六)激光线扫描-三维重建
  • (论文阅读11/100)Fast R-CNN
  • (一)SvelteKit教程:hello world
  • (转)平衡树
  • (转)树状数组
  • **PHP分步表单提交思路(分页表单提交)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core 项目指定SDK版本
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .Net mvc总结
  • .net 验证控件和javaScript的冲突问题
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @ModelAttribute使用详解
  • [Android View] 可绘制形状 (Shape Xml)
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽
  • [Day 26] 區塊鏈與人工智能的聯動應用:理論、技術與實踐