代码之家  ›  专栏  ›  技术社区  ›  fho

GLSL中的KD树

  •  5
  • fho  · 技术社区  · 15 年前

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

    整个阵列形成一个 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
    

    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);
    

    在这一点上,屏幕上应该有一个随机的颜色模式。但在大多数情况下,什么都看不见。

    我尝试直接从节点获取值并得到正确的结果。。。所以我认为统一块数据的动态索引有问题。

    1 回复  |  直到 15 年前
        1
  •  4
  •   Calvin1602    15 年前

    Sweet:glm和layouts:)(你知道Groovounet吗?)

    • 决定在树的哪一边递归的标准很奇怪。你希望它做什么?绝对不是在树上散步。您有权访问最近的ShaderX吗?我相信#5给出了这方面的实际代码

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

    也许你应该检查一下std140是否真的被考虑进去了。但是,C++节点看起来不错。