现在的位置: 首页 > 综合 > 正文

OpenGL:反走样

2018年05月18日 ⁄ 综合 ⁄ 共 1657字 ⁄ 字号 评论关闭

转载自:http://blog.csdn.net/d04421024/article/details/4852698

由于计算机以离散点生成图形,生成图形必然与真实景物存在差距,这种差距表现为:直线或光滑曲面的锯齿、花纹失去原有色彩形状、细小物体在画面的消失等。统统叫做走样(aliasing)。反走样可以减少这种情况。粗略设想一下,就是把原来边界的地方锯齿部分用低饱和度的点补上,这样既不影响整体轮廓,又获得较好的平滑效果。

用于减少和消除各种走样现象的方法就是反走样。通常反走样的方法有提高分辨率法、非加权区域采样法、加权区域采样法等,但是在OpenGL中实现反走样就简单的多。

反走样前提供“提示”采用函数:

void glHint(GLenum target,GLenum hint); 
其中hint可以是:
GL_FASTEST 给出最有效的选择 
GL_NICEST 给出最高质量的选择 
GL_DONT_CARE 没有选择

target 意义

GL_POINT_SMOOTH_HINT 指定点、 
GL_LINE_SMOOTH_HINT 线、 
GL_POLYGON_SMOOTH_HINT 多边形的采样质量 
GL_FOG_HINT 指出雾化计算是按每个象素进行(GL_NICEST),还是按每个顶点进行(GL_FASTEST) 
GL_PERSPECTIVE_CORRECTION_HINT 指定颜色纹理插值的质量 
其中GL_PERSPECTIVE_CORRECTION_HINT用以纠正单纯线性插值带来的观察错误。

OpenGL实现反走样需要满足两个条件,一是启用混合,二是启用针对几何图元的反走样处理。

前面已经讲过,glEnable(GL_BLEND)启动混合,而glEnable(mode)则启用几何图元的反走样,其中mode取值为GL_POINT_SMOOTH、GL_LINE_SMOOTH或GL_POLYGON_SMOOTH。

接下来我们实现一个网格状球体的反走样处理。为了便于观察,我们不使用包括雾、光照、纹理等效果。

 

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所示,可以看到两个球体的明显不同。

抱歉!评论已关闭.