OpenGL中的颜色混合功能(二)——抗锯齿的处理

在OpenGL中,混合功能的另一个用途是抗锯齿的处理。在绝大多数情况下,一个渲染片段映射到计算机屏幕上的一个像素。因为这些像素都是正方形的,所以通常我们可以清晰的看到两种不同颜色的分界,它们就是我们通常所说的锯齿。锯齿的出现会让人觉得图像是不自然的,极为影响观感。这种锯齿现象是计算机所产生的图像的弱点,这对于我们的许多要求尽可能逼真的渲染任务,都带来了消极的影响。

为了消除图元之间的锯齿状边缘,OpenGL使用混合功能来混合片段的颜色,也就是把像素的目标颜色与周围相邻像素的颜色进行混合。从本质上说,在任何图元的边缘上,像素颜色都会稍微延伸到相邻的像素,以此来达到平滑像素颜色的效果。打开抗锯齿功能十分简单,首先我们必须启用混合功能,并对混合函数进行一些设置:

// 设置混合因子

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// 启用混合

glEnable(GL_BLEND);

我们还需要确保把混合方程式设置为GL_ADD的模式,这也是默认的设置。在启用混合功能并选择正确的混合方程式后,便可以调用glEnable函数对点、直线或多边形(任何实心图元)进行抗锯齿处理,如下所示:

// 启用点平滑处理

glEnable(GL_POINT_SMOOTH);

// 设置为画质最优的方式

glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

// 启用直线平滑处理

glEnable(GL_LINE_SMOOTH);

// 设置为画质最优的方式

glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

// 启用多边形平滑处理

glEnable(GL_POLYGON_SMOOTH);

// 设置为画质最优的方式

glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);

不过,我们在使用GL_POLYGON_SMOOTH时应该注意,我们可能想用它使实心几何图元的边缘变得平滑。但想要实现这个目的,还需要其他一些规则。并且,对实心物体进行抗锯齿处理并不常用,一种被称为多重采用的方式通常是更好的选择。glHint方法允许我们在实现抗锯齿的处理时选择不同的实现方法,GL_FASTEST(速度最快)或者GL_NICEST(效果最佳),我们使用了效果最佳的方式。在我们的示例程序中,启用抗锯齿处理的前后对比如图所示,注意观察画面中的点、直线以及多边形边缘的变化:

未开启抗锯齿处理

开启抗锯齿处理

