KD-дерево в GLSL

после одного дня попытки выяснить, как реализовать kd-дерево в OpenGL/GLSL, я довольно расстроен...

Я объявляю свои KD-узлы как это в GLSL:

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

SplitPoint содержит kd-дерево splitpoint, четвертый элемент вектора содержит splitDirection формирование плоскости в 3-м пространстве. DataPtr в настоящее время только содержит случайные значения в листах дерева.

Целый массив формирует Список Ahnentafel.

В 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

Смотрящий хороший sofar (это на самом деле говорит, что объем разделяется в (0,256,0) в направлении Y в узле 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);

В этой точке должен быть шаблон произвольных цветов на экране. Но в большинстве случаев нет ничего, чтобы быть замеченным.

Я пытался получить значения от узлов непосредственно и получить корректные результаты..., таким образом, я полагаю, что существует что-то не так с динамической индексацией универсальных данных блока.

Я надеюсь, что кто-то может помочь мне здесь... вызвать, у меня заканчиваются идеи:/

Florian

5
задан fho 5 August 2010 в 09:10
поделиться