2013-06-24 55 views
11

hiện đại Tôi biết how to draw round points sử dụng đường ống cố định. Tuy nhiên tôi cần phải làm tương tự bằng cách sử dụng OpenGL hiện đại. Có thể, hoặc tôi nên sử dụng sprites điểm và kết cấu?Vẽ các điểm tròn bằng cách sử dụng OpenGL

Đối với interested.Here là cách nó được thực hiện với đường ống cố định:

 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

Làm sao bạn vẽ điểm tròn bằng cách sử dụng đường ống cố định, tuy nhiên, nếu không muốn nói bằng cách sử dụng sprites điểm và kết cấu? Bạn có sử dụng 'glPointSize' cùng với' GL_POINT_SMOOTH' không? Tôi không nghĩ đó là phương pháp đáng tin cậy. –

+0

Có một hack;) Xem cập nhật. –

Trả lời

7
+0

Trong thực tế, tôi đã hỏi nếu nó có thể mà không làm vodoo trong shaders ... Nhưng 1 cho các liên kết :) –

+4

Hiện đại OpenGL * không có gì * là có thể mà không làm * bất cứ điều gì * trong shaders, mặc dù. Tôi muốn gọi hành vi kỳ lạ của voodoo 'GL_POINT_SMOOTH'. –

+0

"voodoo in the shaders" - không phải cách bạn nên suy nghĩ về nó, và không chỉ đối với các vòng tròn vẽ. Tốt hơn với chương trình, vì đây là cách nó được thực hiện từ đây trở đi. Chức năng cố định là * legacy * –

7

Một cách sẽ được để vẽ sprite điểm với một vòng tròn-kết cấu và thử nghiệm alpha tự thực hiện trong shader đoạn:

uniform sampler2D circle; 

void main() 
{ 
    if(texture(circle, gl_PointCoord).r < 0.5) 
     discard; 
    ... 
} 

Nhưng trong thực tế, bạn thậm chí không cần một kết cấu cho điều này, vì vòng tròn là một khái niệm toán học được xác định khá rõ ràng. Vì vậy, chỉ cần kiểm tra chỉ gl_PointCoord, mà nói, trong đó một phần của [0,1] vuông đại diện cho toàn bộ các điểm đoạn hiện tại của bạn là:

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

Tại sao tôi cần thử nghiệm alpha tự thực hiện? sau đó pha trộn alpha phần cứng là đủ. Phải không? –

+0

@MichaelIV Nhưng thử nghiệm alpha không còn được dùng nữa và không phải là một phần của hồ sơ cốt lõi nữa. Có thể trộn alpha đủ cho bạn, nhưng thường thử nghiệm alpha sẽ được ưu tiên nếu có thể, vì nó không gây ô nhiễm bộ đệm độ sâu với các mảnh "vô hình" (và cũng có thể nhanh hơn một chút, vì 'discard' là một phần đầu). Và như đã nói, phương pháp không có kết cấu sẽ tốt hơn. –

+0

@MichaelIV Hãy tưởng tượng bạn muốn vẽ nhiều hạt đục nhưng tròn (yay, confetti time!). Khi sử dụng thử nghiệm alpha thay vì chỉ pha trộn alpha, thì hoàn toàn không cần phải phân loại chi tiết các hạt của bạn. Tuy nhiên, nếu các hạt trong suốt, bạn vẫn cần phải sắp xếp chúng và sử dụng pha trộn alpha, vì vậy có thể thực sự không phải là một cải tiến chức năng từ 'discard'. –

Các vấn đề liên quan