इकाई चयन मंडल कैसे बनाएं?


16

मैं जानना चाहता हूं कि मर्ज किए गए सर्कल चयन के इस प्रभाव को कैसे बनाया जाए। यहाँ चित्रण करने के लिए चित्र हैं:

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

मूल रूप से मैं इस आशय की तलाश में हूँ:

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

मंडलियों के विलय के प्रभाव को कैसे प्राप्त किया जा सकता है? मुझे इस आशय से संबंधित कोई स्पष्टीकरण नहीं मिला। मुझे पता है कि उन बनावट को प्रोजेक्ट करने के लिए मैं एक डीक्ल प्रणाली विकसित कर सकता हूं लेकिन मुझे नहीं पता कि विलय प्रभाव कैसे बनाया जाए।

यदि संभव हो तो, मैं पूरी तरह से shaders समाधान के लिए देख रहा हूँ।


क्या आप बता सकते हैं कि "मर्ज इफेक्ट" से आपका क्या मतलब है?
वंद्रा

बेशक, यदि आप स्क्रीनशॉट के शीर्ष दाएं अक्षरों को देखते हैं, तो डिकल्स एक दूसरे को पार नहीं कर रहे हैं, लेकिन बाईं ओर दोनों अपने नीले वृत्त को पार करते हैं और विलय कर रहे हैं। मैंने प्रभाव दिखाने के लिए एक नया स्क्रीनशॉट जोड़ा।
MaT

क्या आप shader समाधान पर जोर देते हैं? यदि नहीं, तो आपने इसे अपनी अंतिम तस्वीर में हल कर लिया है।
wondra

अंतिम स्क्रीनशॉट केवल वह प्रभाव दिखाता है जो मैं लक्षित कर रहा हूं। अंतिम परिणाम पिछले स्क्रीनशॉट की तरह दिखना चाहिए।
MaT

1
हां, मैं सहमत हूं, मुझे लगता है कि वे गतिशील रूप से बनावट के साथ एक मेष सर्कल का निर्माण करते हैं और फिर उन्हें विलय करने के लिए जाल काटते हैं। यह एक अच्छा समाधान भी है, लेकिन मुझे लगता है कि यह आपके द्वारा किए जाने वाले प्रभाव की अवधि में अधिक सीमित है।
MaT

जवाबों:


8

आप कर सकते हैं कुछ गुर हैं:

जेड बफर

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

पूरी तरह से पारदर्शी होने का मतलब है कि सर्कल केवल जेड-बफर (अधिकतम जेड मूल्य) को लिखा जाता है । अब जब आप decals प्रदान करते हैं, तो उन्हें Z बफर मानों के खिलाफ परीक्षण किया जाता है, और यदि वे परीक्षण पास कर रहे हैं तो वे प्रदान करते हैं (जो केवल मंडलियों के बाहर होता है)

स्टैंसिल

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


जेड-बफर तकनीक दिलचस्प है, लेकिन मुझे यह नहीं मिलता है कि पहला पारदर्शी सर्कल जमीन के डिकल्स को कैसे क्लिप कर सकता है।
MaT

0

आप उदाहरण के लिए decal प्रतिपादन पिक्सेल shader में जाँच कर सकते हैं यदि कोई अन्य decals के साथ एक प्रतिच्छेदन है और यदि ऐसा है तो पिक्सेल को मार दें। इस तरह के परिपत्र decals के लिए करना काफी कुशल है।


1
मुझे लगता है कि आपने अपने उत्तर से भाग को छोड़ दिया है - सभी हलकों स्थानों और त्रिज्याओं को पास करने के लिए।
Kromster का कहना है कि

@ अगर ओपी समाधान में कोई दिलचस्पी व्यक्त करता है, तो मुझे अधिक जानकारी देने में खुशी होगी।
जार्कोएल

0

क्या आपका मतलब उन नीले घेरों से है?

ऐसा करने का एक स्मार्ट तरीका हो सकता है लेकिन मेरे समाधान को एक उदाहरण के रूप में समझें कि यह कैसे किया जा सकता है। स्क्रीन के आकार की एक अलग खाली बनावट के लिए अपनी मंडलियों को रेंडर करें। इस बिंदु पर आप उन्हें एक साथ मिला सकते हैं, हालाँकि आप चाहते हैं। अपनी आवश्यकताओं के आधार पर आप पूर्ण रंग या बस दी गई जानकारी को लिख सकते हैं जो दिए गए पिक्सेल पर एक सर्कल मौजूद है। हालांकि, आपको निश्चित रूप से प्रत्येक पिक्सेल के लिए एक गहन जानकारी की आवश्यकता होगी जो आप लिखते हैं यदि आप जेड-टेस्ट प्रभाव चाहते हैं।

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


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

