|
本文主要记录在urp下对移动端的AcesTonemapping性能优化,文中的测试数据来自vivo x5 打包实测。
如果只看结果的客官可直接跳到最后。
看看原生的AcesTonemapping,真机测试AcesTonemapping的消耗是有8ms的开销,而目标消耗是1ms。
原生的ACES
关于AcesTonemapping的原理及实现不做过多的介绍,网上也有很多相关的资料可以自行查阅,下面是一些相关的大佬的分享
Tone Mapping---色调映射算法
叛逆者:Tone mapping进化论
Un1ess瞳:unity ColorGrade后处理与SP LUT的同步探索
进到管线代码中,找到ApplyColorGrading()函数,这个是整个tonemap的入口函数。里面分别由HDR和LDR,先对LDR进行优化,所以先不考虑HDR的相关,优化思路和步骤是类似或者一样的。
顺便提一下,这里切换DHR跟LDR是在管线上面后处理选项中切换的。
切换DHR跟LDR
进到LDR的部分主要是三部分的操作,1.tonemap的计算,2.用户自定义LUT,3.LUT的应用。真机打包测试下来,ApplyTonemap()函数是开销最高的地方,因为项目没有自定义的LUT,所以自定义部分直接给干掉了。LUT的应用测下来基本是没有开销的。
LDR的主要代码块
跳到函数ApplyTonemap()中,只有两句,再继续排查发现只有三处会对效果产生影响。
而实际消耗搞的是在用矩阵对图片进行操作。最后排查下来就只保留了ACES的基本算法
对红通道进行的操作
ACES基本的算法
颜色空间的转换
优化后的效果,虽然效率是达到了1ms的消耗目标,但是跟原始的效果比较会发现,比原来的效果暗一点也偏红一点.这显然是达不到优化目的的.
比原来的更暗更红了
后面经过图形大佬的提点,在网站上发现了一个大佬写的ACES的算法,就直接搬过来了,没想到想过挺好,消耗也低.还是之前的1ms.(虽然对比原始的饱和度略有降低,但是在可接受的范围内)
代码插入的地方
前后效果基本一致,就是饱和度略微降低了,在可接受范围内
附大佬的算法(实际上就是吧所有的空间变换都拟合成了一个矩阵,省去了中间的消耗):https://github.com/Unity-Technologies/PostProcessing/blob/v2/PostProcessing/Shaders/ACE
防丢存图 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|