2011-01-04 5 views
6

C'è un modo per variare la dimensione del punto quando si traccia un sacco di punti? So che c'è glPointSize (float), ma c'è un modo per farlo in un 'batch' o array?Come posso variare la dimensione del punto in OpenGL glBegin (GL_POINTS)?

Desidero che i punti abbiano dimensioni diverse in base a un attributo dei dati. Come ogni punto che ha x, y, z e un attributo di dimensione. Sto usando i frame buffer in questo momento in Java.

Potrei forse usare vertex shader per questo?

risposta

15

È possibile utilizzare punto sprite: abilitarlo usando glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); e quindi è possibile utilizzare l'attributo gl_PointSize in il tuo programma di vertice.

Vertex Shader esempio tratto da un OpenGL discussion thread:

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

Grazie. C'è un modo per impostare la dimensione del punto usando gli attributi del vertice invece di usare 'gl_pointSize = gl_Normal.x'? – max

+0

Immagino che sia possibile aggiungere il proprio attributo float a quello shader e usare 'glVertexAttrib1f' o' glVertexAttribPointer' per impostarlo. Potresti dare un'occhiata a http://nehe.gamedev.net/data/articles/article.asp?article=21. – tibur

+0

Ok. Grazie. I vertici attribuiscono il modo standard di trasferire dati aggiuntivi in ​​uno shader? – max

0

Con GL_POINT_DISTANCE_ATTENUATION (GL14?) È possibile impostare i coefficienti di una funzione (penso che sia quadratica) per dimensione del punto computing di distanza Z.

+1

Sembra che l'OP desideri avere un'impostazione della dimensione per punto indipendente dalla distanza. – genpfault

1

Questo era quello che io abbia mai fatto,

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

Aumentare e diminuire la dimensione del punto colpisce più di un pixel, ma shader sono destinate ad essere eseguito solo una volta per pixel. Fallirà, perché una volta che il programma shader è stato eseguito per un particolare pixel, la modifica interesserà solo i seguenti pixel, ma non i pixel precedenti.

I programmi di ombreggiatura vengono eseguiti su molte unità di shader simultaneamente e per molti pixel in parallelo rendendo impossibile fare ciò che si sta tentando di fare. La limitazione sarà che si può impostare la dimensione del pixel con un programma shader, ma manterrà le sue dimensioni per tutti i pixel che il programma shader verrà eseguito.

Si potrebbe provare a ordinare i dati dei punti per dimensione e punti di gruppo della stessa dimensione in una matrice e disegnare ogni matrice con una dimensione punto diversa.

Oppure si potrebbe provare a farlo con un riferimento indiretto in cui per la prima volta da rendere le diverse dimensioni in punti in una texture e in un secondo passaggio rendere il pixel accedendo ai dati delle texture e di utilizzarlo per verificare se un pixel debba essere reso (o non).

+0

C'è molto sbagliato qui. Nel GL, gli shader non vengono mai eseguiti una volta per pixel. Gli shader vertici vengono eseguiti una volta per (input) vertice, framment shader una volta (o anche più volte) per frammento, shader geometrici una volta per input primitivo e così via.E il GL supporta la rasterizzazione dei punti con una dimensione punto variabile, così che per una primitiva con un vertice potrebbero essere generati molti frammenti. – derhass