OpenGL几何图元和缓冲区(二)

我们在空间中绘制点时可以指定点的大小。默认情况下点的大小是一个像素,我们可以使用void glPointSize(GLfloat size)。但是点的大小是有限制的,我们可以使用下面的代码点大小的范围以及他们之间的间隔值。

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;
}

程序运行截图如下:

这边有一点需要注意,就是不同的平台或者硬件点的最大或最小的值可能会不一样。

......

你可能感兴趣的:(OpenGL)