计算机是使用像素来表示图形的,这样,实际上是以光栅化后的离散量来代替连续量,从而会引起失真。这种现象叫走样(aliasing)。不同的应用,使用不同的算法走样的程度也不一样。走样通常出现的有阶梯状边界、图形细节失真、狭小图形遗失等。图9-3到9-5给出了几类走样的说明。
用于减少和消除各种走样现象的方法就是反走样。通常反走样的方法有提高分辨率法、非加权区域采样法、加权区域采样法等,但是在OpenGL中实现反走样就简单的多。
OpenGL实现反走样需要满足两个条件,一是启用混合,二是启用针对几何图元的反走样处理。
前面已经讲过,glEnable(GL_BLEND)启动混合,而glEnable(mode)则启用几何图元的反走样,其中mode取值为GL_POINT_SMOOTH、GL_LINE_SMOOTH或GL_POLYGON_SMOOTH。
下图9-6是没有经过反走样处理的线段和经过反走样处理的线段的对比。
接下来我们实现一个网格状球体的反走样处理。为了便于观察,我们不使用包括雾、光照、纹理等效果。
int glInit()
{
//启用阴影平滑(Smooth Shading)。
glShadeModel(GL_SMOOTH);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
//设置深度缓冲
glClearDepth(1.0f);
//启动深度测试
glEnable(GL_DEPTH_TEST);
//深度测试的类型
glDepthFunc(GL_LEQUAL);
//进行透视修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
return TRUE;
}
void glMain()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); //加载单位矩阵
glTranslatef(-1.5f, 0.0f, -5.0f);
//球体的颜色为黑色
glColor3f(0.0f, 0.0f, 0.0f);
//未使用反走样处理
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_POLYGON_SMOOTH);
auxWireSphere(1.0);
//启用反走样处理
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
glTranslatef(3.0f, 0.0f, 0.0f);
auxWireSphere(1.0);
SwapBuffers(g_hDC);//交换前后缓冲区
}
程序运行效果如图9-7所示,可以看到两个球体的明显不同。