添加 breaks "if" 片段着色器中的语句

addition breaks "if" statement in fragment shader

我的片段着色器出现奇怪的行为。

如果我分别测试 3 个值,我的 "if" 语句会按预期通过并正确绘制绿色方块:

if(column == 324. && row == 616.*896. && slice == 31.*896.*896.){
  gl_FragColor = vec4(0., 1., 0., 1.);
}

如果我添加值并测试总和,"if" 语句不再按预期通过。它还以绿色绘制列 = 323 和 325 的正方形。

if(column + row + slice == 25439556.){
  gl_FragColor = vec4(0., 1., 0., 1.);
}

我知道这可能是某种精度问题,但我无法得到总和以正确传递 "if" 语句。

非常感谢任何帮助。

最好的, 尼古拉斯

== 更多关于我正在努力实现的目标 ==

我在纹理中存储了大量数据,然后我想访问这些数据。我通过索引(行+列+切片)访问这些数据。问题是,即使行、列和切片看起来正确,行+列+切片的总和也不正确。

因此,我访问数据的索引不正确。

在下面的例子中

if(column + row + slice == 25439556.){
  gl_FragColor = vec4(0., 1., (326. - column) / 3., 1.);
}

,第 323、324 和 325 列引用相同的索引(列 + 行 + 切片),即使列不同并且行和切片常量也是如此。您可以看到 "B" 通道的不同值,列是不同的。

不同的 if 条件按规定工作:

// WORKS
if(column == 324. && row + slice == 616.*896. + 31.*896.*896.)
if(column + row == 324. + 616.*896. && slice == 31.*896.*896.)

// DOESN't WORK
if(column + slice == 324. + 31.*896.*896. && row == 616.*896.)

我认为您尝试做的事情存在一个根本缺陷,即尝试直接比较浮点值。添加到数字末尾的点使其成为浮点数(请参阅 GLSL specification,第 32 页),所发生的情况正是您所期望的:有时比较通过,有时失败,具体取决于什么您相加和相乘的数字。

GLSL 规范第 39-40 页指出:

When performing implicit conversion for binary operators, there may be multiple data types to which the two operands can be converted. For example, when adding an int value to a uint value, both values can be implicitly converted to uint, float, and double. In such cases, a floating-point type is chosen if either operand has a floating-point type.

在我看来,这就是发生的事情。您的整数列和行值被隐式转换为浮点数,这与浮点算术运算的结果不完全匹配。

如果你想正确地做到这一点,为什么不使用整型文字呢?显然,您正在使用整数数据,因为变量是列和行索引。