我正在处理一段代码,在其中需要处理不一定在0到1范围内的UV坐标(2D纹理坐标)。举个例子,有时我会得到一个具有u分量为1.2的UV坐标。为了处理这种情况,我正在实现一个包裹(wrapping)功能,通过以下方式实现重复平铺:
u -= floor(u)
v -= floor(v)
这样做会使1.2变为0.2,这是期望的结果。它还处理了负数情况,例如-0.4变为0.6。
然而,这些floor函数调用相当慢。我使用Intel VTune对我的应用程序进行了分析,并且我花费了大量的周期来执行此floor操作。
在对该问题进行一些背景阅读后,我得出了以下函数,它略微更快,但仍然有很多需要改进的空间(我仍然会遇到类型转换惩罚等问题)。
int inline fasterfloor( const float x ) { return x > 0 ? (int) x : (int) x - 1; }
我看到过一些使用内联汇编完成的技巧,但似乎没有任何一个能完全正确工作或有显著的速度提升。
有没有人知道如何处理这种情况的技巧?