抗锯齿说
抗锯齿处理依赖混合处理,借助混合处理功能。
#include <GL/glut.h> static float rotAngle =0.; #include <stdio.h> void init(void){ GLfloat values[2]; glGetFloatv(GL_LINE_WIDTH_GRANULARITY,values); printf("GL_LINE_WIDTH_GRANULARITY value is %3.1f\n",values[0]); glGetFloatv(GL_LINE_WIDTH_RANGE,values); printf("GL_LINE_WIDTH_RANGE values are %3.1f %3.1f\n",values[0],values[1]); glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE); glLineWidth(1.5); glClearColor(0.0,0.0,0.0,0.0); } void display(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,1.0,0.0); glPushMatrix(); glRotatef(-rotAngle,0.0,0.0,0.1); glBegin(GL_LINES); glVertex2f(-0.5,-0.5); glVertex2f(0.5,0.5); glEnd(); glPopMatrix(); glColor3f(0.0,0.0,1.0); glPushMatrix(); glRotatef(rotAngle,0.0,0.0,0.1); glBegin(GL_LINES); glVertex2f(-0.5,0.5); glVertex2f(0.5,-0.5); glEnd(); glPopMatrix(); glFlush(); } void reshape(int w,int h){ glViewport(0,0,(GLint)w,(GLint)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h){ gluOrtho2D(-1.0,1.0,-1.0*(GLfloat)h/(GLfloat)w,1.0*(GLfloat)h/(GLfloat)w); }else{ gluOrtho2D(-1.0*(GLfloat)w/(GLfloat)h,1.0*(GLfloat)w/(GLfloat)h,-1.0,1.0); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key,int x,int y) { switch(key){ case 'r': case 'R': rotAngle +=20; if(rotAngle >=360.)rotAngle=0.; glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc,char** argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(200,200); glutCreateWindow(argv[0]); init(); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0; }
颜色索引模式下的抗锯齿
#include <GL/glut.h> #define RAMPSIZE 16 #define RAMP1START 32 #define RAMP2START 48 static float rotAngle =0.; void init(void){ int i; for(i=0;i<RAMPSIZE;++i){ GLfloat shade; shade = (GLfloat)i/(GLfloat)RAMPSIZE; glutSetColor(RAMP1START+(GLfloat)i,0.,shade,0.); glutSetColor(RAMP2START+(GLfloat)i,0.,0.,shade); } glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE); glLineWidth(1.5); glClearIndex((GLfloat)RAMP1START); glClearColor(1.0,1.0,1.0,0.5); } void display(void){ glClear(GL_COLOR_BUFFER_BIT); glIndexi(RAMP1START); glPushMatrix(); glRotatef(-rotAngle,0.0,0.0,0.1); glBegin(GL_LINES); glVertex2f(-0.5,-0.5); glVertex2f(0.5,0.5); glEnd(); glPopMatrix(); glIndexi(RAMP2START); glPushMatrix(); glRotatef(rotAngle,0.0,0.0,0.1); glBegin(GL_LINES); glVertex2f(-0.5,0.5); glVertex2f(0.5,-0.5); glEnd(); glPopMatrix(); glFlush(); } void reshape(int w,int h){ glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h){ gluOrtho2D(-1.0,1.0,-1.0*(GLfloat)h/(GLfloat)w,1.0*(GLfloat)h/(GLfloat)w); }else{ gluOrtho2D(-1.0*(GLfloat)w/(GLfloat)h,1.0*(GLfloat)w/(GLfloat)h,-1.0,1.0); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key,int x,int y){ switch(key){ case 'r': case 'R': rotAngle+=20; if(rotAngle>=360.)rotAngle=0.; glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc,char ** argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_INDEX); glutInitWindowSize(200,200); glutCreateWindow(argv[0]); init(); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0; }
生活的残酷,让我们习惯了忘记疲倦,一直奔向远方,追寻着自己的梦想。