绘制大量点时有什么方法可以改变点的大小?我知道有 glPointSize(float),但是有没有办法在“批处理”或数组中做到这一点?
我希望这些点根据数据的属性具有不同的大小。比如每个点都有x、y、z和一个size属性。我现在在 java 中使用帧缓冲区。
我可以为此使用顶点着色器吗?
您可以使用点精灵:使用启用它glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
,然后您可以gl_PointSize
在顶点程序中使用属性。
顶点着色器示例取自OpenGL 讨论线程:
void main() {
gl_FrontColor=gl_Color;
gl_PointSize = gl_Normal.x;
gl_Position = ftransform();
}
这是我曾经做过的,
//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();
增加和减少点大小会影响多个像素,但着色器意味着每个像素只运行一次。它将失败,因为一旦为特定像素运行了着色器程序,更改只能影响后面的像素,而不影响前面的像素。
着色器程序同时在许多着色器单元上运行,并且并行运行许多像素,这使得您无法完成您想要做的事情。限制是可以使用着色器程序设置像素大小,但它将保持着色器程序运行的所有像素的大小。
您可以尝试按大小对点数据进行排序,并将相同大小的点分组到一个数组中,并用不同的点大小绘制每个数组。
或者您可以尝试使用间接方式进行操作,您首先将不同的点大小渲染到纹理中,然后通过访问纹理数据并使用它来测试是否应该渲染(或不渲染)像素来渲染像素。
使用GL_POINT_DISTANCE_ATTENUATION
(GL14?) 您可以设置函数的系数(我认为它是二次的),以从 Z 距离计算点大小。