我正在编写一个着色器(HLSL),我需要将一个颜色值打包成 R32 格式。我找到了将浮点数打包成 R8G8B8A8 格式的各种代码,但它们似乎都没有反向工作。我的目标是 SM3.0,所以(afaik)位操作不是一个选项。
总结一下,我需要能够做到这一点:
float4 color = ...; // Where color ranges from 0 -> 1
float packedValue = pack(color);
有人知道怎么做吗?
更新
我已经取得了一些进展......也许这将有助于澄清这个问题。
我的临时解决方案是这样的:
const int PRECISION = 64;
float4 unpack(float value)
{
float4 color;
color.a = value % PRECISION;
value = floor(value / PRECISION);
color.b = value % PRECISION;
value = floor(value / PRECISION);
color.g = value % PRECISION;
value = floor(value / PRECISION);
color.r = value;
return color / (PRECISION - 1);
}
float pack(float4 color)
{
int4 iVal = floor(color * (PRECISION - 1));
float output = 0;
output += iVal.r * PRECISION * PRECISION * PRECISION;
output += iVal.g * PRECISION * PRECISION;
output += iVal.b * PRECISION;
output += iVal.a;
return output;
}
我基本上......假装我正在使用整数类型:s
通过猜测和检查,64 是我可以使用的最高数字,同时仍保持 [0...1] 范围。不幸的是,这也意味着我失去了一些精度——6位而不是8位。