max(A,B)是否总是返回A或B?

时间:2017-11-12 14:37:20

标签: 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; 
}

它在许多设备上运行良好,直到我在带有MediaTek M8173C的Acer Chromebook R13上尝试(在浏览器中的WebGL中)。在该设备上,似乎max(A,B)可以返回一个既不是A也不是B的值。所以我使用<=而不是max / min来修复它。

但是,我很好奇,为什么会这样。这是我的错(GLSL规范不要求max()返回一个输入值),或者它是设备环境中的一个错误(但那么,它怎么能通过所有测试并投入生产)?

1 个答案:

答案 0 :(得分:3)

采用向量的函数将对它们执行元素方式操作,返回一个向量,其中每对元素都对它们执行了该操作。如果您执行sin(some_vector),则返回的向量在其每个元素上都已完成sin

你不能把矢量放在一个顺序中;没有矢量的概念大于或小于另一个。你可以比较他们的元素。这正是maxmin所做的:它们进行逐元素比较,并返回最大/最小元素

因此得到的矢量非常保证是其中一个参数。但是,生成的向量的元素是传入的向量的相应元素之一。因此它不能组成值。

顺便说一下,你正在寻找的功能是clamp

话虽如此,这可能是一个数字精度问题。我不确定如何,因为您没有将值存储在变量中,但此表达式使用的临时值可能导致c的结果元素的值与传入的值略有不同。

因此,使用clamp可能会清除这一点。然后,它可能不会。最好直接问你正在寻找的问题:

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

我不知道GLSL ES 1.00或WebGL的着色器是否有anyless/greaterThan。但这适用于桌面GL。