2011-01-04 8 views
6

Gibt es eine Möglichkeit, die Punktgröße beim Zeichnen von vielen Punkten zu variieren? Ich weiß, dass es die glPointSize (float) gibt, aber gibt es eine Möglichkeit, es in einem "Batch" oder Array zu tun?Wie kann ich die Punktgröße in OpenGL glBegin (GL_POINTS) variieren?

Ich möchte, dass die Punkte basierend auf einem Attribut der Daten unterschiedliche Größen haben. So wie jeder Punkt x, y, z und ein Größenattribut hat. Ich benutze Frame-Puffer jetzt in Java.

Könnte ich möglicherweise Vertex-Shader dafür verwenden?

Antwort

15

können Sie Punkt Sprite verwenden: enable es glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); verwenden und dann können Sie verwenden gl_PointSize Attribut in Ihr Vertex-Programm.

Vertex-Shader-Beispiel aus einem OpenGL discussion thread genommen:

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

Danke. Gibt es eine Möglichkeit, die Punktgröße mithilfe von Scheitelpunktattributen festzulegen, anstatt "gl_pointSize = gl_Normal.x" zu verwenden? – max

+0

Ich denke, dass Sie Ihr eigenes float-Attribut zu diesem Shader hinzufügen und 'glVertexAttrib1f' oder' glVertexAttribPointer' verwenden können, um es zu setzen. Sie können sich http://nehe.gamedev.net/data/articles/article.asp?article=21 ansehen. – tibur

+0

Ok. Vielen Dank. Sind Vertex-Attribute die Standardmethode, um zusätzliche Daten in einen Shader zu übertragen? – max

0

Mit GL_POINT_DISTANCE_ATTENUATION (GL14?), Um die Koeffizienten für eine Funktion festlegen kann (ich denke, es ist quadratisch ist) zum Berechnen Punktgröße von Z-Abstand.

+1

Es klingt, als ob das OP eine Größeneinstellung pro Punkt unabhängig von der Entfernung haben möchte. – genpfault

1

Das war, was immer ich tat,

//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

Erhöhung und die Punktgröße wirkt sich auf mehr als ein Pixel ab, aber Shadern sollen pro Pixel nur einmal ausgeführt werden. Es wird fehlschlagen, denn wenn das Shader-Programm einmal für ein bestimmtes Pixel ausgeführt wurde, kann sich die Änderung nur auf die folgenden Pixel auswirken, nicht aber auf die vorherigen Pixel.

Shader-Programme werden auf vielen Shader-Einheiten gleichzeitig und für viele Pixel parallel ausgeführt, was es unmöglich macht, das zu tun, was Sie versuchen zu tun. Die Einschränkung wird sein, dass man die Pixelgröße mit einem Shader-Programm einstellen kann, aber es behält seine Größe für alle Pixel, die das Shader-Programm ausführt.

Sie könnten versuchen, Ihre Punktdaten nach Größe zu sortieren und Punkte derselben Größe in einem Array zu gruppieren und jedes Array mit einer anderen Punktgröße zu zeichnen.

Oder Sie könnten versuchen, es mit einer Indirektion zu tun, wo Sie zuerst die verschiedenen Punktgrößen in eine Textur und in einem zweiten Durchlauf rendern die Pixel durch den Zugriff auf die Texturdaten und damit zu testen, ob ein Pixel gerendert werden soll (oder nicht).

+0

Hier ist viel falsch. Im GL werden die Shader niemals einmal pro Pixel ausgeführt. Vertex-Shader werden einmal pro (Eingabe-) Scheitelpunkt, Fragment-Shader einmal (oder sogar mehrmals) pro Fragment, Geometrieshader einmal pro Eingabe-Grundelement usw. ausgeführt.Und der GL unterstützt das Rastern von Punkten mit einer variablen Punktgröße, so dass für ein Primitiv mit einem Eckpunkt viele Fragmente erzeugt werden können. – derhass

Verwandte Themen