在我的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()返回一个输入值),或者它是设备环境中的一个错误(但那么,它怎么能通过所有测试并投入生产)?
答案 0 :(得分:3)
采用向量的函数将对它们执行元素方式操作,返回一个向量,其中每对元素都对它们执行了该操作。如果您执行sin(some_vector)
,则返回的向量在其每个元素上都已完成sin
。
你不能把矢量放在一个顺序中;没有矢量的概念大于或小于另一个。你可以比较他们的元素。这正是max
和min
所做的:它们进行逐元素比较,并返回最大/最小元素。
因此得到的矢量非常不保证是其中一个参数。但是,生成的向量的元素是传入的向量的相应元素之一。因此它不能组成值。
顺便说一下,你正在寻找的功能是clamp
。
话虽如此,这可能是一个数字精度问题。我不确定如何,因为您没有将值存储在变量中,但此表达式使用的临时值可能导致c
的结果元素的值与传入的值略有不同。
因此,使用clamp
可能会清除这一点。然后,它可能不会。最好直接问你正在寻找的问题:
return (any(lessThan(vec2(0.0, 0.0), c) || (any(greaterThan(1.0, 1.0), c);
我不知道GLSL ES 1.00或WebGL的着色器是否有any
和less/greaterThan
。但这适用于桌面GL。