我在片段着色器中遇到了奇怪的行为。
如果我分别测试3个值,我的"如果"声明按预期传递并正确绘制绿色方块:
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(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.)
答案 0 :(得分:1)
我认为你要做的事情有一个根本的缺陷,就是试着直接比较浮点值。你添加到数字末尾的点使它成为一个浮点数(参见GLSL specification,第32页),会发生什么正是你所期望的:有时比较通过,有时会失败,取决于什么你添加并相乘的数字。
GLSL规范第39-40页规定:
当对二元运算符执行隐式转换时,可能存在多种数据类型 可以转换两个操作数。例如,将int值添加到uint值时,两个值都可以 隐式转换为uint,float和double。在这种情况下,如果有的话,选择浮点类型 操作数具有浮点类型。
在我看来,这就是发生的事情。您的整数列和行值被隐式转换为浮点数,浮点数与浮点算术运算的结果不完全匹配。
如果你想正确地做,为什么不使用整数文字?显然,您正在处理整数数据,因为变量是列和行索引。