12

绘制大量点时有什么方法可以改变点的大小?我知道有 glPointSize(float),但是有没有办法在“批处理”或数组中做到这一点?

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

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

4

5 回答 5

18

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

顶点着色器示例取自OpenGL 讨论线程

void main() {
    gl_FrontColor=gl_Color;
    gl_PointSize = gl_Normal.x;
    gl_Position = ftransform();
} 
于 2011-01-04T18:36:24.407 回答
3

这是我曾经做过的,

 //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();
于 2013-11-13T09:18:18.570 回答
1

我相信它与 glPointSize(GLfloat size)

资源:

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

于 2011-01-04T18:35:41.800 回答
0

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

着色器程序同时在许多着色器单元上运行,并且并行运行许多像素,这使得您无法完成您想要做的事情。限制是可以使用着色器程序设置像素大小,但它将保持着色器程序运行的所有像素的大小。

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

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

于 2014-07-21T18:07:26.030 回答
0

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

于 2011-01-04T19:58:40.883 回答