KD-Tree in GLSL
après une journée à essayer de comprendre comment implémenter un arbre de kd dans OpenGL/GLSL je suis assez frustré ...
je déclare mes noeuds KD comme ceci dans GLSL:
layout(std140) uniform node{
ivec4 splitPoint;
int dataPtr;
} nodes[1024];
Le point de séparation tient le point de séparation KD-arbre, le quatrième élément du vecteur tient la direction de séparation formant un plan dans l'espace 3d. DataPtr ne contient actuellement que des valeurs aléatoires dans les feuilles de l'arbre.
L'ensemble forme un Ahnentafel List .
en C++ la structure ressemble à ceci:
struct Node{
glm::ivec4 splitPoint;
GLint dataPtr;
GLint padding[3];
};
je crois que pour être correct et je télécharge l'arbre Construit dans le tampon. Comme vérification, je mate le tampon dans la mémoire principale et j'inspecte les valeurs:
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
semble bon sofar (il dit en fait que le volume est divisé à (0,256,0) dans la direction de Y dans le noeud 0, -1 est le signe pour aucune donnée).
maintenant pour le l'arbre transversal j'ai essayé ceci:
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);
à ce point il devrait y avoir un motif de couleurs aléatoires sur l'écran. Mais dans la plupart des cas, il n'y a rien à voir.
j'ai essayé d'obtenir des valeurs de nœuds directement et obtenir des résultats corrects ... je crois donc qu'il y a quelque chose qui ne va pas avec l'indexation dynamique des données de blocs uniformes.
j'espère que quelqu'un pourra m'aider ici ... parce que je suis à court d'idées :/
Florian
1 réponses
Doux : glm ET les mises en page :) ( Ne vous arrive de savoir Groovounet ? )
je crois que je vois des choses bizarres ici
-
votre critère pour décider sur quel côté de l'arbre à récurer est étrange. Qu'attendez-vous d'elle ? Ce n'est pas une promenade de KD-tree. Avez-vous accès à un ShaderX récent ? Je crois que le #5 donne le code réel pour ce
-
vos données sont bizarres aussi (peut-être : êtes-vous sûr à 100% du partage des points ?)
peut-être devriez-vous vérifier que le std140 est vraiment pris en compte. Mais votre noeud C++ semble correct.