1 /**************************************************
2 RGBA模式下的反走样直线(抗锯齿)-----红宝书P164------Andy
3 博创论坛http://bochuang.sinaapp.com
4 **************************************************/
5
6 #include<iostream>
7 #include<GL\freeglut.h>
8
9 using namespace std;
10 static float rotAngle = 0.0;
11 void init(void)
12 {
13 GLfloat values[2];
14 glGetFloatv(GL_LINE_WIDTH_GRANULARITY,values);
15 printf("GL_LINE_WIDTH_GRANULARITY value is %3.1f \n",values[0]);//%3.1f的意思是小数只取输入时的1位
16 glGetFloatv(GL_LINE_WIDTH_RANGE,values);
17 printf("GL_LINE_WIDTH_RANGE values are %3.1f %3.1f \n",values[0],values[1]);
18
19 glEnable(GL_LINE_SMOOTH);//启用直线的抗锯齿功能,需要启用混合功能
20 glEnable(GL_BLEND);//启用混合
21 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//指定混合方式
22 glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);
23 glLineWidth(1.5);
24 glClearColor(0.0,0.0,0.0,0.0);
25 }
26
27
28 void display(void)
29 {
30 glClear(GL_COLOR_BUFFER_BIT);
31 glColor3f(0.0,1.0,0.0);
32 glPushMatrix();
33 glRotatef(-rotAngle,0.0,0.0,1.0);
34 glBegin(GL_LINES);
35 glVertex2f(-0.5,0.5);
36 glVertex2f(0.5,-0.5);
37 glEnd();
38 glPopMatrix();
39
40 glColor3f(0.0,0.0,1.0);
41 glPushMatrix();
42 glRotatef(rotAngle,0.0,0.0,1.0);
43 glBegin(GL_LINES);
44 glVertex2f(0.5,0.5);
45 glVertex2f(-0.5,-0.5);
46 glEnd();
47 glPopMatrix();
48
49 glFlush();
50 }
51
52 void reshape(int w,int h)
53 {
54 glViewport(0,0,(GLsizei)w,(GLsizei)h);
55 glMatrixMode(GL_PROJECTION);
56 glLoadIdentity();
57 if(w<=h)
58 gluOrtho2D(-1.0,1.0,-1.0*(GLfloat)h/(GLfloat)w,1.0*(GLfloat)h/(GLfloat)w);
59 else
60 gluOrtho2D(-1.0*(GLfloat)w/(GLfloat)h,1.0*(GLfloat)w/(GLfloat)h,-1.0,1.0);
61 glMatrixMode(GL_MODELVIEW);
62 glLoadIdentity();
63 }
64
65 void keyboard(unsigned char key,int x,int y)
66 {
67 switch(key)
68 {
69 case 'r':case 'R':
70 rotAngle += 20;
71 if(rotAngle >= 360)
72 rotAngle = 0;
73 glutPostRedisplay();
74 break;
75 case 27:
76 exit(0);
77 break;
78 default:
79 break;
80 }
81 }
82
83 int main(int argc,char **argv)
84 {
85 glutInit(&argc,argv);
86 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
87 glutInitWindowSize(200,200);
88 glutCreateWindow(argv[0]);
89 init();
90 glutReshapeFunc(reshape);
91 glutKeyboardFunc(keyboard);
92 glutDisplayFunc(display);
93 glutMainLoop();
94 return 0;
95 }