gpt4 book ai didi

opengl-es - GLSL 优化 : check if variable is within range

转载 作者:行者123 更新时间:2023-12-05 01:16:39 29 4
gpt4 key购买 nike

在我的着色器中,我有变量 b,需要确定它位于哪个范围内,并从该范围内将正确的值分配给变量 a。我最终得到了很多 if 语句:

    float a = const1;

if (b >= 2.0 && b < 4.0) {
a = const2;
} else if (b >= 4.0 && b < 6.0) {
a = const3;
} else if (b >= 6.0 && b < 8.0) {
a = const4;
} else if (b >= 8.0) {
a = const5;
}

我的问题是这会导致性能问题(分支)吗?我该如何优化它?我查看了 step 和 smoothstep 函数,但还没有找到实现此目的的好方法。

最佳答案

要解决所描述的问题并避免分支通常的技术是找到一系列数学函数,每个条件一个,对于除变量满足的条件之外的所有条件,其计算结果为 0。我们可以使用这些函数作为增益来建立一个总和,每次都评估为正确的值。在这种情况下,条件是简单的区间,所以使用阶跃函数我们可以编写:

x in [a,b] as step(a,x)*step(x,b) (注意 x 和 b 的反转得到 x<=b)

或者

x in [a,b[ as step(a,x)-step(x,b) 如另一篇文章所述:GLSL point inside box test

使用这种技术我们得到:

float a = (step(x,2.0)-((step(2.0,x)*step(x,2.0)))*const1 + 
(step(2.0,x)-step(4.0,x))*const2 +
(step(4.0,x)-step(6.0,x))*const3 +
(step(6.0,x)-step(8.0,x))*const4 +
step(8.0,x)*const5

这适用于一般不相交的间隔,但对于本问题中的阶梯或楼梯函数,我们可以将其简化为:

float a = const1 + step(2.0,x)*(const2-const1) +
step(4.0,x)*(const3-const2) +
step(6.0,x)*(const4-const3) +
step(8.0,x)*(const5-const4)

我们也可以使用'bool conversion to float'来表达我们的条件,例如step(8.0,x)*(const5-const4)等价于 float(x>=8.0)*(const5-const4)

关于opengl-es - GLSL 优化 : check if variable is within range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52958171/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com