2009-06-27 16 views
8

में पहली बार जेड-गहराई परीक्षण। आज बैठकर खुद को ओपनजीएल पढ़ाना। लेकिन मैंने एक प्रश्न में भाग लिया है जिसे मुझे जवाब नहीं मिल रहा है। मैं सोच रहा हूं कि क्यों ओपनजीएल में अर्द्ध पारदर्शी वस्तुओं के साथ गहराई परीक्षण असंगत प्रतीत होता है। प्रलेखन का सुझाव है कि आपको गहराई से परीक्षण बंद करना होगा, फिर वस्तुओं को रिवर्स-दूरी क्रम में खींचें और मिश्रण ठीक से काम करेगा।ओपनजीएल

लेकिन क्यों नहीं खोल सकता है जीएल सिर्फ उसी गहराई परीक्षण का उपयोग करता है जो हमेशा यह पता लगाने के लिए करता है कि रिवर्स दूरी क्रम में सबसे दूर क्या है और यह आपके लिए क्या करता है? क्या यह सिर्फ ढांचे का एक सीमा है, या क्या आप ग्राफिक्स हार्डवेयर में कुशलता से क्या कर सकते हैं, या ऐसा कुछ करने के साथ कुछ करना है?

बस सोच रहा है। उम्मीद है कि यहां कोई व्यक्ति स्पष्ट हो सकता है।

उत्तर

11

अच्छा सवाल।

संक्षिप्त उत्तर यह है कि जेड-बफर फ्रेम बफर में प्रत्येक पिक्सेल के लिए एक एकल मान (केवल) स्टोर करता है। ऑपरेशन के "सामान्य" मोड को देखते हुए (अपारदर्शी वस्तुओं के लिए - GL_DEPTH_TEST सक्षम, glDepthFuncGL_LESS पर सेट), यह मान निकटतम खंड की गहराई होगी जो उस पिक्सेल को मानचित्र करता है।

फ्रेम बफर एक "गूंगा" डिवाइस है - प्रत्येक टुकड़ा रास्टराइज और गहराई से परीक्षण सभी अन्य लोगों से होता है, और इसे उत्पन्न करने वाले आदिम की किसी भी अवधारणा से तलाक दिया जाता है। इसलिए, पूर्ववर्ती प्राइमेटिव्स, गहराई सॉर्टिंग इत्यादि के बारे में जानकारी के लिए कोई जगह नहीं है, जैसा कि आपकी "ऑटो पारदर्शिता" सुविधा को लागू करने की आवश्यकता होगी।

आप गहराई सॉर्टिंग में सहायता के लिए "दृश्य ग्राफ" में देखना चाहेंगे। ये पुस्तकालय हैं जो ओपनजीएल प्रदान करता है जो मूल टी & एल सामान से परे "उच्च स्तर" कार्यक्षमता जोड़ते हैं।

उम्मीद है कि इससे मदद मिलती है।

2

मैंने गहराई से परीक्षण बंद करने के बारे में नहीं सुना है। आप पारदर्शी वस्तुओं की गहराई से परीक्षण करना चाहते हैं।

आप बस पारदर्शी वस्तुएं जेड-बफर को नहीं लिखना चाहते हैं क्योंकि तब वे उनके पीछे कुछ भी छेद पेंच करेंगे जो बाद में खींचे जाते हैं।

+0

मुझे आश्चर्य है कि यह क्यों वोट दिया गया था, क्योंकि यदि आपने ओपनजीएल का सुझाव दिया है, तो वह आपके पारदर्शी वस्तु के बाद खींचा गया है, लेकिन इसके पीछे पारदर्शी वस्तु पूरी तरह से समाप्त हो जाएगी, स्पष्ट रूप से इरादा नहीं है। – Blindy

+1

यही बात है - गहराई से परीक्षण सक्षम होने पर गहराई से पारदर्शी सामान खींचते हैं लेकिन गहराई से लेखन अक्षम होता है। इस तरह पारदर्शी सामान अभी भी अपारदर्शी सामान से सामने आता है जो इसके सामने है। –

+0

आप पारदर्शी ऑब्जेक्ट्स को आखिरी बार पीछे खींचते हैं। मुझे लगता है कि वह पहले से ही जानता था, क्योंकि उसने रिवर्स ऑर्डर का उल्लेख किया था, और जेड-बफरिंग के बारे में पूछ रहा था। – David

3

ओपनजीएल एक समय में गहराई बफर एक पिक्सेल को लिखता है, और त्रिभुजों को प्रस्तुत करता है जो क्रम में पिक्सल उत्पन्न करते हैं ताकि उन्हें ओपनजीएल में प्रस्तुत किया जा सके। ओपनजीएल त्रिकोणों की कोई गहराई से छंटनी नहीं करता है, यह उस एप्लिकेशन के लिए सबसे प्रभावी है जिस तरह से प्रबंधन करने के लिए कॉलिंग फ्रेमवर्क पर निर्भर करता है। यह गति और लचीलापन के उद्देश्य के लिए है, क्योंकि बहुत से त्रिकोणों को प्रस्तुत करने का सबसे प्रभावी तरीका उन्हें कोष्ठकों और सूचकांक के संगत बफर में स्टोर करना है, और यदि एपीआई को उन्हें हर फ्रेम को सॉर्ट करने की चिंता करनी है, जो चीजें बहुत धीमी है।

इसके अलावा, सामग्री एपीआई में त्रिकोण के साथ सीधे जुड़े नहीं हैं, इसलिए ओपनजीएल के पास वास्तव में यह जानने का कोई तरीका नहीं है कि कौन से पारदर्शी हैं और जो लोग वास्तव में प्रस्तुत किए जाते हैं, वे तब तक अपारदर्शी होते हैं।

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