kirin77 发表于 2022-6-23 18:26

unity URP AcesTonemapping 移动端优化

本文主要记录在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



防丢存图

stonstad 发表于 2022-6-23 18:26

实际上切到HDR的lut时,urp会把tonemapping整合到lut的生成里,uberpost里是没有acestonemapping的消耗的,切到HDR的Lut才是正解
页: [1]
查看完整版本: unity URP AcesTonemapping 移动端优化