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