如何在OpenGL glBegin(GL_POINTS)中改变点大小?

时间:2011-01-04 18:28:43

标签: opengl size glsl point

在绘制大量积分时有没有办法改变磅值?我知道有glPointSize(float),但有没有办法在'批处理'或数组中做到这一点?

我希望这些点根据数据的属性具有不同的大小。例如每个点具有x,y,z和大小属性。我现在正在java中使用帧缓冲区。

我可以使用顶点着色器吗?

5 个答案:

答案 0 :(得分:15)

您可以使用点精灵:使用glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);启用它,然后您可以在顶点程序中使用gl_PointSize属性。

OpenGL discussion thread获取的顶点着色器示例:

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

答案 1 :(得分:2)

这就是我做过的事,

 //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();

答案 2 :(得分:0)

我相信这是glPointSize(GLfloat尺寸)

来源:

  

http://www.talisman.org/opengl-1.1/Reference/glPointSize.html

答案 3 :(得分:0)

使用GL_POINT_DISTANCE_ATTENUATION(GL14?),您可以为从Z距离计算点大小设置函数的系数(我认为它是二次的)。

答案 4 :(得分:0)

增大和减小点大小会影响多个像素,但着色器只能在每个像素上运行一次。它会失败,因为一旦为特定像素运行了着色器程序,该更改只能影响后面的像素,而不会影响前面的像素。

着色器程序同时在许多着色器单元上运行,并且对于许多像素并行运行,因此无法完成您要执行的操作。限制将是可以使用着色器程序设置像素大小,但它将保持着色器程序运行的所有像素的大小。

您可以尝试按大小和相同大小的组点将点数据排序到一个数组中,并使用不同的点大小绘制每个数组。

或者您可以尝试使用间接方式,首先将不同的点大小渲染到纹理中,然后在第二遍中通过访问纹理数据渲染像素并使用它来测试是否应渲染像素(或不)。