2013-08-03 20 views
17

के साथ 2 डी बहुभुज पर एक सीमा रेखाचित्रण करना मेरे पास कुछ सरल बहुभुज (20 से कम शिखर) हैं जो एक साधारण एक्सई प्लेन पर फ्लैट प्रस्तुत करते हैं, GL_TRIANGLES और एक फ्लैट रंग, 2 डी सिमुलेशन का उपयोग करते हुए।एक टुकड़े टुकड़े

मैं चर बहुसंख्यक की सीमा और इन बहुभुजों के लिए एक अलग रंग जोड़ना चाहता हूं। मेरे पास एक ही शिखर और glLineWidth/GL_LINE_LOOP का उपयोग करके कुछ कार्यान्वित किया गया है, जो काम करता है, लेकिन एक और प्रतिपादन पास है और सभी कशेरुक परिवर्तनों को दोहराता है।

मुझे लगता है कि मुझे gl_FragCoord और vertex डेटा और/या बनावट निर्देशांक का उपयोग करके खंड टुकड़े में ऐसा करने में सक्षम होना चाहिए, लेकिन मुझे यकीन नहीं है, और मेरे निष्पक्ष प्रयास स्पष्ट रूप से गलत हैं।

मुझे कुछ ऐसा लगता है।

uniform vec2 scale; // viewport h/w 
uniform float line_width; 
uniform vec4 fill_color; 
uniform vec4 border_color; 

varying vec4 vertex; // in world coords 

void main() 
{ 
    if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width) 
    { 
     // we're close to the edge the polygon, so we're the border. 
     gl_FragColor = border_color; 
    } 
    else 
    { 
     gl_FragColor = fill_color; 
    } 
} 

जिस भाग को मैं समझने की कोशिश कर रहा हूं वह दूरी_from_edge फ़ंक्शन है - इसकी गणना कैसे की जा सकती है? Gl_FragCord को गलत दृष्टिकोण का उपयोग कर रहा है - क्या मुझे किसी प्रकार की बनावट मैपिंग का उपयोग करना चाहिए?

एक प्रयोग के रूप में मैंने कशेरुक को पिक्सेल स्पेस को स्केल के साथ परिवर्तित करने की कोशिश की, और उसके बाद उस दूरी और gl_FragCoord के बीच की दूरी की गणना पिक्सल में की, लेकिन यह अजीब परिणाम देता है कि मैं वास्तव में समझ में नहीं आया। इसके अलावा मुझे एज की दूरी की आवश्यकता है, कशेरुक नहीं, लेकिन मुझे यकीन नहीं है कि इसे कैसे प्राप्त किया जाए।

कोई भी विचार?

संपादित करें: निकोल की प्रतिक्रिया के आधार पर, मेरे सवाल का हो जाता है:

मान लिया जाये कि मैं एक त्रिकोण 3 कोने कोने किनारे कोने के रूप में चिह्नित के साथ है, और बीच में एक शीर्ष के रूप में चिह्नित किनारे के रूप में नहीं (ताकि में 3 त्रिकोण साथ गाया कुल), तो मैं किसी दिए गए मोटाई की सीमा खींचने के लिए टुकड़े टुकड़े में कैसे घुसपैठ कर सकता हूं? मुझे लगता है कि मैं टुकड़े के टुकड़े के साथ किनारे के झंडे को पास करता हूं, साथ ही साथ वांछित रेखा की मोटाई भी पास करता हूं, और यह किनारे के बीच की दूरी को समझने के लिए कुछ इंटरपोलेशन गणना करता है, किनारे के किनारों के बीच की दूरी को समझने के लिए, और रंग को सीमा के रूप में सीमा/सीमा के रूप में थ्रेसहोल्ड करता है ?

+1

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

+0

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

उत्तर

23

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

