数值重映射虽然不属于系统的 api,但在我们平时的工作中又是不可或缺的。
0~1 之间其实很简单
-1,1 -> 0,1 时,就是 x * 0.5 + 0.5 = y
0,1 -> -1,1 时,就是 y * 2 - 1 = x
x和y是具有可逆性的
除了像上面这种确定的值外,比如我的范围是不固定的话怎么办?
别慌,这也是有公式可以用的,要不说数学的世界很神奇呢~
float Remap(float x, float t1, float t2, float s1, float s2)
{
return (s2 - s1) / (t2 - t1) * (x - t1) + s1;
return (x - t1) / (t2 - t1) * (s2 - s1) + s1;
}
上面这2条公式是等效的,具体怎么用,就看你要怎么组织了。
其中 x = 输入值, t1 = 输入值的最小值, t2 = 输入值的最大值, s1 = 输出值的最小值, s2 = 输出值的最大值
举个🌰:
设 t1=0, t2=1, s1=-1, s2=1时,
当x=0时,函数输出值=-1
当x=1时,函数输出值=1
当x=0.5时,函数输出值=0
怎么样,聪明的你应该看懂怎么用了吧
上面一般是在逻辑脚本里的写法,如果换到 shader 这边,例如 hlsl 的话,因为有矢量寄存器的加持,写起来是这样的
void Remap(float4 In, float2 InMinMax, float2 OutMinMax, out float4 Out)
{
Out = (In - InMinMax.x) * (OutMinMax.y - OutMinMax.x) / (InMinMax.y - InMinMax.x) + OutMinMax.x;
}
像 unity 如果想在 c# 里也能这么写的话,就需要它新的数据库 com.unity.mathematics 才行,它有 SIMD 功能的加持,当然有很多人其实是不太适应 hlsl 这种写法的~