ओपनजीएल में, मैं एक गहराई बफर की गहराई सीमा की खोज कैसे कर सकता हूं?


11

मैं iOS के लिए GL मल्टी-पास रेंडरिंग ऐप कर रहा हूं। पहली पास एक गहराई बफर बनावट को प्रस्तुत करता है। दूसरा पास एक खंड shader के अनुप्रयोग को नियंत्रित करने के लिए गहराई बफर में मूल्यों का उपयोग करता है। मैं कुछ उपयोगी करने के लिए गहराई बफर में मूल्यों को फिर से बेचना चाहता हूं, लेकिन इससे पहले कि मैं कर सकता हूं मुझे गहराई बफर मानों की गहराई मूल्य सीमा जानने की आवश्यकता है। मैं यह कैसे करु?

जवाबों:


10

गहराई बफ़र को लिखे गए मानों की श्रेणी वे हैं जो आप चाहते हैं कि वे हों। आमतौर पर वे 0-टू -1 श्रेणी में आते हैं। गहराई बफ़र में लिखा गया वास्तविक मान व्यूपोर्ट ट्रांसफ़ॉर्मेशन के दौरान परिकलित होता है, जो NDC स्पेस में वर्टेक्स के Z मान पर आधारित होता है (क्लिप स्पेस में w द्वारा विभाजित दृष्टिकोण के बाद)।

NDC डेप्थ वैल्यू (Z, W के परिप्रेक्ष्य के विभाजन के बाद) व्यूपोर्ट ट्रांसफॉर्मेशन की गहराई वाले हिस्से से मापी गई है (जो आपके X और Y निर्देशांक को एक समन्वयित स्थान में लाती है जिसे आप विंडो में पिक्सल के साथ जोड़ते हैं), और फिर स्केल किया गया (2^n-1)- इसका मतलब "टू द पावर टू" के रूप में पढ़ा जाना है n- nयह गहराई बफ़र की थोड़ी सी सटीकता है। परिणामी मान गहराई बफ़र को लिखा जाता है।

OpenGL ने व्यूपोर्ट ट्रांसफॉर्मेशन मैट्रिक्स की परिभाषा glViewport और glDepthRange कॉल्स में विभाजित की है। glDepthRange वह गहराई सीमा निर्धारित करने के लिए जिम्मेदार स्केल फैक्टर को नियंत्रित करता है जिसके बारे में आप पूछ रहे हैं। आप वर्तमान सीमा को पुनर्प्राप्त करने के लिए चयनकर्ता के साथ glGetFloatv पर कॉल कर सकते हैं GL_DEPTH_RANGE। यह आपको 0 से 1 के मान के बिना सीमा का उपयोग करने की अनुमति देगा (हालांकि समय का 99.9%, व्यवहार में, कोई भी इसे कभी भी नहीं बदलता है)।

आगे पढ़ते हुए, यदि आप चाहते हैं कि आंख के स्थान से गहराई बफर तक जेड मान का पालन करने के लिए गणित का पुनर्निर्माण कैसे किया जाए।


मैं इसे सभी अतिरिक्त अतिरिक्त संदर्भ सामग्री के लिए जोश और त्रिकोण प्लानर-नेस के बारे में बताता हूं। मैं एक हैक करने के लिए इच्छुक हूं, जहां मैं ज्यामिति के जेड-हद से पूरी तरह मेल खाने के लिए / दूर क्लिप विमानों के पास स्थिति हूं ताकि मैं गहराई तक अच्छे मान रखूं। मैं अभी तक क्या हूँ? मैं पास # 1 गहराई मानचित्र में क्या है के आधार पर पास # 2 के दौरान दिलचस्प स्थान विशिष्ट धब्बा प्रभाव बनाना चाहता हूं।
डगला

7

गहराई बफर में मान हमेशा 0-1 के बीच सीमा में होते हैं। शून्य यह है कि गाया हुआ टुकड़ा निकट विमान की गहराई में है और 1 यह है कि टुकड़ा दूर के विमान की गहराई में है। और इसके बीच सब कुछ।

यदि आप विश्व अंतरिक्ष में वास्तविक गहराई जानना चाहते हैं तो इसे गहराई बफ़र से गणना करना आसान है।

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

और यही कारण है कि आप अपने प्रोजेक्शन मैत्री में निकट और दूर के विमानों को निर्दिष्ट करते हैं, ताकि गहराई बफ़र की अधिक सटीकता प्राप्त हो सके।

गहराई बफर मूल्यों का उपयोग करते समय गहराई और दूरी के बीच अंतर के बारे में भी जानकारी रखें।


@notebene। लगभग वहाँ पहुँच गया। मैं गहराई में मान की सीमा को फिर से भरना चाहता हूं 0 -> 1. इसलिए यदि रेंडर किए गए मिनट / अधिकतम गहराई हैं ।25 / .75 मैं चाहता हूं (डेपवेल्यू - - .25) / ((75 - 25)। तो, क्या पास 1 के बाद डीपबफ़र के मिनट / अधिकतम की खोज करने का एक तरीका है और पास 2 के दौरान
पुनर्विक्रय

1
@ डडला: चूंकि आप त्रिभुज का प्रतिपादन कर रहे हैं, जो कि प्लेनर हैं, तो यह लागू होता है कि न्यूनतम और अधिकतम गहराई मान दृश्य में न्यूनतम और अधिकतम कोने से जुड़े होंगे। यदि आप इन दोनों को जानते हैं, तो आप उन्हें पाइपलाइन के माध्यम से मैन्युअल रूप से बदल सकते हैं और आप न्यूनतम और अधिकतम मूल्यों को जान पाएंगे जो आप गहराई से बफर को लिख रहे हैं। यह संभवतः प्रतिपादन की तुलना में आसान है, फिर पूरी गहराई बफर को पढ़ना और इसे पुनरावृत्त करना।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.