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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Süß : glm UND layouts 🙂 ( kennt Ihr zufällig Groovounet ? )
Ich glaube, ich sehe einige seltsame Dinge hier
Ihre Kriterium für die Entscheidung, auf welcher Seite der Baum rekursiv durchsuchen ist seltsam. Was erwarten Sie, es zu tun ? Definitiv kein kd-tree-walk. Sie haben Zugang zu einer aktuellen ShaderX ? Ich glaube, die #5 gibt den tatsächlichen code für diese
Ihre Daten seltsam ist auch (vielleicht : sind Sie 100% sicher, dass die verzweigungspunkte ?)
Vielleicht sollten Sie überprüfen, dass std140 wirklich berücksichtigt. Aber Sie C++ - Knoten scheint ok, aber.