我正在编写一段代码,我需要处理不一定在 0 到 1 范围内的 uvs(2D 纹理坐标)。例如,有时我会得到一个带有 au 组件的 uv,它是 1.2。为了解决这个问题,我正在实现一个包装,它通过执行以下操作导致平铺:
u -= floor(u)
v -= floor(v)
这样做会导致 1.2 变为 0.2,这是所需的结果。它还处理负数情况,例如 -0.4 变为 0.6。
然而,这些对地板的调用相当缓慢。我已经使用英特尔 VTune 分析了我的应用程序,并且我花费了大量的周期来执行此地板操作。
在对该问题进行了一些背景阅读后,我提出了以下功能,它速度更快,但仍有很多不足之处(我仍然会受到类型转换的惩罚等)。
int inline fasterfloor( const float x ) { return x > 0 ? (int) x : (int) x - 1; }
我已经看到了一些通过内联汇编完成的技巧,但似乎没有任何技巧完全正确或有任何显着的速度改进。
有谁知道处理这种情况的任何技巧?