Math HLSL舍入并不总是正确舍入

Math HLSL舍入并不总是正确舍入,math,shader,directx,hlsl,pixel-shader,Math,Shader,Directx,Hlsl,Pixel Shader,我正在尝试为Minecraft基岩版创建HLSL着色器。由于无法以合理的方式将我自己的数据传递给着色器,我使用颜色的红色通道来传递一个范围为0到60的变量。因此,我将该值除以60,并将其设置为红色通道 在着色器中,我将该值乘以60,并将其四舍五入到最接近的整数值。这就是问题所在。在大多数情况下,事情按它应该的方式运行,但在数字41(和其他一些,但我在这一个上进行了测试)的情况下,它被四舍五入到40 我根据创建了调试着色器,并显示了所有值。以下是计算所有值的代码: float4 display =

我正在尝试为Minecraft基岩版创建HLSL着色器。由于无法以合理的方式将我自己的数据传递给着色器,我使用颜色的红色通道来传递一个范围为0到60的变量。因此,我将该值除以60,并将其设置为红色通道

在着色器中,我将该值乘以60,并将其四舍五入到最接近的整数值。这就是问题所在。在大多数情况下,事情按它应该的方式运行,但在数字41(和其他一些,但我在这一个上进行了测试)的情况下,它被四舍五入到40

我根据创建了调试着色器,并显示了所有值。以下是计算所有值的代码:

float4 display = float4(0., 0., 0., 0.);
display.r = PSInput.color.r;
display.g = display.r * 60.;
display.b = round(display.r * 60.);
display.a = ((display.r * 60.) - floor(display.r * 60.)) >= 0.5 ? 1.0 : 0.0;
这些值的输出如下所示:


为什么round函数不将其四舍五入到41?根据,它应该返回“x参数,四舍五入到浮点类型中最接近的整数”

如果您想知道为什么
.r
是0.68235而不是更接近41/60=0.68333的值,那么可能是颜色属性以每通道8位的形式传入。所以它来自((41/60)*255)=174.25,四舍五入/截断为174。174/255=0.68235. 我不知道为什么
round
不能像预期的那样工作,它看起来确实像一个bug。Minecraft实际使用HLSL还是交叉编译成其他语言?也许翻译中丢失了什么?也许一个老套的解决方法是使用8位精度,而不是使用8位精度-尝试在量化时使用64位而不是60位。