2010-04-07 15 views
5

जहां तक ​​मुझे पता है, हम ओपनजीएल ईएस 2.0 में जेड (गहराई) मान नहीं पढ़ सकते हैं। तो मैं सोच रहा हूं कि हम 2 डी स्क्रीन पर एक बिंदु से 3 डी वर्ल्ड निर्देशांक कैसे प्राप्त कर सकते हैं?ओपनजीएल एसएस 2.0 गहराई बफर

दरअसल मेरे पास कुछ यादृच्छिक विचार काम कर सकते हैं। चूंकि हम glReadPixels का उपयोग करके आरजीबीए वैल्यू पढ़ सकते हैं, हम गहराई बफर को डुप्लिकेट कैसे करते हैं और इसे रंग बफर में स्टोर करते हैं (कलरफोर्डेड कहते हैं)। बेशक वहां कुछ अच्छा सम्मेलन होना चाहिए ताकि हम गहराई बफर की कोई जानकारी न खोएं। और फिर जब हमें किसी बिंदु के विश्व निर्देशांक की आवश्यकता होती है, तो हम इस रंगीन डिप्थ रंग बफर को फ्रेमबफर पर संलग्न करते हैं और फिर इसे प्रस्तुत करते हैं। तो जब हम इस फ्रेम पर गहराई से जानकारी पढ़ने के लिए glReadPixels का उपयोग करते हैं।

हालांकि, इससे 1 फ्रेम फ्लैश होगा क्योंकि कलरबफर गहराई बफर से अनुवादित एक अजीब बफर है। मैं अभी भी सोच रहा हूं कि OpenGL es 2.0 में गहराई प्राप्त करने के लिए कुछ मानक तरीका है या नहीं?

अग्रिम में Thx! :)

उत्तर

7

एक एफबीओ का उपयोग करके, आप परिणाम प्रदर्शित किए बिना प्रस्तुत कर सकते हैं। यदि आप ईएस 2.0 में हैं, तो आपका टुकड़ा शेडर gl_FragCoord के हिस्से के रूप में वर्तमान खंड की गहराई (विंडो निर्देशांक में) तक पहुंच सकता है, ताकि आप इसे रंग बफर में लिख सकें, परिणाम प्राप्त करने और आगे बढ़ने के लिए glReadPixels का उपयोग कर सकते हैं। वैकल्पिक रूप से, आप विश्व-स्पेस जेड को अलग-अलग के रूप में लोड कर सकते हैं और अपने टुकड़े के शेडर से लिख सकते हैं, अगर यह एक आसान तरीका है।

अपने आप को मनाने के लिए, एक त्वरित शेडर लिखने का प्रयास करें जो gl_FragCoord.z ​​को कम परिशुद्धता में जल्दी से बाहर रखता है, उदा। बस

gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0); 

आपको गहराई का प्रतिनिधित्व करने वाले रंग की तीव्रता के साथ एक ग्रेस्केल प्राप्त करना चाहिए। चूंकि आप खिड़की निर्देशांक में हैं, तीव्रता 0.0 (निकटतम संभव अनकही टुकड़ा) से 1.0 तक (अधिकतम संभव अनकही टुकड़ा) तक होगी। काफी सटीकता खोने के क्रम में, घटकों के बीच मूल्य को विभाजित करने के लिए शायद अधिक सहायक है, क्योंकि आपका विक्रेता लगभग निश्चित रूप से फ़्लोटिंग पॉइंट लक्ष्य बफर का समर्थन नहीं करता है।

+0

टॉमी, क्या आप घटकों के बीच gl_FragCoord.z ​​को विभाजित करने के बारे में कुछ और कह सकते हैं। पालन ​​नहीं करते हुए। चीयर्स। – dugla

+1

@dugla यदि गहराई 32-बिट पूर्णांक थी, तो आप आर, जी, बी और ए में से प्रत्येक में 8-बिट्स हो सकते हैं। इसलिए अभ्यास में आप क्या करेंगे वेक्टर '(1, 256 गुणा करने जैसा कुछ है , 65536, 16777216) ', फिर उस वेक्टर मोड 1.0 के प्रत्येक घटक को प्रासंगिक चैनलों में स्टोर करें। आप बाद में प्रासंगिक घटकों को विभाजित करके और एक साथ जोड़कर पुनः संयोजित कर सकते हैं। – Tommy

0

मैं एक स्क्रीन स्पर्श से एक 3D वस्तु चुनने के लिए कास्टिंग एक बुनियादी रे का उपयोग करें। असल में मैं स्पर्श बिंदु पर सामान्य स्क्रीन और मेरे ऑब्जेक्ट वाले क्षेत्र के बीच छेड़छाड़ की गणना करता हूं। एक बहुत ही सटीक पिकिंग या जटिल आकार के लिए आपको कई क्षेत्रों का उपयोग करना होगा।

आप स्क्रीन के 2 डी स्पेस (मेरे ट्रांसफर मैट्रिक्स द्वारा अपना 3 डी पॉइंट गुणा करके) के कुछ महत्वपूर्ण बिंदुओं को भी प्रोजेक्ट कर सकते हैं और फिर टच पॉइंट के साथ कुछ 2 डी तुलना (दूरी) बना सकते हैं।

0

मैं गहराई बफर, में मूल्यों को पढ़ने में सक्षम होना चाहूंगा लेकिन शोध यह इंगित कर रहा है कि यह नहीं किया जा सकता है।

विन्सेंट के रूप में सुझाव देता है, यदि आपके पास गोलाकार जैसे साधारण आकार हैं, तो रे-कास्टिंग शायद बेहतर है।

अधिक जटिल आकार के लिए

यद्यपि, मैं बफर गुप्त एक (संभावित छोटे) को वस्तु प्रतिपादन, मैन्युअल रूप से प्रत्येक शिखर के रंग घटकों में से एक बताए, कि शिखर की गहराई होने के लिए और उसके बाद सोच रहा हूँ रंग मूल्यों को पढ़ना। यह कुछ हद तक सुरुचिपूर्ण और कष्टप्रद है, और आपको ऑब्जेक्ट-स्पेस को स्क्रीन स्पेस में कनवर्ट करने में सक्षम होना आवश्यक है (मै मैट्रिक्स ड्राइव करने के लिए अपने स्वयं के quaternions का उपयोग कर रहा हूं, ताकि उसका ख्याल रख सके)। रंग या स्टैंसिल बफर में गहराई की जानकारी लिखने के लिए शेडर्स के साथ एक तरीका हो सकता है (क्या जीएल ईएस में स्टैंसिल बफर भी है?)

अगर किसी के पास क्लीनर दृष्टिकोण है तो मुझे यह सुनना अच्छा लगेगा।

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