0

我已经成功地将浮点数与 [0,1] 中的值打包在一起,而不会使用以下方法丢失太多精度:

byte packedVal = floatVal * 255.0f ; // [0,1] -> [0,255]

然后,当我想将packedVal 解压成一个浮点数时,我只需要做

float unpacked = packedVal / 255.0f ; // [0,255] -> [0,1]

只要浮点数介于 0 和 1 之间,它就可以正常工作。

现在这是真正的交易。我正在尝试将 3d 空间向量(包含 3 个float组件)转换为 4 个字节。我这样做的原因是因为我使用纹理来存储这些向量,每个向量有 1 个像素。它应该类似于“法线贴图”,(但不完全是这个,你会在跳转后看到为什么)

法线贴图

因此,每个像素代表一个 3d 空间向量。在值非常红的地方,法线向量的方向主要是 +x(向右)。

所以当然,法线是标准化的。因此它们不需要幅度(缩放)向量。但我试图存储一个具有任意大小的向量,每个像素 1 个向量。

因为纹理有4 个分量(rgba),所以我正在考虑在 w 分量中存储一个缩放向量。

将任意大小的 3 空间向量(比如 x、y、z 的大小上限为 200 左右)打包成 4 字节像素颜色值的任何其他建议?

4

2 回答 2

0

这种方法用于存储高动态范围的图像 - RGBM 编码(M 代表幅度)。它的缺点之一是插值结果错误,因此您不能对纹理使用双线性过滤。

您可以从 HDR 编码中寻找其他选项:这里是一些最受欢迎的小列表

于 2014-07-15T18:57:48.740 回答
0

Storing the magnitude in the 4th component sounds very reasonable. As long as the magnitude is bounded to something reasonable and not completely arbitrary.

If you want a more flexible range of magnitudes you can pre-multiply the normalized direction vector by (0.5, 1.0] when you store it, and when you unpack it multiply it by pow(2, w).

于 2012-07-09T13:13:35.057 回答