我已经成功地将浮点数与 [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 字节像素颜色值的任何其他建议?