Edit2: अपने सरल लाल / हरे उदाहरण के लिए: इससे पहले कि आप किसी भी पिक्सेल को प्रस्तुत करें, यह जांचें कि क्या यह पिक्सेल पहले से हरा नहीं है। यदि यह है, तो प्रस्तुत न करें। यह चाल चलेगा। वास्तव में, बनावट को लिखते समय आप सर्कल के बाहर / अंदर लाल / हरे रंग का उपयोग कर सकते हैं, और फिर इलाके का प्रतिपादन करते हुए उन मूल्यों को पढ़ सकते हैं और उन्हें वांछित रंग में परिवर्तित कर सकते हैं।

अगर किसी भी मौके पर मेरा जवाब बहुत सार है, तो मुझे बताएं।


मैं सामान्य विचार प्राप्त करता हूं, लेकिन जैसा कि आप कहते हैं, यह मेरे लिए मर्ज किए गए मंडलियों के विषय में थोड़ा सा सार है :)
MaT

0

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

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

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

मान लें कि आपके पास दो वृत्त हैं जो xy-plane के समानांतर हैं, (X1, y1, z) और (x2, y2, z) केंद्रों पर। और आपके पास ये कार्य हैं:

// Draw interior part of circle, shown in green in the schematic in the question.
drawInterior(x, y, z);

// Draw outline of circle, shown in red in the schematic in the question.
drawOutline(x, y, z);

deltaएक छोटा सा ऑफसेट होने के साथ ड्राइंग का क्रम इस तरह दिखता है :

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
drawInterior(x1, y1, z + delta);
drawInterior(x2, y2, z + delta);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
drawOutline(x1, y1, z);
drawOutline(x2, y2, z);

0

मेरे सिर के ऊपर से, अगर ये डिकल्स डिस्क के रूप में खींचे जाते हैं, तो मैं प्रत्येक सर्कल को एक दूसरे सर्कल के खिलाफ चौराहे के लिए परीक्षण करूंगा, और चौराहे के बिंदुओं को एक सरणी में डालूंगा। फिर एक चौराहे के अंदर नहीं है कि चाप खींचना। यह एक shader समाधान नहीं है, हालांकि।


हाँ, मैंने इसके बारे में भी सोचा था :) लेकिन जैसा कि आपने कहा कि यह एक shader समाधान नहीं है और यह बहुत सामान्य समाधान नहीं है। लेकिन धन्यवाद !
MaT

यह बहुत अस्पष्ट वर्णन है
क्रॉम्स्टर का कहना है कि मोनिका

0

आप यहाँ stenciling चाहते हैं। आपका पहला पास स्टैंसिल बफर को हलकों को प्रस्तुत करता है। दूसरा पास दृश्यमान रूपरेखा प्रस्तुत करता है , कहीं भी स्टैंसिल बफर नहीं बदला है। दूसरे पास में ज्यामिति का उपयोग करना चाहिए जो पहले पास से बड़ा है, इस मामले में, एक साधारण रैखिक स्केलर पर्याप्त है।

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


धन्यवाद! इसलिए पहले दिखाई देने वाले हिस्सों को खींचने के बजाय मुझे पारदर्शी हलकों को स्टैंसिल में प्रस्तुत करना शुरू करना चाहिए। लेकिन मैं गोल पारदर्शी सर्कल कैसे प्रस्तुत करूं? मैं स्टैंसिल में प्रदान की जाने वाली छवि के कुछ हिस्सों को सीमित नहीं कर सकता। जब मैं स्टैंसिल को प्रस्तुत करता हूं, तो सब कुछ वहां चला जाता है, क्या मैं सही हूं?
Doodlemeat

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

हम्म, पहले स्टैंस बफर को लिखने के लिए एक काले / सफेद छवि होने के बारे में क्या है ताकि ब्लैक 0 हो जाए और स्टेंसिल में सफेद 1 हो जाए। क्या यह भी संभव है?
Doodlemeat

यही कारण है कि मैं एक दूसरे बनावट मुखौटा से मतलब था। मुझे पूरा यकीन है कि यह काम करेगा, मैं वास्तव में मेरे सामने एकता के बिना सत्यापित नहीं कर सकता, जो कि मेरे पास 24 घंटे से अधिक नहीं होगा।
Draco18s अब SE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.