RGBA模式下的反走样直线(抗锯齿)

 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 }
posted @ 2012-05-31 16:05  Andy Sun  Views(549)  Comments(0)    收藏  举报