2010-11-29 15 views
11

मैं एक तरह से एक GLSL शेडर के साथ इन "घुंडी" करने के लिए कुछ इसी तरह आकर्षित करने के लिए की तलाश में हूँ पर एक वृत्तओपन GLSL shader: एक फ्लैट बहुभुज

alt text

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

उत्तर

8

हाँ यह संभव है! इस GLSL स्क्रिप्ट जो कई अलग अलग आर्क्स ड्रॉ की जाँच करें:


#define between(v,x1,x2) (v>= x1 && v<=x2) 
#define pi 3.141592653589793238462643383279 

uniform sampler2D tex; 

void main() 
{ 
    vec2 pnt = vec2(0.5,0.5); 
    float dr = 0.005; 
    float fr = 0.15; 
    float r1 = fr; 
    float r2 = 1.5*fr; 
    float r3 = 2.0*fr; 
    float r4 = 2.5*fr; 
    float r5 = 3.0*fr; 
    float rp = distance(pnt,gl_TexCoord[0].xy); 
    vec4 col1 = vec4(0.4,0.1,0.,1.); 
    vec4 col2 = vec4(1.,1.,1.,1.); 
    float angle = atan(gl_TexCoord[0].y,gl_TexCoord[0].x); 
    vec4 rezcol; 
    rezcol = (between(rp,r1-dr,r1+dr) && between(angle,-pi,pi))? col1:col2; 
    rezcol = (between(rp,r2-dr,r2+dr) && between(angle,-pi,pi/3.1) && rezcol==col2)? col1:rezcol; 
    rezcol = (between(rp,r3-dr,r3+dr) && between(angle,-pi,pi/4.6) && rezcol==col2)? col1:rezcol; 
    rezcol = (between(rp,r4-dr,r4+dr) && between(angle,-pi,pi/8.8) && rezcol==col2)? col1:rezcol; 
    rezcol = (between(rp,r5-dr,r5+dr) && between(angle,-pi,pi/22.8) && rezcol==col2)? col1:rezcol; 
    gl_FragColor = rezcol; 
} 

जो इस प्रकार की छवि में जो परिणाम:

alt text

+0

नहीं सभी के सबसे सुरुचिपूर्ण दृष्टिकोण, मैं कहता हूँ चाहते हैं;) आप एक शाखा परिचय (? :) प्रति सर्कल, जिसे निश्चित रूप से टाला जा सकता है। इसके अलावा, कुछ चिकनाई के साथ बढ़ाया जा सकता है। (फिर भी, +1) – Kos

+0

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

11

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

यदि आप केवल एक चाप रंगना चाहते हैं, तो एटान (वाई, एक्स) के साथ कोण प्राप्त करें और जांचें कि यह किसी दिए गए सीमा के भीतर है या नहीं।

यदि आप किसी सर्कल के अंदर बिंदु निर्धारित करते हैं तो आप सरल के बजाय इंटरपोलेशन (चरण, चिकनी गति इत्यादि) का उपयोग करके मंडलियों को भी चिकना कर सकते हैं।

एक ऑप्टिमाइज़ेशन के रूप में, यदि आप इसके बजाय फोरा त्रिज्या^2 की जांच करते हैं तो केंद्र की दूरी की गणना करते समय आपको वर्ग रूट की गणना करने की आवश्यकता नहीं है।