对于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
- 作者:Reguluz
- 链接:https://reguluz.site/article/hdr-rendertexture-data-compress
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。