用于存储3D浮动帖子的Morton代码

时间:2015-07-12 01:06:21

标签: c++ data-structures octree

我正在尝试实施本文中解释的内容: http://devblogs.nvidia.com/parallelforall/thinking-parallel-part-iii-tree-construction-gpu/

// Expands a 10-bit integer into 30 bits
// by inserting 2 zeros after each bit.
unsigned int expandBits(unsigned int v)
{
    v = (v * 0x00010001u) & 0xFF0000FFu;
    v = (v * 0x00000101u) & 0x0F00F00Fu;
    v = (v * 0x00000011u) & 0xC30C30C3u;
    v = (v * 0x00000005u) & 0x49249249u;
    return v;
}

// Calculates a 30-bit Morton code for the
// given 3D point located within the unit cube [0,1].
unsigned int morton3D(float x, float y, float z)
{
    x = min(max(x * 1024.0f, 0.0f), 1023.0f);
    y = min(max(y * 1024.0f, 0.0f), 1023.0f);
    z = min(max(z * 1024.0f, 0.0f), 1023.0f);
    unsigned int xx = expandBits((unsigned int)x);
    unsigned int yy = expandBits((unsigned int)y);
    unsigned int zz = expandBits((unsigned int)z);
    return xx * 4 + yy * 2 + zz;
}

当我使用提供的示例尝试Morton3D功能时, (0.1010,0.0111,0.1100)它返回1479990而不是101011110010。

我错过了这里没有解释的内容吗?

谢谢! -D

1 个答案:

答案 0 :(得分:1)

您缺少两个要点:

  1. 文章中给出的样本编号(0.1010,0.0111,0.1100)实际上是用二进制编写的。这意味着 0.1010 实际上是0.5 + 0.125 = 0.625 0.0111 是0.25 + 0.125 + 0.0625 = 0.4375 0.1100 是0.5 + 0.25 = 0.75 。把这些放进去,你就会看到。

  2. 示例图对每个组件仅使用4位,在Morton编码中总共使用12位,而实际代码每个组件使用10位,总共30位。因此,在得到的结果中,忽略结果的前2位,看看其余的位,看看你是否能搞清楚。

  3. 顺便说一句,文章中的代码是正确的,并按照它所说的做了。