实现绘图反走样
由于在图形绘制到屏幕时,数字化的图像通过离散的象素点来表达,因此所绘制的图元将会在光滑的曲线上产生锯齿,这种锯齿即为走样。反走样也叫做反混淆,它将根据图元的象素区域来确定象素的颜色值,通过这种处理可在一定程度上消除锯齿的影响。在OpenGL中,可通过函数glHint()来对图像质量和绘制速度之间的权衡作一些控制,其函数形式为:
| void glHint(GLenum target,GLenum hint); |
参数target说明控制什么行为,具体的,GL_POINT_SMOOTH_HINT、GL_LINE_SMOOTH_HINT和GL_POLYGON_SMOOTH_HINT分别指定点、线和多边形的采样质量;GL_FOG_HINT指出雾化是按象素进行(GL_NICEST)还是按顶点进行(GL_FASTEST);GL_PERSPECTIVE_CORRECTION_HINT指定了颜色纹理插值的质量并可纠正由单纯线性插值所带来的一些视觉错误。参数hint可以是:GL_FASTEST(给出最有效的选择)、GL_NICEST(给出最高质量的选择)、GL_DONT_CARE(没有选择)。
虽然在OpenGL的颜色索引模式下也可以实现反走样,但仍建议在RGBA模式下进行。对图元进行反走样时也要先调用glEnable()函数启动反走样(其参数为GL_POINT、GL_LINE_SMOOTH或GL_POLYGON_SMOOTH)。如果是在RGBA模式下进行反走样,还必须与融合配合使用,通常使用GL_SRC_ALPHA和GL_ONE_MINUS_SRC_ALPHA分别作为源和目的因子。下面给出一段在RGBA模式下启用反走样绘制多面体的示例代码,从绘制结果(图3)可以明显看出在多边形的直线边界出现的锯齿得到了较好的平滑:
void CALLBACK Display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清屏 auxWireDodecahedron(1.0); // 绘制二十面体 glFlush(); // 强制绘图完成 } void Init() { 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(2.0); // 线宽 glShadeModel(GL_FLAT); // 平面明暗处理 glClearColor(0.0, 0.0, 0.0, 0.0); // 清屏 glDepthFunc(GL_LESS); // 激活深度比较 glEnable(GL_DEPTH_TEST); } |
 图3 反走样多面体 |
|