gpt4 book ai didi

c++ - GLSL 中的 KD 树

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:01 28 4
gpt4 key购买 nike

在尝试弄清楚如何在 OpenGL/GLSL 中实现 kd-tree 一天后,我感到非常沮丧......

我在 GLSL 中这样声明我的 KD 节点:

layout(std140) uniform node{
ivec4 splitPoint;
int dataPtr;
} nodes[1024];

SplitPoint 包含 kd-tree 分割点, vector 的第四个元素包含在 3d 空间中形成平面的 splitDirection。 DataPtr 目前只保存树叶中的随机值。

整个数组组成一个Ahnentafel List .

在 C++ 中,结构如下所示:

struct Node{
glm::ivec4 splitPoint;
GLint dataPtr;
GLint padding[3];
};

我相信这是正确的,我将构建的树上传到缓冲区中。作为检查,我将缓冲区映射到主内存并检查值:

0x08AB6890     +0  +256    +0    +1    -1  -858993460  -858993460  -858993460
0x08AB68B0 +256 +0 +0 +0 -1 -858993460 -858993460 -858993460
0x08AB68D0 +256 +256 +0 +0 -1 -858993460 -858993460 -858993460
[...]
0x08AB7070 +0 +0 +0 +0 +2362 -858993460 -858993460 -858993460

到目前为止看起来不错(它实际上说体积在节点 0 的 y 方向上在 (0,256,0) 处被分割,-1 是没有数据的标志)。

现在对于树遍历我试过这个:

float distanceFromSplitPlane;
while(nodes[n].dataPtr == -1){

// get split direction
vec3 splitDir = vec3(0,0,0);
if(nodes[n].splitDir == 0)
splitDir.x = 1;
else if(nodes[n].splitDir == 1)
splitDir.y = 1;
else
splitDir.z = 1;


// calculate distance of ray starting point to the split plane
distanceFromSplitPlane = dot(startP.xyz-(nodes[n].splitPoint.xyz/511.0), splitDir);

// depending on the side advance in the tree
if(distanceFromSplitPlane >= 0)
n = 2 * n + 1;
else
n = 2 * n + 2;
}

// we should new be located in a leaf node and therefor have a value in dataPtr
gl_FragColor = vec4(dataPtr/6000.0, 0,1,1);

此时屏幕上应该有一个随机颜色的图案。但在大多数情况下,什么也看不到。

我试图直接从节点获取值并获得正确的结果......所以我相信统一 block 数据的动态索引有问题。

我希望有人能在这里帮助我......因为我的想法已经用完了:/

弗洛里安

最佳答案

好东西:glm 和布局 :)(你碰巧知道 Groovounet 吗?)

我相信我在这里看到了一些奇怪的东西

  • 您决定在树的哪一侧进行递归的标准很奇怪。你期望它做什么?绝对不是 kd-tree 步行。您可以访问最近的 ShaderX 吗?我相信 #5 给出了实际的代码

  • 你的数据也很奇怪(也许:你 100% 确定 split 点?)

也许您应该检查是否真的考虑了 std140。但是你的 C++ Node 看起来还不错。

关于c++ - GLSL 中的 KD 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3364212/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com