数值重映射方法(Remap)

数值重映射虽然不属于系统的 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 这种写法的~

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值