2010-07-29 18 views
5
में

यह पता लगाने कैसे ओपन/GLSL में एक केडी पेड़ मैं बहुत निराश हूँ लागू करने के लिए कोशिश कर रहा से एक दिन ...केडी-ट्री GLSL

मैं GLSL में इस तरह मेरी केडी-नोड्स की घोषणा के बाद:

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

स्प्लिटपॉइंट केडी-पेड़ स्प्लिटपॉइंट धारण करता है, वेक्टर के चौथे तत्व में विभाजन होता है जो 3 डी स्पेस में एक विमान बनाते हैं। डेटाप्रेट वर्तमान में केवल पेड़ के पत्तों में यादृच्छिक मूल्य रखता है।

संपूर्ण सरणी 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 

sofar अच्छा लग रहा है (यह वास्तव में कहना है कि मात्रा नोड 0 में y दिशा में) 0,256,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 और लेआउट :)

मेरा मानना ​​है कि मैं कुछ अजीब बातें यहाँ

  • आपका कसौटी तय करने के पेड़ के जो पक्ष पर recurse करने अजीब बात है के लिए देखते हैं। आप यह क्या करने की उम्मीद करते हैं? निश्चित रूप से एक केडी पेड़ चलना नहीं है। क्या आपके पास हाल ही में शेडरएक्स तक पहुंच है? मेरा मानना ​​है कि # 5 इस

  • के लिए वास्तविक कोड आपका डाटा अजीब भी है देता है (शायद: आप 100% बंटवारे अंक के बारे में सुनिश्चित कर रहे हैं?)

शायद तुम देखना चाहिए कि std140 वास्तव में लिया जाता है खाते में। लेकिन आप सी ++ नोड हालांकि ठीक लगता है।

+0

- मानदंड डेटा पर आधारित है ... या इसकी अनुपस्थिति। -1 इंगित करता है कि नोड में कोई डेटा मौजूद नहीं है, इसलिए मुझे रिकर्स करना होगा, जैसे ही पॉइंटर पत्तियों पर होता है वहां डेटा है - डेटा सामान्य नहीं है। यह 0..511 की सीमा में है। मानदंड जिस बच्चे को पार करना है, तुलना करने के लिए एक सरल विमान पर आधारित है (distFromPlane = dot (पॉइंट-पॉइंटऑनप्लेन, सामान्यऑफप्लेन);) जब मैं मैन्युअल रूप से नोड पर 'n' सेट करता हूं और दूरी को आउटपुट करता हूं तो FromPlane वैरिएबल gl_Fragcolor.r के रूप में सही गणना की जाती है।मेरा सबसे अच्छा अनुमान यह है कि समस्या गतिशील शाखाओं – fho

+0

से संबंधित है और: नहीं, मुझे groovounet नहीं पता;) लेकिन कम से कम ग्लम वैक्टर पूरी तरह से स्मृति में डाले गए हैं और आप उन्हें सीधे यूबीओ में उपयोग कर सकते हैं। – fho

+0

मेरा मतलब था कि यह एक केडी-पेड़ ट्रैवर्सल नहीं है। अंत में यह पहली छेड़छाड़ की मात्रा का चयन करेगा, लेकिन इसमें जरूरी नहीं है, है ना? – Calvin1602

संबंधित मुद्दे