在HLSL中,我如何将0-1范围内的两个浮点数打包到一个具有最佳精度的浮点数中。这对于进一步压缩我的GBuffer非常有用。
答案 0 :(得分:2)
//Packing
float a = 0.45;
float b = 0.55;
uint aScaled = a * 0xFFFF;
uint bScaled = b * 0xFFFF;
uint abPacked = (aScaled << 16) | (bScaled & 0xFFFF);
float finalFloat = asfloat(abPacked);
//Unpacking
float inputFloat = finalFloat;
uint uintInput = asuint(inputFloat);
float aUnpacked = (uintInput >> 16) / 65535.0f;
float bUnpacked = (uintInput & 0xFFFF) / 65535.0f;
答案 1 :(得分:1)
将浮点数转换为定点整数是容易出错的想法,因为浮点覆盖的幅度要大得多。假设解压缩sRGB将为您提供pow(255,2.2)值,该值大于0xffff,并且您需要的数量是健壮HDR值的几倍。通常,定点代码非常脆弱,难以理解,并且是调试的噩梦。人们发明浮子的理由很充分。
有几种16位浮点格式。 IEEE 16位浮点数已针对-1.0到1.0之间的数字进行了优化,但也支持高达0x10000的数字,以防万一您需要HDR,因此仍然需要对其进行较大的浮点归一化,然后有bfloat16,其中行为就像普通的32位浮点数,只是精度较低。 IEEE 16位浮点数受现代CPU和GPU的广泛支持,即使在软件中也可以快速转换。 bfloat16刚刚开始流行,因此您必须研究它是否适合您的需求。最后,您可以使用整数对数函数介绍自己的16位浮点格式,大多数CPU将其作为一条指令提供。