आप विपरीत चर से दूरी के रूप में प्रत्येक चरम के लिए बैरिएंट्रिक निर्देशांक के बारे में सोच सकते हैं। नीचे दिए गए आरेख में, वर्टेक्स पी 0 के विपरीत किनारे ई 1 है, और इसकी दूरी एच 1 द्वारा दर्शायी जाती है; इसका बैरिएंट्रिक समन्वय <0.0, h1, 0.0> है। जब रास्टरराइजेशन के दौरान टुकड़े उत्पन्न होते हैं तो जीपीयू त्रिज्या के लिए वर्टेक्स विशेषताओं को इंटरपोल करने के लिए आंतरिक रूप से इस समन्वय स्थान का उपयोग कर सकते हैं, यह त्रिभुज के भीतर स्थान के आधार पर प्रति-वर्टेक्स गुणों के भारोत्तोलन का त्वरित कार्य करता है।

Diagram illustrating the calculation of distance from each edge

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

उदाहरण के लिए, अगर एक शीर्ष एक बाहरी किनारे का हिस्सा नहीं है, तो आप इसे एक barycentric < 1,100,0 की तरह कुछ के समन्वय प्रदान करना चाहते हैं जाएगा> और जुड़े शिखर < 0,100,1> और इंटीरियर बढ़त होगा अनदेखा किया जा रहा है (माना जाता है कि यह कशेरुक < 0,1,0> नामित कशेरुक के विपरीत है, जैसा कि नीचे दिए गए आरेख में देखा गया है)। विचार यह है कि आप इस किनारे के साथ कभी भी 0.0 के पास कहीं भी इंटरपोलेट करने के लिए एक बिंदु नहीं चाहते हैं (या सीमा के हिस्से के रूप में आप एक टुकड़े को छायांकन के लिए जो कुछ भी थ्रेसहोल्ड उपयोग करते हैं), इसे त्रिभुज के केंद्र से बहुत दूर दूर करने की दिशा में विपरीत वर्टेक्स इसे हल करेगा।

Diagram showing how to exclude interior edges

ज्यामिति Shaders के बिना (OpenGL ES अनुकूल):

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

http://codeflow.org/entries/2012/aug/02/easy-wireframe-display-with-barycentric-coordinates/

ज्यामिति Shaders के साथ ( नहीं OpenGL ES अनुकूल):

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

http://strattonbrazil.blogspot.com/2011/09/single-pass-wireframe-rendering_10.html http://strattonbrazil.blogspot.com/2011/09/single-pass-wireframe-rendering_11.html

इस समाधान के लिए सैद्धांतिक आधार यहां पाया जा सकता (इंटरनेट पुरालेख वेबैक मशीन के सौजन्य से):

http://web.archive.org/web/ */http://cgg-journal.com/2008-2/06/index.html

+0

धन्यवाद, यह मुझे सही रास्ते पर है। मैंने गैर-ज्यामिति शेडर वायरफ्रेमिंग लागू की है और यह अच्छी तरह से काम करता है। अब मुझे अतिरिक्त गैर-परिधि वर्टेक्स में जोड़ने और उचित रूप से चिह्नित करने की आवश्यकता है। मैं पहले से ही अपने स्वयं के प्रयोगों में उस मार्ग को आंशिक रूप से नीचे चला गया था, किसी भी तरह, लेकिन 1 समन्वय के साथ, 3. – bloodearnest

+3

सैद्धांतिक आधार लिंक नीचे है, यहां एक [वैकल्पिक लिंक (वेब ​​संग्रह)] (https: //web.archive। org/वेब/20130607004602/http: //cgg-journal.com/2008-2/06/index.html)। एक ही व्यक्ति से एक और पेपर: [छिपे हुए लाइन हटाने के साथ एंटीअलाइज्ड वायरफ्रेम ड्राइंग के लिए दो तरीके] (http: //orbit.dtu।डीके/फेडोरा/ऑब्जेक्ट्स/कक्षा: 5545 9/डेटास्ट्रीम/फ़ाइल_3735323/सामग्री) – fedab

+0

दुर्भाग्यवश, यह तकनीक उन कलाकृतियों की ओर ले जाती है जहां सीमाएं चरम पर पहुंचती हैं। आंतरिक त्रिभुज किनारों सीमा के हिस्सों को "काट" सकते हैं: http://imgur.com/Btl6h2Y। – John

संबंधित मुद्दे