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