2010-11-29 10 views
11

üzerine Daire Çiz çevreler ve benim uygulama bir topuzu yerine korkak bir ilerleme ölçer için değil. Sadece bir gölgelendirici kullanarak düz bir çokgen üzerinde daireler (veya daha çok yaylar) çekmek mümkün mü? Ve nasıl bir süreç başlayacak?openGL GLSL Shader:</p> <p><img src="https://i.stack.imgur.com/fQ5OL.jpg" alt="alt text"></p> <p>Sadece renkli çekmek istiyorum ben bir GLSL shader ile bu "düğmeleri" benzer bir şey çizmek için bir yol arıyorum düz poligon

cevap

8

Evet, bu mümkün! Birkaç farklı arklar çizer bu GLSL komut kontrol edin:

böyle görüntüde sonuçlanır

#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

tüm en zarif yaklaşım diyebilirim değil;) Sen (bir dalını tanıtmak kesinlikle kaçınılması gereken daire başına? Ayrıca, bazı düzgünleştirme ile uzatılabilir. (Yine, +1) – Kos

+0

Oyoyoy. Antialiassing sağlamak için bazı smoothstep atın. Ayrıca, çevreleriniz bir teğetle kesilir, daire merkezini geçen bir çizgi ile kesilmeli (dairelerin uçları, davasındakinin aksine, özellikle de en fazla 90 derecelik açıya sahip olmalıdır). –

11

Evet, bu mümkün. Doku koordinatlarını çokgene ayarlayın, böylece gölgelendiricide göreceli koordinatlara erişebilirsiniz (ör. -1, -1 ila 1,1 arasında çokgenin ortasını 0,0 yapar). Parça gölgelendiricide, pythagoran ile merkeze olan mesafeyi hesaplayın. Mesafe dairenin yarıçapından küçükse, piksel dairenin içinde. Daha sonra iki daire için yarıçap belirleyebilir ve dış çemberin içinde ve iç çemberin dışında ise pikseli renklendirebilirsiniz.

Sadece bir yayı renklendirmek isterseniz, açıyı (y, x) ile belirtin ve verilen aralıkta olup olmadığını kontrol edin.

Ayrıca, dairenin bir daire içinde olup olmadığını belirlerken, basit bir şekilde enterpolasyon (adım, yumuşak adım vb.) Kullanarak çevreleri de düzleştirebilirsiniz.

Ayrıca bir optimizasyon olarak, eğer kare againsta yarıçapını (^ 2) kontrol ederseniz merkeze olan mesafeyi hesaplarken karekök hesaplamak zorunda kalmazsınız.