2010-07-29 87 views
5
一天試圖找出如何實現在OpenGL/GLSL kd樹我很沮喪......

KD樹在GLSL

我宣佈我的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); 

在這一點上應該有隨機顏色屏幕上的圖案。但在大多數情況下,沒有什麼可以看到的。

我試圖直接從節點獲取值並獲得正確的結果......所以我認爲統一塊數據的動態索引有問題。

我希望有人能幫助我在這裏...因爲我運行的想法:/

弗洛裏安

回答

4

甜:(?你碰巧知道Groovounet)GLM和佈局:)

我相信我看到一些奇怪的事情在這裏

  • 你的標準來決定哪些樹的側遞歸很奇怪。你期望它做什麼?肯定不是kd樹行走。你有沒有使用最近的ShaderX?我相信,#5給你的數據是怪異過這個

  • 實際代碼(也許:你是100%肯定的分割點?)

也許你應該檢查std140真的採取考慮到。但是,你的C++節點似乎確定,但。

+0

- 該標準基於數據...或相同的缺陷。 -1表示沒有數據出現在節點中,所以我必須遞歸,只要指針在葉子上就有數據 - 數據只是未標準化。它的範圍是0..511。孩子要穿過的標準是基於一個簡單的平面點比較(distFromPlane = dot(point-pointOnPlane,normalOfPlane);) 當我手動設置'n'節點並輸出distanceFromPlane變量爲gl_Fragcolor.r它計算正確。我最好的猜測是,這個問題與動態分支有關 – fho 2010-08-02 07:23:06

+0

並且:不,我不知道groovounet;) 但是至少glm向量完美地放置在內存中,您可以直接在UBO中使用它們。 – fho 2010-08-02 07:24:05

+0

我的意思是它不是KD樹遍歷。它最終會選擇第一個相交的卷,但它不一定包含任何內容,是嗎? – Calvin1602 2010-08-02 08:10:33