OpenGL系统设计-反走样

 

计算机是使用像素来表示图形的,这样,实际上是以光栅化后的离散量来代替连续量,从而会引起失真。这种现象叫走样(aliasing)。不同的应用,使用不同的算法走样的程度也不一样。走样通常出现的有阶梯状边界、图形细节失真、狭小图形遗失等。图9-39-5给出了几类走样的说明。

 

 

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

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

前面已经讲过,glEnable(GL_BLEND)启动混合,而glEnable(mode)则启用几何图元的反走样,其中mode取值为GL_POINT_SMOOTHGL_LINE_SMOOTHGL_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所示,可以看到两个球体的明显不同。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值