【发布时间】:2013-12-23 22:49:58
【问题描述】:
我已经阅读了几个讨论在一个浮点数中存储 2 或 3 个浮点数的链接。这是一个例子:
Storing two float values in a single float variable
还有一个:
还有一个:
decode rgb value to single float without bit-shift in glsl
我见过其他人,但他们都使用相同的原则。如果要对 x 和 y 进行编码,它们会将 y 乘以某个因子,然后将 x 添加到其中。好吧,这在纸上是这样,但我不明白它在存储为浮点值时如何工作。浮点值只有 7 位有效数字。如果将大数和小数相加,则小数只会被截断并丢失。精度只显示大数的值。
由于似乎每个人都开出相同的方法,所以我自己尝试了一下,结果完全符合我的想法。当我解码这些数字时,没有相乘的数字变成了 0.0。它完全丢失在编码的浮点数中。
这是我尝试测试的一些 MaxScript 示例:
cp = 256.0 * 256.0
scaleFac = 16777215
for i = 1 to 20 do (
for j = 1 to 20 do (
x = (i as float / 20.01f) as float;
y = (j as float / 20.01f) as float;
xScaled = x * scaleFac;
yScaled = y * scaleFac;
f = (xScaled + yScaled * cp) as float
print ("x[" + xScaled as string + "] y[" + yScaled as string + "]" + " e[" + f as string + "]")
dy = floor(f / cp)
dx = (f - dy * cp)
print ("x[" + dx as string + "] y[" + dy as string + "]" + " e[" + f as string + "]")
)
)
dx 每次都是 0.0。任何人都可以对此有所了解吗?注意:我是否使 cp = 128、256、512 或其他任何值都没有关系。它仍然给我相同类型的结果。
【问题讨论】:
-
这纯粹是一种学术练习,还是您真的希望从中获得一些价值?
-
这不是学术性的。我试图弄清楚如何合法地将两个花车打包成一个。如果您查看任何链接,您会看到其他人显示类似的代码并声称它工作正常,但我对它如何实际工作感到困惑。我自己似乎无法让它工作。也许我在自己的实现中一直遗漏一些数学错误,但它背后的整个理论似乎并不应该奏效。
-
如果我有时间,我会详细查看这些链接。但是,如果我在你的鞋子里,我不会用十英尺长的杆子碰它。我有
Tuple<float, float>将两个浮点数存储在一个值中。 -
这是一个实时渲染限制问题。我需要将要解码的数据打包到顶点着色器中。其他人在现实世界的应用程序中也做过同样的事情。当你让它工作时,它非常实用。
标签: c# c++ encoding floating-point glsl