添加 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.
在我看来,这就是发生的事情。您的整数列和行值被隐式转换为浮点数,这与浮点算术运算的结果不完全匹配。
如果你想正确地做到这一点,为什么不使用整型文字呢?显然,您正在使用整数数据,因为变量是列和行索引。
我的片段着色器出现奇怪的行为。
如果我分别测试 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.
在我看来,这就是发生的事情。您的整数列和行值被隐式转换为浮点数,这与浮点算术运算的结果不完全匹配。
如果你想正确地做到这一点,为什么不使用整型文字呢?显然,您正在使用整数数据,因为变量是列和行索引。