如何在边界之间包装一个值?

问题描述 投票:1回答:1

如何围绕任意边界包装值?我想避免检查,所以我想出了一个适用于低边界的步骤:

float check = step(-1, val)*2.0-1.0;
val *= check;

这将输出矢量val大于-1时的任何值,并且环绕,并在超过它时跳转到1。

我的目标是当一个值超过某个阈值时,它“包裹起来”并从屏幕的另一侧开始返回。因此,如果移动点例如超过1,则它将在-1位置的屏幕中重新出现,并继续从那里开始移动。

另一方面,如果低于-1,它将出现在位置1并继续从那里移动。

glsl shader
1个回答
0
投票
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。这意味着xy甚至可以是vec2vec3vec4类型。当然xy必须属于同一类型。

© www.soinside.com 2019 - 2024. All rights reserved.