2010-02-17 10 views
13

डायरेक्ट 3 डी का उपयोग करके लाइन सूचियों को चित्रित करते समय मैं लाइनों की मोटाई कैसे बदलूं?डायरेक्ट 3 डी लाइन मोटाई

This post कहता है कि लाइन चौड़ाई समर्थित नहीं है और कामकाज प्रदान करने के लिए आगे बढ़ती है। अन्य विकल्प?

जबकि हम इस विषय पर हैं, क्या शेडर्स डैश पैटर्न के साथ लाइनों को आकर्षित करने की अनुमति देते हैं?

उत्तर

14

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

यदि ज्यामिति शेडर एक विकल्प नहीं है, तो एक वर्कअराउंड वर्टेक्स शेडर का उपयोग करने के लिए हो सकता है, लेकिन इसके लिए आपके वीबी के कुछ पुन: कार्य की आवश्यकता होगी। ध्यान रखें कि वीएस को इसके बाद लाइन सेगमेंट का ज्ञान होना चाहिए ताकि आप अपने प्रत्येक वीबी तत्वों के लिए पी और पी + 1 को संग्रहित कर सकें, साथ ही सूचकांक/शिखर के डुप्लिकेशन की लागत (उपयोग की जाने वाली टोपोलॉजी के आधार पर) यदि आप अपनी लाइन को अनुक्रमित आदिम के रूप में प्रस्तुत करते हैं या नहीं)।

यदि प्रदर्शन कोई मुद्दा नहीं है, तो CPU पर विस्तार करना संभवतः जाने का तरीका है।

संपादित करें:

पानी का छींटा पैटर्न के बारे में: आप glLineStipple व्यवहार का अनुकरण करने के लिए भी एक ज्यामिति शेडर का उपयोग कर सकते हैं। यदि आपके पास GL_LINES टोपोलॉजी है, तो अलग लाइन कहनी है, पैटर्न प्रत्येक नए लाइन सेगमेंट पर पुनरारंभ होता है। तो आपको बस अपने लाइन सेगमेंट के स्क्रीन-स्पेस क्षैतिज प्रारंभ (या लंबवत प्रारंभ, अभिविन्यास के आधार पर) ज्यामिति शेडर में गणना करना होगा और इस अतिरिक्त इंफोस को पिक्सेल शेडर पर पास करना होगा। पिक्सेल शेडर कारक और पैटर्न मानों (डायरेक्टएक्स 10/11 इंटीजर और बिटवाई निर्देशों के अनुसार इसे आसान बनाता है) के अनुसार टुकड़ों को हटाने का उत्तरदायी होगा।

फिर से यह अच्छी तरह से काम करता है, और आप इसे अनुरूपित चौड़ाई रेखाओं (ऊपर उल्लिखित पहली तकनीक के साथ) के साथ जोड़ सकते हैं।

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

आप डायरेक्टएक्स 10 स्ट्रीम-आउट कार्यक्षमता का उपयोग करके एक अस्थायी वीबी में अपनी लाइन स्ट्रिप को प्रस्तुत करने के साथ प्राप्त कर सकते हैं (इस वीबी का प्रत्येक तत्व प्रत्येक खंड की स्क्रीन-स्पेस लंबाई से मेल खाता है)। फिर आपको इस वीबी के समांतर उपसर्ग योग (उर्फ स्कैन) करना होगा (प्रत्येक पंक्ति खंड लंबाई मान जमा करने के लिए)।

आखिरकार, आप अपनी लाइन स्ट्रिप GL_LINES के लिए प्रस्तुत करते हैं लेकिन पीएस में इस अतिरिक्त स्कैन वीबी सूचनाओं का उपयोग करते हैं।

13

रेखा मोटाई न केवल Direct3D द्वारा समर्थित है, लेकिन न ही यह वर्तमान में मौजूद किसी भी GPU द्वारा समर्थित है। ऐसा कोई GPU नहीं है जिसके बारे में मुझे पता है कि उचित लाइन भी खींचा जा सकता है (वे सभी नकली रेखाएं degenerate बहुभुज का उपयोग करके - यानी, दूसरा और तीसरा शिखर एक ही स्थिति में हैं, इसलिए त्रिभुज अनिवार्य रूप से एक पंक्ति में गिर जाता है)।

ओपनजीएल में लाइन चौड़ाई निर्धारित करना संभव है, ओपनजीएल चालक extruded quads (जो कि वर्तमान GPU द्वारा समर्थित नहीं है और प्रत्येक क्वाड के लिए दो त्रिकोणों का उपयोग करके अनुकरण किया जाता है) बनाता है ताकि "रेखाएं" स्क्रीन।

तो संभवतः उस उद्देश्य के लिए निकाले गए क्वाड बनाने के आसपास कोई रास्ता नहीं है। इसे प्राप्त करने के कई तरीके हैं, क्योंकि स्ट्रिंगर बेल ने अपने जवाब में बताया।

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

+0

यह एक दिलचस्प समाधान है। क्या आपने glLineWidth कॉल (प्रति पिक्सेल आधार पर) के मुकाबले एक ही परिणाम प्राप्त करने के लिए हासिल किया था? – Stringer

+0

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

+0

आप स्वयं को आजमा सकते हैं, बनावट निर्देशांक के लिए बस "लाइन पिक्सेल में लाइन लम्बाई" का उपयोग करें और उस बनावट के साथ रेखा को खींचें जिसमें उस पर एक कठोर पैटर्न है। आप आश्चर्यचकित होंगे कि पैटर्न कितना असमान है। कम से कम मैं था। ;-) – Pepor

0

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

SamplerState wrapTriLinear { 
    AddressU = WRAP; 
    AddressV = WRAP; 
}