我已经编译了使用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)。
答案 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上的一些有用且有趣的想法