HLSL-浮点数似乎返回了错误的值

问题描述 投票:-1回答:1

我一直在尝试将4个uint(8位)编码为一个浮点,以便我可以轻松地将它们与深度值一起存储在纹理中。我的代码无法正常工作,最终我发现问题归结为:

asuint(asfloat(uint(x)))在大多数情况下应返回x时返回0。

理论上,此代码应返回x(其中x是整数),因为x中的位被转换为浮点数,然后又返回uint,因此相同的位最终又被解释为uint。但是,我发现该函数似乎返回x的唯一情况是x的位被解释为非常大的浮点数。我考虑了这可能是图形驱动程序问题的可能性,因此我在两台不同的计算机上进行了尝试,并且在两台计算机上都遇到了相同的问题。

我测试了此代码的其他几种变体,所有这些变体似乎都能正常工作。

asfloat(asuint(float(x))) = x

asuint(asint(uint(x))) = x

asuint(uint(x)) = x

唯一不符合预期的情况是本文中提到的第一种情况。这是一个错误,还是我做错了什么?另外,此代码正在Unity内部的片段着色器中运行。

unity3d shader data-conversion hlsl
1个回答
0
投票

[经过长时间的搜索,我找到了某种答案,所以我想把它发布在这里,以防万一其他人偶然发现此问题。该代码不起作用的原因与浮点非规范化有关。 (我不完全理解。)无论如何,非规范化浮点数被asuint解释为0,因此非规范化浮点数的asuint始终为0。

[某种程度上可以接受的解决方案可以是(asuint(asfloat(x | 1073741824))&3221225471)] >>这样可以确保浮点数被标准化,但是它也会擦除第二位中存储的所有数据。如果有人有其他解决方案可以保留这一点,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.