示例程序通过对右键菜单的响应,我们可以在抗锯齿和非抗锯齿渲染模式间进行切换。这一部分的示例程序完整代码已经放到了GitHub上,有需要的朋友可以参考一下(https://github.com/dxm3dp/OpenGL-06-Smoother点击打开链接)。

本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处:http://blog.csdn.net/haohan_meng

时间: 2024-10-13 20:24:46

OpenGL中的颜色混合功能(二)——抗锯齿的处理的相关文章

OpenGL中的颜色混合功能(一)

我们知道,材料属性和光照参数可以极大地增加图形的逼真度,但除此之外,我们在对现实世界进行建模时,有许多效果是通过混合颜色的方式实现的.透明的物体,像是玻璃水杯,在它后面发射过来的光会与透明物体的颜色混合在一起.这种透明在OpenGL中的实现方式,是通过首先绘制背景物体,然后把前景物体(比如水杯)与颜色缓冲区中已经存在的颜色进行混合而实现的.在这一过程中,颜色的alpha值成分发挥了重要作用. 颜色的混合功能 在一般情况下,OpenGL在渲染时把颜色值存放在颜色缓冲区中,把每个片段(像素)的深度值

CSS3中字体平滑处理和抗锯齿渲染

在围观Drupal官方主题的时候,发现了一个有意思的非标准CSS选择器-webkit-font-smoothing,于是上手把玩了一番.如何使用css3字体平滑显示呢  要知道,W3C对CSS中字体的抗锯齿渲染是有过考虑的,如font-smooth,不过可能由于不同操作系统以及浏览器内核对字体的渲染存在差异,总之,他并没有被选入Web标准.但是WebKit还是保留了一套自有的非标准选择器来实现对抗锯齿效果的支持,来让字体显示的更加平滑. -webkit-font-smoothing主要有一下三个

一起talk C栗子吧(第一百七十四回:C语言实例--关闭终端中的缓冲功能二)

各位看官们,大家好,上一回中咱们说的是关闭终端中缓冲功能的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们, 我们在上一回中介绍了如何关闭终端中的缓冲功能,当时是借助系统命令stty实现该功能的,这一回中我们将介绍另外一种关闭终端中回显功能的方法.该方法是通过终端的termios编程接口来操作终端的.关于termios接口的介绍和编程接口,我们在一百七十一回中介绍过了,因此,我们直接介绍如何通过termios编程接口来关闭终端缓冲功能. 下面是详细的操作步

openGL线型和线宽以及线的抗锯齿

openGL线型和线宽以及线抗锯齿 一. 线宽 Opengl的线宽设置:glLineWidth(width); width为float类型值,在0~10.0,大于10以上按10来处理. 若开启线的反走样glEnable(GL_LINE_SMOOTH);,设置小数值才起作用,否则就四舍五入的处理整数了. 二.  线型 函数为glLineStipple(factor, Pattern[PatternMode]); 其中pattern值可以是任意的你想要的,把01转换为16进制的值就可以了.Facto

(转)Android中实现区域平均算法在图片缩放里的应用(缩放图片抗锯齿)

摘要:Android图片缩放效果较差,尤其是将大尺寸的图片缩放成小尺寸的图片时,即便是加了抗锯齿,锯齿现象也比较严重:而java sdk里的区域平均算法缩放图片,效果就比较完美了,因为jdk不能直接用于安卓项目中(类冲突),也没找到可以使用的替代的library,最终只好自己写,在此分享! 正文: 目前我知道的Android API中的传统的图片抗锯齿优化处理无非就是以下相关的设置: //缩放抗锯齿Bitmap.createScaledBitmap(bitmap, width, height,

OpenGL中的多重采样

抗锯齿处理的最大优点之一就是它能够使多边形的边缘更为平滑,使渲染效果显得更为逼真和自然.点和直线的抗锯齿处理是得到广泛支持的,但遗憾的是,对多边形的平滑处理并没有在所有平台上都得到实现.并且,即使在可以使用GL_POLYGON_SMOOTH的时候,对整个场景进行抗锯齿处理也没有想象中的那么方便.这是因为,抗锯齿处理是基于混合操作的,这就需要从前到后对所有的图元进行排序,这是十分麻烦的. 在OpenGL中还有一个功能,称为多重采样(multisampling),可以用来解决抗锯齿处理中的这个问题.

Visual Studio 字体抗锯齿插件 Text Sharp

mac用多了胃口是会被养屌不少,系统字体光mactype渲染还不够,今天终于找到了Visual Studio中可以使用的代码字体抗锯齿插件,效果很爽. 用Consolas字体举例: 惨不忍睹. 特效半开后: 好太多了,已经能满足大部分人的需求. 特效全开: 稍微有点渲染过度,导致字体看上去有点糊,还变瘦了. 有了这个插件以后写代码再也不会不爽了,代码优雅字体也要优雅啊; ) 插件链接:https://visualstudiogallery.msdn.microsoft.com/7aafa2ea-

OpenGL中的抗锯齿技术

计算机通过离散(不连续)的像素来绘制图形,想象一下,真实世界中,我们画直线,是比连续画的,还是一个点一个点画的?计算机就是一个点一个点画的(很小的矩形).这样就会导致绘制的图形走样(锯齿),消除锯齿的技术就叫反走样(抗锯齿) 可以看这篇:http://blog.csdn.net/mikewolf2009/archive/2009/08/18/4460421.aspx 点示例 当点很大时,显示如下 而我们实际想看到的是一个圆点,而不是矩形 启用抗锯齿后的效果 有点圆了 代码 glPointSize

OpenGL核心技术之抗锯齿

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 抗锯齿问题在游戏中一直存在的,尤其是体现在3D模型上的材质或者游戏UI界面上,由于现在引擎都非常完善,并且引擎都提供了抗锯齿功能,我们通过引擎提供的参数界面设置一下就可以消除.但是很