为什么D3DCOLORtoUBYTE4将组件乘以255.001953f?

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

我编译了一个使用D3DCOLORtoUBYTE4内在的像素着色器,然后反编译。这是我发现的:

r0.xyzw = float4(255.001953,255.001953,255.001953,255.001953) * r0.zyxw;
o0.xyzw = (int4)r0.xyzw;

rgba-> bgra swizzle是预期的,但为什么它使用255.001953而不是255.0? Data Conversion Rules对应该发生的事情非常具体,它说:

从浮动比例转换为整数比例:c = c *(2 ^ n-1)。

windows direct3d hlsl direct3d11
1个回答
1
投票

简短的回答是:这只是内在定义的一部分。它在HLSL编译器的所有现代版本中都以这种方式实现。

255.0作为32位浮点数以二进制表示

0100`0011`0111`1111`0000`0000`0000`0000

作为32位浮点数的255.001953实际上表示为255.001953125,二进制是:

0100`0011`0111`1111`0000`0000`1000`0000

这种轻微偏差有助于特定情况,例如输入值为0.999999。如果我们使用255.0,你会得到254.使用255.001953你得到255.否则在大多数其他情况下,转换为整数(使用截断)后的答案会导致相同的答案。

关于浮点数here的一些有用和有趣的思考

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