Glsl max(A,B)应该始终返回A还是B?

Glsl max(A,B)应该始终返回A还是B?,glsl,webgl,google-chrome-os,Glsl,Webgl,Google Chrome Os,在我的GLSL程序中,我有一个函数,用于检查vec2的每个组件是否介于0和1之间: bool in01(vec2 c) { return max(vec2(0.0,0.0), min(vec2(1.0,1.0), c)) == c; } 它在许多设备上都能很好地工作,直到我在宏碁Chromebook R13和联发科M8173C(在浏览器的WebGL中)上试用过它。在那个设备上,似乎max(A,B)可以返回一个既不是A也不是B的值。所以我通过使用函数修复了这个问题,该函数接受向量将对

在我的GLSL程序中,我有一个函数,用于检查vec2的每个组件是否介于0和1之间:

bool in01(vec2 c) { 
    return max(vec2(0.0,0.0), min(vec2(1.0,1.0), c)) == c; 
}

它在许多设备上都能很好地工作,直到我在宏碁Chromebook R13和联发科M8173C(在浏览器的WebGL中)上试用过它。在那个设备上,似乎max(A,B)可以返回一个既不是A也不是B的值。所以我通过使用
函数修复了这个问题,该函数接受向量将对它们执行元素操作,返回一个向量,其中每对元素都对它们执行了操作。如果执行
sin(某些向量)
,则返回的向量在其每个元素上都完成了
sin
操作

不能按顺序排列向量;没有大于或小于另一个向量的概念。您可以比较它们的元素。这正是
max
min
所做的:它们进行元素级比较,并返回max/min元素

因此,结果向量不能保证是参数之一。但是,结果向量的元素必须是传入的向量的相应元素之一。所以它不能构成价值观

顺便说一句,你显然在寻找的功能是
夹紧


也就是说,这可能是一个数字精度问题。我不知道怎么做,因为您没有将值存储在变量中,但是这个表达式使用的临时变量可能会导致
c
的结果元素的值与传入的值略有不同

因此,使用
钳制
可能会清除此问题。再说一次,可能不会。最好直接问你想要的问题:

return (any(lessThan(vec2(0.0, 0.0), c) || (any(greaterThan(1.0, 1.0), c);

我不知道GLSL ES 1.00或WebGL的着色器是否有
任何
小于/大于
。但这在桌面GL上有效。

是的,我知道max()在组件方面有效。我知道,还有200种其他方法可以做到这一点。但是我最初的函数in01是用正确的方式编写的,对吗?这正是我想知道的,GLSL是否被允许这样做。@IvanKuckir:你在做浮点等式测试。这始终是一个潜在的问题。你不能只说“这样做是个坏主意”。你应该展示一些证据,为什么它不好(例如,一个到规范的链接)。我理解,在浮点运算中,3*(1/3)可能不等于1。但我希望最大/最小值是精确的(并且只是比较值)。@IvanKuckir:但它不仅仅是“比较值”。根据定义,它必须返回它们。这意味着,在某个时刻,内存中有一个值的两个副本。因此,请告诉我GLSL规范中确保浮点值的两个副本的比较必须相等的部分。此外,规范是PDF格式的;我无法将您链接到PDF的一部分。“浮点值的两个副本必须比较相等”-如果两个浮点(不是NaN)具有完全相同的位(1和0),我希望==运算符为真,无论它是GLSL还是任何其他语言。