用于存储 3D 浮动位置的莫顿代码
Morton code to store 3D float postitions
我正在尝试实现本文中解释的内容:
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位,看看剩下的位,看看你能不能算出来。
顺便说一句,文章中的代码是正确的,并且按照它所说的去做。
我正在尝试实现本文中解释的内容: 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位,看看剩下的位,看看你能不能算出来。
顺便说一句,文章中的代码是正确的,并且按照它所说的去做。