KD-Baum in GLSL

nach einem Tag versucht, herauszufinden, wie zu implementieren, die einen kd-Baum in OpenGL/GLSL ich bin ziemlich frustriert ...

Ich erkläre meine KD-Knoten, wie dies in GLSL:

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

Splitpunkt hält den kd-Baum Splitpunkt, das vierte element des Vektors enthält die splitDirection bilden eine Ebene im 3d-Raum. DataPtr derzeit hält nur zufällige Werte in den blš Attern des Baumes.

Das gesamte array bildet eine Ahnentafel Liste.

In C++ die Struktur sieht wie folgt aus:

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

Ich glaube das ist richtig und ich lade den konstruierten Baum in den Puffer. Als ich prüfen die Karte der Puffer in den Hauptspeicher laden, und überprüfen Sie die Werte:

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

Sieht gut soweit (es sagt eigentlich, dass die Lautstärke getrennt (0,256,0) in y-Richtung Knoten 0, -1 ist das Zeichen für keine Daten).

Nun für die tree-traversal habe ich versucht, dieses:

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

In diesem Punkt sollte es sein, ein Muster von random Farben auf dem Bildschirm. Aber in den meisten Fällen gibt es nichts zu sehen.

Habe ich versucht, um Werte von nodes direkt und erhalten Sie die richtigen Ergebnisse ... also ich glaube es ist etwas falsch mit der dynamischen Taktung der einheitliche block-Daten.

Ich hoffe, jemand kann mir hier helfen ... denn ich bin running out of Ideen :/

Florian

InformationsquelleAutor fho | 2010-07-29
Schreibe einen Kommentar