2012-07-07 21 views
6

हमारे पास आईओएस ड्राइंग ऐप है। वर्तमान में, ड्राइंग ओपनजीएल ES 1.1 के साथ कार्यान्वित किया गया है। हम बेजियर वक्र जैसे लाइनों को सुचारू बनाने के लिए कुछ एल्गोरिदम का उपयोग करते हैं। इसलिए, जब स्पर्श घटनाएं होती हैं, तो हमें टच इवेंट पॉइंट्स (एल्गोरिदम के आधार पर) के कुछ बिंदु मिलते हैं और इन बिंदुओं को आकर्षित करते हैं। हम अंक के लिए ब्रश बनावट का भी अधिक प्राकृतिक रूप देखने के लिए उपयोग करते हैं।ओपनजीएल ईएस 2.0 शेडर्स के साथ चिकनी बनावट लाइन

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

enter image description here

अंक P0, पी 1, पी 4 ... यहाँ स्पर्श घटनाओं और लाल वक्र पर अंक हैं - उत्पादन अंक, टी के लिए इस तरह के कदम के साथ इतना है कि वक्र पर दो पड़ोसी बिंदुओं के बीच दूरी अधिक से अधिक नहीं है 1 पिक्सेल से अधिक। Bézier curve - Wikipedia, the free encyclopedia

किसी भी मदद की बहुत सराहना की है:

और यहाँ बेज़ियर एल्गोरिथ्म स्पष्टीकरण के साथ संबंध है। धन्यवाद।

+0

क्या आप अधिक विशिष्ट हो सकते हैं? हम आपको यह नहीं बता सकते कि क्या एक शेडर में एक विशेष एल्गोरिदम लागू करना संभव है यदि हम नहीं जानते कि एल्गोरिदम क्या है! – user1118321

+0

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

उत्तर

6

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

तो आपको एक चिकनी पर्याप्त वक्र की गारंटी के लिए पर्याप्त शिखर से बने लाइन स्ट्रिप को खींचना होगा। आप क्या कर सकते हैं हमेशा एक ही लाइन स्ट्रिप में डाल दिया जाता है, जिसमें वक्र पैरामीटर मान टी को 1 डी वर्टेक्स स्थितियों के रूप में रखा जाता है। शेडर में आप डीकैस्टेलजौ एल्गोरिदम (या जो कुछ भी) और पी 0 से पी 4 के लिए वक्र पर वास्तविक 2 डी/3 डी स्थिति की गणना करने के लिए इस इनपुट स्थिति (पैरामीटर मान) का उपयोग करते हैं, जिसे आपने शेडर में स्थिरांक के रूप में रखा है (वर्दी चर जीएलएसएल शर्तों में)।

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

लेकिन एक बार फिर, आप 5 नियंत्रण बिंदुओं में नहीं डाल सकते हैं और GPU पर एन वक्र पॉइंट उत्पन्न नहीं कर सकते हैं। कशेरुक शेडर हमेशा एक कशेरुक पर काम करता है और परिणाम एक कशेरुक में होता है, वैसे ही टुकड़ा शेडर हमेशा एक टुकड़े पर काम करता है (पिक्सेल कहें, हालांकि यह अभी तक एक नहीं है) और परिणामस्वरूप एकल (या नहीं) खंड ।

+0

बहुत व्यापक उत्तर के लिए धन्यवाद! मैं कोड को स्पष्ट करने और कुछ प्रदर्शन प्राप्त करने का एक तरीका ढूंढ रहा था। लेकिन, जैसा कि मैंने देखा, यह मामला नहीं है। वैसे, आपने बहुत ही रोचक दृष्टिकोण का सुझाव दिया, जिसमें 1 डी लाइन गुजरती है जो टी का प्रतिनिधित्व करती है। मैं इसके बारे में सोचूंगा। –

+0

ज़रूर :) मैंने अभी नई लाइन से लिखने के लिए एंटर दबाया और यह टिप्पणी भेजी :) फिर से धन्यवाद! –