VS2012下基于Glut OpenGL绘制直线(添加设置直线宽度)示例程序

在VS2012下使用glut绘制一系列直线的示例程序,绘制的是平行的几条直线,每条直线的宽度都不一样,效果如下图所示,按PC的UP,DOWN,LEFT,RIGHT按键可以从不同的角度查看该图形:

VS2012下基于Glut OpenGL绘制直线(添加设置直线宽度)示例程序_第1张图片

VS2012下基于Glut OpenGL绘制直线(添加设置直线宽度)示例程序_第2张图片

[cpp] view plaincopy

  1. // GlutLineswDemo.cpp : 定义控制台应用程序的入口点。  

  2. //  

  3. #include "stdafx.h"  

  4. #include <gl/glut.h>  

  5. #include <math.h>  

  6. //圆周率宏  

  7. #define GL_PI 3.1415f  

  8. //获取屏幕的宽度与高度  

  9. GLint SCREEN_WIDTH=0;  

  10. GLint SCREEN_HEIGHT=0;  

  11. //设置程序的窗口大小  

  12. GLint windowWidth=400;  

  13. GLint windowHeight=300;  

  14. //绕x轴旋转角度  

  15. GLfloat xRotAngle=0.0f;  

  16. //绕y轴旋转角度  

  17. GLfloat yRotAngle=0.0f;  

  18. //受支持的线宽大小范围  

  19. GLfloat width[2];  

  20. //受支持的线宽增量  

  21. GLfloat widthStep;  

  22. //显示回调函数  

  23. void renderScreen(void){  

  24.     GLfloat x,y,z,angle;  

  25.     //当前线的宽度  

  26.     GLfloat curWidth=0.0f;  

  27.     //把整个窗口清理为当前清理颜色:黑色  

  28.     glClear(GL_COLOR_BUFFER_BIT);  

  29.     //将当前Matrix状态入栈  

  30.     glPushMatrix();  

  31.     //坐标系绕x轴旋转xRotAngle  

  32.     glRotatef(xRotAngle,1.0f,0.0f,0.0f);  

  33.     //坐标系绕y轴旋转yRotAngle  

  34.     glRotatef(yRotAngle,0.0f,1.0f,0.0f);  

  35.     z=0.0f;  

  36.     curWidth=width[0];  

  37.     //进行平滑处理   

  38.     glEnable(GL_LINE_SMOOTH);  

  39.     glHint(GL_LINE_SMOOTH,GL_NICEST);  

  40.     //glEnable(GL_DEPTH_TEST);  

  41.     //绘制平行的直线  

  42.     for(x=-80.0f;x<=80.0f;x+=20.0f){  

  43.         glLineWidth(curWidth);  

  44.         //开始绘直线  

  45.         glBegin(GL_LINES);  

  46.         glVertex3f(x,80.0f,z);  

  47.         glVertex3f(x,-80.0f,z);  

  48.         //结束绘直线  

  49.         glEnd();  

  50.         curWidth+=1.0f;//widthStep;  

  51.     }  

  52.     //恢复压入栈的Matrix  

  53.     glPopMatrix();  

  54.     //交换两个缓冲区的指针  

  55.     glutSwapBuffers();  

  56. }  

  57. //设置Redering State   

  58. void setupRederingState(void){  

  59.     //设置清理颜色为黑色  

  60.     glClearColor(0.0f,0.0,0.0,1.0f);  

  61.     //设置绘画颜色为绿色  

  62.     glColor3f(0.0f,1.0f,0.0f);  

  63.     //获取受支持的线宽大小范围  

  64.     glGetFloatv(GL_LINE_WIDTH_RANGE,width);  

  65.     //获取受支持的线宽大小增量  

  66.     glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&widthStep);  

  67.     printf("Line width range:%f-%f\n",width[0],width[1]);  

  68.     printf("Line width step:%f\n",widthStep);  

  69. }  

  70. //窗口大小变化回调函数  

  71. void changSize(GLint w,GLint h){  

  72.     //横宽比率  

  73.     GLfloat ratio;  

  74.     //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  

  75.     GLfloat coordinatesize=100.0f;  

  76.     //窗口宽高为零直接返回  

  77.     if((w==0)||(h==0))  

  78.         return;  

  79.     //设置视口和窗口大小一致  

  80.     glViewport(0,0,w,h);  

  81.     //对投影矩阵应用随后的矩阵操作  

  82.     glMatrixMode(GL_PROJECTION);  

  83.     //重置当前指定的矩阵为单位矩阵   

  84.     glLoadIdentity();  

  85.     ratio=(GLfloat)w/(GLfloat)h;  

  86.     //正交投影  

  87.     if(w<h)  

  88.         glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);  

  89.     else  

  90.         glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);  

  91.     //对模型视图矩阵堆栈应用随后的矩阵操作  

  92.     glMatrixMode(GL_MODELVIEW);  

  93.     //重置当前指定的矩阵为单位矩阵   

  94.     glLoadIdentity();  

  95. }  

  96. //按键输入处理回调函数   

  97. void specialKey(int key,int x,int y){  

  98.   

  99.     if(key==GLUT_KEY_UP){  

  100.         xRotAngle-=5.0f;  

  101.     }  

  102.     else if(key==GLUT_KEY_DOWN){  

  103.         xRotAngle+=5.0f;  

  104.     }  

  105.     else if(key==GLUT_KEY_LEFT){  

  106.         yRotAngle-=5.0f;  

  107.     }  

  108.     else if(key==GLUT_KEY_RIGHT){  

  109.         yRotAngle+=5.0f;  

  110.     }  

  111.     //重新绘制  

  112.     glutPostRedisplay();  

  113. }  

  114.   

  115. int main(int argc, char* argv[])  

  116. {  

  117.     //初始化glut  

  118.     glutInit(&argc,argv);  

  119.     //使用双缓冲区模式  

  120.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);  

  121.     //获取系统的宽像素  

  122.     SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);  

  123.     //获取系统的高像素  

  124.     SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);  

  125.     //创建窗口,窗口名字为OpenlGL Lines width Demo  

  126.     glutCreateWindow("OpenlGL Lines width Demo");  

  127.     //设置窗口大小  

  128.     glutReshapeWindow(windowWidth,windowHeight);  

  129.     //窗口居中显示  

  130.     glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);  

  131.     //设置窗口大小变化时的回调函数  

  132.     glutReshapeFunc(changSize);  

  133.     //设置显示回调函数  

  134.     glutDisplayFunc(renderScreen);  

  135.     //设置按键输入处理回调函数  

  136.     glutSpecialFunc(specialKey);  

  137.     //设置全局渲染参数  

  138.     setupRederingState();  

  139.     glutMainLoop();  

  140.     return 0;  

  141. }  



你可能感兴趣的:(VS2012下基于Glut OpenGL绘制直线(添加设置直线宽度)示例程序)