2011-01-04 8 views
6

Có cách nào để thay đổi kích thước điểm khi vẽ nhiều điểm không? Tôi biết có glPointSize (float), nhưng có cách nào để làm điều đó trong một 'lô' hoặc mảng?Làm cách nào để thay đổi kích thước điểm trong OpenGL glBegin (GL_POINTS)?

Tôi muốn các điểm có các kích thước khác nhau dựa trên thuộc tính của dữ liệu. Chẳng hạn như mỗi điểm có x, y, z và thuộc tính kích thước. Tôi đang sử dụng bộ đệm khung ngay bây giờ trong java.

Tôi có thể sử dụng trình đổ bóng đỉnh cho điều này không?

Trả lời

15

Bạn có thể sử dụng điểm sprite: enable nó bằng cách sử glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); và sau đó bạn có thể sử dụng gl_PointSize thuộc tính trong chương trình đỉnh của bạn.

Vertex Shader dụ lấy từ một OpenGL discussion thread:

void main() { 
    gl_FrontColor=gl_Color; 
    gl_PointSize = gl_Normal.x; 
    gl_Position = ftransform(); 
} 
+0

Cảm ơn. Có cách nào để thiết lập kích thước điểm bằng cách sử dụng thuộc tính đỉnh thay vì sử dụng 'gl_pointSize = gl_Normal.x'? – max

+0

Tôi đoán rằng bạn có thể thêm thuộc tính float của riêng bạn vào shader đó và sử dụng 'glVertexAttrib1f' hoặc' glVertexAttribPointer' để thiết lập nó. Bạn có thể xem http://nehe.gamedev.net/data/articles/article.asp?article=21. – tibur

+0

Ok. Cảm ơn. Thuộc tính đỉnh có phải là cách tiêu chuẩn để chuyển dữ liệu bổ sung vào trình đổ bóng không? – max

0

Với GL_POINT_DISTANCE_ATTENUATION (GL14?), Bạn có thể thiết lập các hệ số cho một hàm (Tôi nghĩ đó là bậc hai) cho kích thước điểm tính từ Z xa.

+1

Có vẻ như OP muốn có cài đặt kích thước mỗi điểm độc lập với khoảng cách. – genpfault

1

Đây là những gì tôi từng làm,

//reset 
glLoadIdentity();         

//set size to 1 for a group of points 
glPointSize(1);          

//group #1 starts here  
glBegin(GL_POINTS);         

    //color of group #1 is white 
    glColor3f(1,1,1);         

    for(int a=0; a<x; a++) 
     for(int b=0; b<y; b++) 
        glVertex3f(a/953.,-b/413.,0.); //location of points 
glEnd(); 


//set size to 5 for another group of points 
glPointSize(5); 

//group #2 starts here  
glBegin(GL_POINTS); 

    //color of group #2 is red 
    glColor3f(1,0,0); 
    for(unsigned long int a=0; a<jd; a++) 
    { 
      glVertex3f(data[a].i,data[a].j,0); 
    } 
glEnd(); 
0

Tăng và giảm kích thước điểm ảnh hưởng đến hơn một pixel, nhưng shaders có nghĩa là để được chạy một lần duy nhất cho mỗi pixel. Nó sẽ thất bại, bởi vì khi chương trình đổ bóng đã được chạy cho một pixel cụ thể, có thể thay đổi chỉ ảnh hưởng đến các pixel sau, nhưng không ảnh hưởng đến các pixel trước đó.

Chương trình Shader được chạy trên nhiều đơn vị đổ bóng đồng thời và cho nhiều pixel song song khiến bạn không thể làm những gì bạn đang cố gắng làm. Giới hạn sẽ là người ta có thể thiết lập kích thước pixel với một chương trình đổ bóng, nhưng nó sẽ giữ kích thước của nó cho tất cả các pixel mà chương trình đổ bóng được chạy.

Bạn có thể cố sắp xếp dữ liệu điểm theo kích thước và điểm nhóm có cùng kích thước vào một mảng và vẽ từng mảng với kích thước điểm khác nhau. Hoặc bạn có thể thử làm điều đó với một điểm đầu tiên, nơi bạn lần đầu vẽ các kích thước điểm khác nhau thành một kết cấu và trong một lần thứ hai, kết xuất pixel bằng cách truy cập dữ liệu kết cấu và sử dụng nó để kiểm tra xem pixel có được hiển thị hay không (hoặc không phải).

+0

Có nhiều điều sai ở đây. Trong GL, các trình đổ bóng không bao giờ chạy một lần cho mỗi pixel. Vertex shaders được thực thi một lần cho mỗi đầu vào (đầu vào), đổ bóng phân đoạn một lần (hoặc thậm chí nhiều lần) trên mỗi đoạn, hình học đổ bóng một lần cho mỗi nguyên thủy đầu vào và như vậy.Và GL không hỗ trợ rasterization các điểm với một kích thước điểm biến, để cho một nguyên thủy với một đỉnh nhiều mảnh có thể được tạo ra. – derhass