我宣佈我的KD-節點像這樣的GLSL
後:
layout(std140) uniform node{
ivec4 splitPoint;
int dataPtr;
} nodes[1024];
SplitPoint保存kd-tree分割點,向量的第四個元素使splitDirection在三維空間中形成一個平面。 DataPtr當前僅在樹的葉子中保存隨機值。
整個數組形成一個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
尋找良好聲發射(它實際上說,容積爲(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);
在這一點上應該有隨機顏色屏幕上的圖案。但在大多數情況下,沒有什麼可以看到的。
我試圖直接從節點獲取值並獲得正確的結果......所以我認爲統一塊數據的動態索引有問題。
我希望有人能幫助我在這裏...因爲我運行的想法:/
弗洛裏安
- 該標準基於數據...或相同的缺陷。 -1表示沒有數據出現在節點中,所以我必須遞歸,只要指針在葉子上就有數據 - 數據只是未標準化。它的範圍是0..511。孩子要穿過的標準是基於一個簡單的平面點比較(distFromPlane = dot(point-pointOnPlane,normalOfPlane);) 當我手動設置'n'節點並輸出distanceFromPlane變量爲gl_Fragcolor.r它計算正確。我最好的猜測是,這個問題與動態分支有關 – fho 2010-08-02 07:23:06
並且:不,我不知道groovounet;) 但是至少glm向量完美地放置在內存中,您可以直接在UBO中使用它們。 – fho 2010-08-02 07:24:05
我的意思是它不是KD樹遍歷。它最終會選擇第一個相交的卷,但它不一定包含任何內容,是嗎? – Calvin1602 2010-08-02 08:10:33