VS2012下基於Glut OpenGL繪製直線(添加設置直線寬度)示例程序

在VS2012下使用glut繪製一系列直線的示例程序,繪製的是平行的幾條直線,每條直線的寬度都不同,效果以下圖所示,按PC的UP,DOWN,LEFT,RIGHT按鍵能夠從不一樣的角度查看該圖形:函數


[cpp] view plaincopyoop

  1. // GlutLineswDemo.cpp : 定義控制檯應用程序的入口點。  spa

  2. //  .net

  3. #include "stdafx.h"  指針

  4. #include <gl/glut.h>  orm

  5. #include <math.h>  blog

  6. //圓周率宏  ci

  7. #define GL_PI 3.1415f  get

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

相關文章
相關標籤/搜索