为什么D3DCOLORtoUBYTE4将分量乘以255.001953f?

时间:2018-08-30 18:57:32

标签: windows direct3d hlsl direct3d11

我已经编译了使用D3DCOLORtoUBYTE4本征的像素着色器,然后反编译了。 这是我发现的:

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

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

  

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

1 个答案:

答案 0 :(得分:1)

简单的答案是:这只是内在定义的一部分。在所有现代版本的HLSL编译器中都采用了这种方式。

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

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

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

{{1}}

此轻微偏差在特定情况下会有所帮助,例如输入值为0.999999。如果使用255.0,则得到254。使用255.001953,则得到255。否则,在大多数其他情况下,转换为整数(使用截断)后的答案会以相同的方式得到相同的答案。

  

浮点数here上的一些有用且有趣的想法