type
Post
status
Published
date
Mar 21, 2023
slug
hdr-rendertexture-data-compress
summary
当HDR RT无法使用时,如果存储数据到LDR中
tags
category
技术分享
icon
password
对于Bloom与Godray等需要在后处理中使用颜色超过1的数据进行操作的后处理,理论上需要HDR格式的RT进行数据传递。然而在实际项目中HDR与非HDR格式RT反复创建会产生过量的RT内存分配。如果HDR RT与LDR RT能够进行复用则会降低不少RT内存的开销。因此在视觉上可接受的范围内,可以考虑对HDR数据进行压缩存储至LDR格式的RT中。
  • 首先需要制定亮度上限。由于最大亮度不是定值,需要对实际亮度有一个预估。我认为通常RT内颜色数据亮度不会超过10。因此将亮度上限limit设置为10
  • 由于后处理一般只对颜色进行处理,因此可以使用alpha通道进行一些特殊数据的存储。这时就可以用LDR RT 的alpha通道存储亮度
  • 先让HDR的RGB通道计算三通道总体亮度luminanceRGB。在LDR RT中使用colorRGB/luminanceRGB的方式存储去亮度后的色相
  • 然后对于luminanceRGB,其必然有相当量的数据超过1,但是不应超过最开始设置的理论亮度上限limit。因此使用luminanceRGB/limit值作为重映射后的亮度值remapLuminance。这个值必然是在0~1之间
  • 由于亮度信息是基于RGB数据得出的,因此亮度信息是经过gamma矫正的结果。而alpha在Unity中是线性存储的(一般贴图就算勾选sRGB,其alpha通道仍然是线性存储的)。因此在上述remapLuminance计算之后,需要对这个数据进行一次gamma操作
  • URP已经做了Fallback操作,在PostProcessPass搜索m_UseRGBM
 
 
优化FrameBuffer Resolve关于带宽