必ずしも 0 から 1 の範囲にあるとは限らない UV (2D テクスチャ座標) を処理する必要があるコードに取り組んでいます。例として、au コンポーネントが 1.2 の UV を取得することがあります。これを処理するために、次のようにしてタイリングを引き起こすラッピングを実装しています。
u -= floor(u)
v -= floor(v)
これを行うと、1.2 が目的の結果である 0.2 になります。また、-0.4 が 0.6 になるなどの負のケースも処理します。
ただし、フロアへのこれらの呼び出しはかなり遅いです。Intel VTune を使用してアプリケーションのプロファイリングを行いましたが、このフロア操作だけで膨大なサイクルを費やしています。
この問題についていくつかの背景を読んだ後、私は次の関数を思いつきました。これは少し高速ですが、まだ多くのことが望まれています (私はまだ型変換のペナルティなどを被っています)。
int inline fasterfloor( const float x ) { return x > 0 ? (int) x : (int) x - 1; }
インライン アセンブリで達成されるいくつかのトリックを見てきましたが、正確に正しく機能したり、速度が大幅に向上したりするものはありません。
この種のシナリオを処理するための秘訣を知っている人はいますか?