如何将3个浮点数(空间矢量)打包成4个字节(像素)?

时间:2012-06-21 15:26:18

标签: graphics packing

我成功地使用[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个像素。它应该是喜欢一个“普通地图”,(但不完全是这样,你会在跳转后看到原因)

normal map

因此,每个像素代表一个3d空间矢量。在值非常红的情况下,法向量的方向大多为+ x(向右)。

当然,法线正常化。因此,它们不需要幅度(缩放)矢量。但我试图存储一个任意幅度的矢量,每个像素1个矢量。

因为纹理有 4 组件(rgba),所以我想在w组件中存储缩放矢量。

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

2 个答案:

答案 0 :(得分:0)

将数量存储在第4个组件中听起来非常合理。只要幅度受到合理而非完全任意的限制。

如果你想要一个更灵活的幅度范围,你可以在存储它时将标准化的方向向量预先乘以(0.5,1.0),当你打开它时,将它乘以pow(2,w)。

答案 1 :(得分:0)

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

您可以从HDR编码中寻找其他选项:here is a small list of few most popular