2013-06-24 20 views
11

Sabit boru hattı kullanarak how to draw round points'u biliyorum. Ancak modern OpenGL kullanarak aynı şeyi yapmam gerekiyor. Mümkün mü, yoksa nokta sprite ve dokular mı kullanmalıyım? interested.Here için Modern OpenGL kullanarak yuvarlak noktalar çizimi

o sabit boru hattı ile yapılır nasıl:

 glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_NOTEQUAL, 0); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_POINT_SMOOTH); 
    glPointSize(8.0); 

    glMatrixMode(GL_PROJECTION); 
    glLoadMatrixf(myMatrix); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixf(myAnotherMatrix); 

    glBegin(GL_POINTS); 
    glColor3f(1,1,1); 

    glVertex3fv(position); 


    glEnd(); 
    glDisable(GL_POINT_SMOOTH); 
    glBlendFunc(GL_NONE, GL_NONE); 
    glDisable(GL_BLEND); 
+0

sen değilse, olsa da, sabit boru hattını kullanarak yuvarlak noktaları çizmek nasıl oldu nokta sprite ve dokular kullanarak? "GlPointSize", "GL_POINT_SMOOTH" ile birlikte mi kullanıyorsunuz? Bunun güvenilir bir yöntem olduğunu düşünmüyorum. –

+0

Bir kesmek vardır;) Güncellemeye bakın. –

cevap

7
+0

Aslında gölgelendiricilerde vodoo yapmadan mümkün olup olmadığını sormuştum ... Ama +1 bağlantıları için :) –

+4

Modern OpenGL'de * hiçbir şey * gölgeleyicilerde * hiçbir şey yapmadan * mümkün değildir. GL_POINT_SMOOTH'un voodoo'sunun tuhaf davranışını tercih ederim. –

+0

"Gölgelendiricilere voodoo" - bunun hakkında ne düşünmeniz gerektiği değil, sadece çizim çemberleriyle de ilgili. Programla daha iyi geçin, çünkü bu iş burada dışarıda nasıl yapılır. Sabit fonksiyon * eski * –

7

bir yolu daire-doku ve parça gölgelendirici kendi yapımı alfa testi ile Nokta hareketleri çizmek olurdu Bu, bir çember oldukça iyi tanımlanmış matematiksel bir kavramdır. Dolayısıyla, sadece bütün noktası mevcut parçasını temsil eden [0,1] karenin bir parçası olduğu söyleyen tek gl_PointCoord kontrol edin:

vec2 coord = gl_PointCoord - vec2(0.5); //from [0,1] to [-0.5,0.5] 
if(length(coord) > 0.5)     //outside of circle radius? 
    discard; 
+0

Neden ben alfa testine ihtiyacım var? daha sonra donanım alfa harmanlama yeterli olmalıdır. Yapmamalı mı? –

+0

@MichaelIV Ancak alfa testi artık kullanılmıyor ve artık çekirdek profilin bir parçası değil. Belki alfa harmanlama sizin için yeterlidir, ancak mümkünse genellikle alfa testi tercih edilir, çünkü derinlik arabelleğini "görünmez" parçalarla kirletmez (ve ayrıca 'erken atmaktan' biraz daha hızlı olabilir). Ve dediği gibi, doku olmayan yöntem zaten daha iyi olurdu. –

+0

@MichaelIV Çok sayıda opak ancak yuvarlak parçacıklar (yay, konfeti zamanı!) Çekmek istediğinizi düşünün. Sadece alfa harmanlama yerine alfa testi kullanırken, parçacıklarınızı derinlemesine sıralamaya gerek yoktur. Parçacıklar yine de şeffaf olsalar bile, bunları sıralamanız ve alfa harmanlama kullanmanız gerekir, bu nedenle 'discard' dan gerçekten bir fonksiyon iyileştirmesi olmayabilir. –