额外休息"如果"片段着色器中的语句

时间:2015-08-14 08:58:56

标签: glsl webgl precision floating-accuracy fragment-shader

我在片段着色器中遇到了奇怪的行为。

如果我分别测试3个值,我的"如果"声明按预期传递并正确绘制绿色方块:

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

enter image description here

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

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

enter image description here

我知道这可能是某些精确问题,但我无法得到正确的通过"如果"言。

非常感谢任何帮助。

最佳, 尼古拉斯

==更多关于我想要实现的目标==

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

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

在以下示例中

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

enter image description here

,列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.)

1 个答案:

答案 0 :(得分:1)

我认为你要做的事情有一个根本的缺陷,就是试着直接比较浮点值。你添加到数字末尾的点使它成为一个浮点数(参见GLSL specification,第32页),会发生什么正是你所期望的:有时比较通过,有时会失败,取决于什么你添加并相乘的数字。

GLSL规范第39-40页规定:

  

当对二元运算符执行隐式转换时,可能存在多种数据类型   可以转换两个操作数。例如,将int值添加到uint值时,两个值都可以   隐式转换为uint,float和double。在这种情况下,如果有的话,选择浮点类型   操作数具有浮点类型

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

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