如何围绕任意边界包装值?我想避免检查,所以我想出了一个适用于低边界的步骤:
float check = step(-1, val)*2.0-1.0;
val *= check;
这将输出矢量val
大于-1时的任何值,并且环绕,并在超过它时跳转到1。
我的目标是当一个值超过某个阈值时,它“包裹起来”并从屏幕的另一侧开始返回。因此,如果移动点例如超过1,则它将在-1位置的屏幕中重新出现,并继续从那里开始移动。
另一方面,如果低于-1,它将出现在位置1并继续从那里移动。
float check = step(-1, val)*2.0-1.0;
每当该值大于-1时,这将有效地输出向量val在其组件中具有的任何值,并且当它超过它时回绕并跳转到1。
不。在任何情况下,函数step()
的结果都是eiterh 0.0或1.0。所以step(-1, val)*2.0-1.0
的结果是-1.0或1.0。
我的目标是当一个值超过某个阈值时,它“包裹起来”并从屏幕的另一侧开始返回。因此,如果移动点例如超过1,那么它将在-1位置的屏幕中重新出现,
你想做什么可以通过函数mod(x, y)
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mod.xhtml实现,它返回x的y除法的其余部分:
y = mod(x+1.0, 2.0)-1.0
独立于x
的值,函数的结果始终在[-1,1]范围内。如果达到上限1,则紧接着的结果为-1:
注意,该函数使用mod()
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mod.xhtml支持genType
。这意味着x
和y
甚至可以是vec2
,vec3
或vec4
类型。当然x
和y
必须属于同一类型。