可能读者有注意到了,在有些OpenGL图像中,直线(尤其是接近于水平或垂直的直线)会呈现出锯齿状边缘,这种“锯齿”现象是由于理想的直线是由一系列的像素模拟的,而这些像素又必须位于它们各自的像素网格中,下面我有一个呈现来说明减少这种“锯齿”效果的抗锯齿技巧。
效果图如下:
程序如下:
#include "GLUT.H" #include <stdio.h> static float rotAngle = 0.; //初始化函数 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_RANGLE 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 += 5; 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; }