VS2012下基于Glut OpenGL绘制虚线示例程序:

在VS2012下使用glut绘制一系列虚线的示例程序,效果如下图所示,按PC的UP,DOWN,LEFT,RIGHT按键可以从不同的角度查看该图形:

 

glLineStipple用于设置直线的点线模式,其有两个参数

第二个参数PATTERN是一个16进制的数,或者是转换为二进制的16位序列(若不足16位,以0补完)

如glLineStipple (1, 0x0101);  /*  dotted  */

image

从低位开始(即右侧的1开始),如果是1则绘制像素,0则留空
第一个参数是扩展因子,如上factor设置为2的话,那么将绘制2个像素,14个留空,可以观察下面效果以了解扩展因子,效果如下
image

源代码:

 

[cpp]

  1. // GlutLineStippleDemo.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. void renderScreen(void){
  20.     GLfloat x,y,z,angle;
  21.     // Stippling factor
  22.     GLint factor = 0;
  23.     // Stipple pattern
  24.     GLushort pattern = 0x0F0F;
  25.     //把整个窗口清理为当前清理颜色:黑色
  26.     glClear(GL_COLOR_BUFFER_BIT);
  27.     //将当前Matrix状态入栈
  28.     glPushMatrix();
  29.     //坐标系绕x轴旋转xRotAngle
  30.     glRotatef(xRotAngle,1.0f,0.0f,0.0f);
  31.     //坐标系绕y轴旋转yRotAngle
  32.     glRotatef(yRotAngle,0.0f,1.0f,0.0f);
  33.     z=0.0f;
  34.     //绘制直线
  35.     for(y=-90.0f;y<=-10.0f;y+=5.0f){
  36.         //设置Stipple Line的factor pattern
  37.         glLineStipple(factor++,pattern);
  38.         //开始绘直线
  39.         glBegin(GL_LINES);
  40.         glVertex3f(-80.0f,y,z);
  41.         glVertex3f(80.0f,y,z);
  42.         //结束绘直线
  43.         glEnd();
  44.     }
  45.     //绘制直线
  46.     pattern=0xF0F0;
  47.     factor=0;
  48.     for(y=10.0f;y<=90.0f;y+=5.0f){
  49.         //设置Stipple Line的factor pattern
  50.         glLineStipple(factor++,pattern);
  51.         //开始绘直线
  52.         glBegin(GL_LINES);
  53.         glVertex3f(-80.0f,y,z);
  54.         glVertex3f(80.0f,y,z);
  55.         //结束绘直线
  56.         glEnd();
  57.     }
  58.     //恢复压入栈的Matrix
  59.     glPopMatrix();
  60.     //交换两个缓冲区的指针
  61.     glutSwapBuffers();
  62. }
  63. //设置Redering State
  64. void setupRederingState(void){
  65.     //设置清理颜色为黑色
  66.     glClearColor(0.0f,0.0,0.0,1.0f);
  67.     //设置绘画颜色为绿色
  68.     glColor3f(0.0f,1.0f,0.0f);
  69.     //使能点虚线
  70.     glEnable(GL_LINE_STIPPLE);
  71. }
  72. //窗口大小变化回调函数
  73. void changSize(GLint w,GLint h){
  74.     //横宽比率
  75.     GLfloat ratio;
  76.     //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)
  77.     GLfloat coordinatesize=100.0f;
  78.     //窗口宽高为零直接返回
  79.     if((w==0)||(h==0))
  80.         return;
  81.     //设置视口和窗口大小一致
  82.     glViewport(0,0,w,h);
  83.     //对投影矩阵应用随后的矩阵操作
  84.     glMatrixMode(GL_PROJECTION);
  85.     //重置当前指定的矩阵为单位矩阵
  86.     glLoadIdentity();
  87.     ratio=(GLfloat)w/(GLfloat)h;
  88.     //正交投影
  89.     if(w<h)
  90.         glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);
  91.     else
  92.         glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);
  93.     //对模型视图矩阵堆栈应用随后的矩阵操作
  94.     glMatrixMode(GL_MODELVIEW);
  95.     //重置当前指定的矩阵为单位矩阵
  96.     glLoadIdentity();
  97. }
  98. //按键输入处理回调函数
  99. void specialKey(int key,int x,int y){
  100.     if(key==GLUT_KEY_UP){
  101.         xRotAngle-=5.0f;
  102.     }
  103.     else if(key==GLUT_KEY_DOWN){
  104.         xRotAngle+=5.0f;
  105.     }
  106.     else if(key==GLUT_KEY_LEFT){
  107.         yRotAngle-=5.0f;
  108.     }
  109.     else if(key==GLUT_KEY_RIGHT){
  110.         yRotAngle+=5.0f;
  111.     }
  112.     //重新绘制
  113.     glutPostRedisplay();
  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 LineStilpple Demo
  126.     glutCreateWindow(“OpenlGL LineStilpple 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. }

标签