जब / जहां जाली छिपी हो, पोस्ट-प्रोसेस्ड मेश आउटलाइन को कैसे छिपाएं


10

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

हालांकि, मैं रूपरेखा को छिपाने में सक्षम नहीं हूं जब चयनित जाल दूसरे जाल के पीछे हो। यह मेरी प्रक्रिया को देखते हुए समझ में आता है, क्योंकि मैं केवल दृश्य के बाकी हिस्सों को प्रस्तुत करने के बाद एक फ्रेम बफर से 2d shader रूपरेखा प्रस्तुत करता हूं।

मेरे परिणामों के दो स्क्रीन कैप्चर नीचे हैं। पहली एक "अच्छी" रूपरेखा है, दूसरी वह जगह है जहां रूपरेखा एक जाल पर देखी जाती है जो रूपरेखा स्रोत को अवरुद्ध करती है।

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

रेंडरिंग प्रक्रिया इस तरह से चलती है: 1) हाइलाइट की गई जाली के केवल अल्फा को ड्रा करें, एक ब्लैक सिल्हूट को एक फ्रेम बफर (फ्रेमबफ़र 1) में कैप्चर करें।

2) फ़्रेमबफ़र 1 से दूसरे शेडर की बनावट को पास करें जो किनारे का पता लगाने का काम करता है। फ्रेमबीयर 2 में बढ़त पर कब्जा।

3) पूरे दृश्य को प्रस्तुत करें।

4) दृश्य के शीर्ष पर framebuffer2 से बनावट को प्रस्तुत करना।

मेरे पास कुछ विचार हैं कि कैसे पूरा करें और उनकी वैधता, या सरल या बेहतर तरीकों पर प्रतिक्रिया प्राप्त करने की उम्मीद कर रहा हूं।

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

परिणाम

इसे पूरा करने के लिए, मैंने हाइलाइट किए गए ऑब्जेक्ट के रेंडर पास के दौरान केवल एक परिभाषित करने की सोची, जो किसी भी दृश्यमान पिक्सेल के लिए अल्फा में सभी काले रंग को आकर्षित करेगा।

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

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


आपके रेपो पर एक नजर थी। क्या आपको कभी स्वीकार्य हल मिला?
आईकेएसआर

जवाबों:


0

मैं पूरे दृश्य को एक स्टेंसिल बफर में वांछित रूपरेखा के साथ थोड़ा सा सेट करने के लिए और कुछ और के लिए बिट को त्यागने / निकालने के लिए प्रस्तुत करना होगा।

फिर किनारे का पता लगाने से छुटकारा पाएं, आपको इसकी आवश्यकता नहीं है, इसके बजाय आप बफर को थोड़ा सा बढ़ा सकते हैं। तो प्रत्येक वस्तु बस थोड़ा बढ़ता है।

वहाँ से आप स्टैंसिल बफर आप की जरूरत रूपरेखा हो सकता है। यह सुनिश्चित करने के बारे में है कि आपके द्वारा प्रदान की जाने वाली अन्य वस्तुएं आपके स्टैंसिल बफर में बिट्स को बंद कर रही हैं।


2
उत्तर के लिए धन्यवाद। क्या यह विधि समान मुद्दों में नहीं चलेगी w / आउटलाइन मोटाई और अवतल आकृतियों को यदि स्केलिंग 3 डी में किया जाता है? या विस्थापन के मुद्दे अगर यह 2d में किया गया था और उल्लिखित वस्तु स्क्रीन के मृत केंद्र में नहीं है?
निल्स

0

1) एक फ्रेम बफर ऑब्जेक्ट में, आप समोच्च प्राप्त करने के लिए जीपीयू में एक लैपलैसियन शेडर चला सकते हैं।

2) आपको अंतिम गहराई बफर का उपयोग करना होगा जब आप एफबीओ में अपनी वस्तु खींचते हैं, तो इस तरह से आप एफबीओ में केवल अपनी वस्तु का दृश्य भाग खींचेंगे, और लैपेलियन केवल दृश्य भाग समोच्च करेगा।


हाय, उत्तर के लिए धन्यवाद। मैं पहले से ही मेरे पास की रूपरेखा प्राप्त करने के लिए ऐसा कर रहा हूं। मुझे नहीं लगता कि आप इस उत्तर के लिए एक अपमान के पात्र हैं, लेकिन इतना उत्कट है।
निल्स

0

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

तो मूल रूप से आप चयनित वस्तुओं के एक स्टैंसिल बफर बनाते हैं (या सभी ऑब्जेक्ट जो ऑब्जेक्ट को रोकते हैं, वास्तव में ... लेकिन मैं उन मामलों के बारे में चिंता नहीं करूंगा जब तक कि यह वास्तव में बहुत ऊपर नहीं आता है - अगर यह है कि क्रॉल किए गए लोग उम्मीद नहीं करने जा रहे हैं यह बहुत मदद करता है), और फिर यह आपकी वस्तु के लिए बाउंडिंग बॉक्स के एक स्टेंसिल के साथ है।

वह प्रभाव प्राप्त करना चाहिए जिसकी आपको तलाश है।

वैकल्पिक रूप से आप केवल 'खराब' परिणाम छोड़ सकते हैं और मुझे नहीं लगता कि अधिकांश लोग बहुत अधिक देखभाल करेंगे, हालांकि यह आपके डेटा / गेम और विशेष रूप से वस्तुओं के आकार पर निर्भर करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.