Graphics 如何将3个浮点(空间向量)打包为4个字节(像素)?

Graphics 如何将3个浮点(空间向量)打包为4个字节(像素)?,graphics,packing,Graphics,Packing,我已经成功地使用[0,1]中的值打包了浮点数,并且没有损失太多的精度,使用了: byte packedVal = floatVal * 255.0f ; // [0,1] -> [0,255] 然后,当我想将packedVal解包回一个float时,我只需这样做 float unpacked = packedVal / 255.0f ; // [0,255] -> [0,1] 只要浮点数介于0和1之间,就可以正常工作 这才是真正的交易。我正在尝试将一个3d空间向量(包含3个flo

我已经成功地使用[0,1]中的值打包了浮点数,并且没有损失太多的精度,使用了:

byte packedVal = floatVal * 255.0f ; // [0,1] -> [0,255]
然后,当我想将packedVal解包回一个float时,我只需这样做

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个分量听起来非常合理。只要量值是合理的,而不是完全任意的


如果您想要更灵活的幅度范围,可以在存储归一化方向向量时将其预乘(0.5,1.0),然后在解包时将其乘以pow(2,w)。

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

您可以从HDR编码中查找其他选项: