对于基于八叉树的稀疏体素八叉树渲染器,我希望能够旋转和镜像八叉树的各个节点。尽管它不是真正的八叉树,但由于节点是共享的,并且允许将它们自己包含为子树。否则我可以简单地将转换应用到八叉树本身。
我还没有决定如何对转换进行编码,尽管应该可以将其编码为单个32位整数(甚至是6位整数,因为只有48个可能的转换)。然后,转换可以作为函数应用,该函数将立方体的每个角点映射到转换后的位置。即。
int transform(int corner, int transformation) {
// magic happens here
return result;
}
此外,我还应该有一个功能
combine
将转换结合在一起
transform(corner, combine(a,b))
等于
transform(transform(corner, b), a)
由于这些函数将被每秒调用10亿次,因此它们应该很快。尽管转换的调用频率大约是合并的4倍。该算法是递归的,因此如果转换编码使用多个32位整数,则将其放入堆栈会产生额外的运行时开销。
到目前为止,我已经发现这个问题可以分解为位翻转(bit flipping)和位置换(bit permutation)(我还不知道如何有效地执行)。不过,同时进行这两种操作可能更有效。
我打算在C++代码中使用这个代码,它已经使用了SSE4.1内核。尽管不使用内部函数或只需要SSE3的解决方案是首选的。最后,速度是最重要的。我会试着用
http://quick-bench.com/
比较解决方案。