OpenGL में पारदर्शिता प्रदान करने के लिए कुछ तरीके क्या हैं


14

सतहों को पारदर्शी बनाने के लिए अल्फा सम्मिश्रण को चालू किया जा सकता है, जैसे:

glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

लेकिन यह केवल तभी काम करता है जब वस्तुओं को सामने के क्रम में वापस किया जाता है। अन्यथा पृष्ठभूमि में चीजें करीब की वस्तुओं के सामने दिखाई देती हैं, जैसे नीचे की छवि में फर्श। कणों और GUI तत्वों के लिए छंटनी ठीक होगी, लेकिन त्रिकोण मेश के लिए ऐसा लगता है कि यह बहुत अधिक प्रयास और धीमा होगा, जैसा कि यहां चर्चा की गई है: https://www.opengl.org/wiki/Transparency_Sorting

इससे निपटने के लिए सामान्य तरीके क्या हैं? मुझे पता है कि यह काफी व्यापक है और गहन कार्यान्वयन विवरणों के बाद नहीं है, बस कुछ दृष्टिकोणों का संक्षिप्त विवरण और इसमें क्या शामिल हो सकता है।

यहाँ छवि विवरण दर्ज करें


मुझे यकीन नहीं है कि यह एक उत्तर के रूप में जाना चाहिए या नहीं, लेकिन आपकी छवि की त्रुटियां सभी प्राथमिकताओं पर गहराई से परीक्षण किए बिना प्रदान करने के कारण होती हैं । आपको दृश्य को 2 पास में प्रस्तुत करना चाहिए: पहले सभी सामान्य ज्यामिति को प्रस्तुत करें। बाद में, अक्षम गहराई राईट (नहीं GL_DEPTH_TEST) और प्रस्तुत करना पारदर्शी ज्यामिति में मोटे तौर पर बैक-टू-सामने आदेश। यह सुनिश्चित करेगा कि पारदर्शी ज्यामिति ठोस ज्यामिति के सामने नहीं खींची जाएगी जो इसके सामने है।
युरिक्स

@yuriks इस मामले में यह मेरी ओर से शायद एक खराब उदाहरण है, लेकिन सब कुछ पारदर्शी होना है। मैं कुछ दिखाना चाहता था कि बुरी तरह से किए जाने पर गलत पारदर्शिता कैसे दिख सकती है। इसके अलावा एक उदाहरण जहां ज्यामिति को छांटना आश्चर्यजनक रूप से कठिन होगा (उदाहरण के लिए यहां फर्श एक विशाल बहुभुज है और पूरी गहराई सीमा को कवर करता है)।
jozxyqk

जवाबों:


11

स्पष्ट आदेश से बचने के लिए तकनीकों का एक सेट ऑर्डर इंडिपेंडेंट ट्रांसपेरेंसी (संक्षेप में OIT) के नाम से जाना जाता है।

बहुत सारी OIT तकनीकें हैं।

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

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

मूल पेपर के अलावा, वेटेड ब्लेंडेड OIT के विवरण और समस्याओं के कार्यान्वयन के लिए एक महान संसाधन मैट पेटिटिनो के ब्लॉग में है । जैसा कि आप उनके पोस्ट से पढ़ सकते हैं कि यह तकनीक चांदी की गोली नहीं है। मुख्य समस्या यह है कि भार योजना केंद्रीय है और इसे आपके दृश्य / सामग्री के अनुसार ट्यून करने की आवश्यकता है। उनके प्रयोगों से, जबकि तकनीक अपेक्षाकृत कम और मध्यम अस्पष्टता के लिए ठीक काम करने लगती है, यह तब विफल हो जाता है जब अपारदर्शिता 1 तक पहुंच जाती है और इसलिए उन सामग्रियों से उपयोग नहीं किया जा सकता है जहां सतह का बड़ा हिस्सा अपारदर्शी है (वह पर्ण का उदाहरण बनाता है)।

फिर, सभी नीचे आते हैं कि आप अपने गहराई-वजन को कैसे ट्यून करते हैं और उन लोगों को ढूंढते हैं जो आपके उपयोग-मामलों को पूरी तरह से फिट करते हैं, जरूरी नहीं कि तुच्छ हो।

भारित मिश्रित ओआईटी के लिए क्या आवश्यक है, इसके लिए दो अतिरिक्त रेंडर लक्ष्यों से अधिक कुछ भी नहीं है। एक जिसे आप प्रीफ़िल्टेड अल्फा रंग (रंग * अल्फा) और अल्फा के साथ भरते हैं, दोनों तदनुसार भारित होते हैं। केवल वजन के लिए अन्य एक।


6

एक विकल्प गहराई छीलने का उपयोग करना है।

अनिवार्य रूप से, दृश्य दृश्य nको निकटतम, दूसरे-निकटतम, सभी nदृश्य के निकटतम-निकटतम टुकड़ों के लिए निर्धारित करने के क्रम में दृश्य की एक निर्धारित संख्या (जैसे, समय) को संसाधित करता है ।

यह प्रसंस्करण पहले पूरे दृश्य के लिए एक नियमित गहराई परीक्षण लागू करके किया जाता है (जो स्वाभाविक रूप से निकटतम सतह लौटाता है)। एक तो गहराई परीक्षण में लौटे की तुलना में कम गहराई के साथ सब कुछ अनदेखा करके, पहली परत को छानने के लिए गहराई परीक्षण के परिणाम का उपयोग करता है।

डेप्थ टेस्ट फिर से लागू करने के बाद दूसरी परत वापस आ जाएगी। आवश्यकतानुसार दोहराएं।

एक बार जब आपके पास परतें होती हैं, तो आप सभी परतों को रिवर्स ऑर्डर में रख सकते हैं (यह मानते हुए कि आप प्रत्येक परत के लिए RGBA रंगों का ट्रैक रखते हैं), सामान्य रूप से सम्मिश्रण करते हैं, क्योंकि परतें बैक-टू-बैक ऑर्डर में हैं।


1
धन्यवाद! ऐसा लगता है कि मुझे इसके लिए दो गहराई वाले बफ़र्स की आवश्यकता होगी। यानी एक को अंतिम गहराई तक स्टोर करने और फ़िल्टर करने के लिए, और एक को वर्तमान रेंडर के लिए गहराई से परीक्षण करने के लिए। अगर मैं गलत हूं तो मुझे सुधारें लेकिन मुझे लगता है कि मुझे FBO के लिए दो गहराई वाले बनावट की आवश्यकता होगी जिसे मैं प्रत्येक छीलने वाले पास के बीच स्वैप करता हूं।
jozxyqk

1
@jozxyqk सही, इस प्रक्रिया के लिए दो गहराई वाले बफर आवश्यक हैं।
es1024

1

सिंगल-पास नो (या कुछ) के creme de la creme ओपनजीएल में पारदर्शिता से समझौता एक ए-बफर है। आधुनिक ओपनजीएल के साथ, इसे लागू करना संभव है:

http://blog.icare3d.org/2010/06/fast-and-accurate-single-pass-buffer.html

यह गहराई से छीलने के कई पास से बचा जाता है और इसके लिए पर्याप्त छंटाई की आवश्यकता नहीं होती है।


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