GLfloat size[2]; //存储点大小的最小和最大值
GLfloat step; //存储点大小增量
glGetFloatv(GL_POINT_SIZE_RANGE,size); //size[0]和size[1]分别存储最小和最大值
glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step); //获取增量大小
有一点需要提一下,就是点不会因为离视点远或者进大小发生变化。
下面的一个示例程序,它所做的就是画一个螺旋形并且点的大小从最小逐渐增加为最大。
#include
#include
#define GL_PI 3.1415f
void RenderScene(void)
{
GLfloat x,y,z,angle;//坐标和角度
glClear(GL_COLOR_BUFFER_BIT); //清除颜色
GLfloat size[2]; //存储点大小的范围
GLfloat step;//存储点大小的增量
GLfloat curSize;//存储当前的点大小
glGetFloatv(GL_POINT_SIZE_RANGE,size);//获取点大小的范围
glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);//获取点大小的增量
curSize = size[0];//初始化点大小
z = -50.0f;
//保存矩阵状态并旋转
glPushMatrix();
glRotatef(30.0f,1.0f,0.0f,0.0f);
glRotatef(60.0f,0.0f,1.0f,0.0f);
z = -50.0f;
for(angle = 0.0f; angle <= (2.0f * GL_PI)*3.0f; angle += 0.1f)
{
x = 50.0f*sin(angle);
y = 50.0f*cos(angle);
glPointSize(curSize);
glBegin(GL_POINTS);
glVertex3f(x,y,z);
glEnd();
z += 0.5f;
curSize += step;
}
glPopMatrix();
glutSwapBuffers();
}
//当窗口大小变化时调用
void ChangeSize(GLsizei w,GLsizei h)
{
GLfloat nRange = 100.f;
if(0 == h)
h = 1;
//设置视口
glViewport(0,0,w,h);
//重置投影矩阵堆栈
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//建立裁剪区
if(w <= h)
glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);
else
glOrtho(-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);
//重置模型视图矩阵堆栈
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//设置渲染
void SetupRC(void)
{
glClearColor(0.0f,0.0f,0.0f,1.0f); //背景黑色
glColor3f(0.0f,1.0f,0.0f); //绘图颜色为绿色
}
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("OpenGL Sample");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
glutMainLoop();
return 0;
}
程序运行截图如下:
这边有一点需要注意,就是不同的平台或者硬件点的最大或最小的值可能会不一样。
......