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