我正在尝试实现本文中解释的内容:
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
最佳答案
您缺少两个要点:
文章中给出的样本编号(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。将它们放入,您将看到。
示例图每个组件仅使用4位,在Morton编码中总共使用12位,而实际代码在每个组件中使用10位,总共使用30位。因此,得出的结果是,忽略了前2位结果,然后查看其余部分,看看是否可以解决。
顺便说一句,本文中的代码是正确的,并且按其声明的那样进行。