首先抗锯齿是什么?
举个最简单的例子
你用windows画图软件画一根直线(准确说这个叫做线段),当水平或者垂直的时候,如下图,这是绝对完美的
但是
当线段出现倾斜时,就无法做到完美了
此时就会出现锯齿
就如同台阶一样,一级一级的
这是由于显示原理本身所限制的,也即是说因为显示器以及帧格式都是按照像素进行排列的,始终会存在一个最小单位。当线倾斜的时候,不做任何处理的时候,斜方向的最小单位就会出现空隙
最简单也是统一的处理方式自然是用其他的内容填充这些缝隙,如下图所示
右侧是不是看上去就比左侧要更加顺滑,舒服一些了呢?
这就是抗锯齿最基本的原理
至于现在所使用到的抗锯齿的方法,没必要在知乎专门介绍,外面的资料海一样多,你可以自己去查阅
中文查询“抗锯齿”或者“反锯齿”
英文查询“anti aliasing”
文章来自:https://www.zhihu.com/question/28855427
现在说在OSG里面如何设置:
其实非常简单,就是在设置osg::GraphicsContext::Traits时,有个成员变量为sample,是采样倍数,默认是0的,你设置为8就可以了,如下:
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = 0; traits->y = 0; traits->width = width; traits->height = height; //支持窗口扩展,默认是不支持的 traits->windowDecoration = true; //支持双缓存,默认不支持 traits->doubleBuffer = true; traits->sharedContext = 0; traits->red = 8; traits->blue = 8; traits->green = 8; //支持alpha,默认不支持为0,这里改为支持,使截出来的图片具有alpha值 traits->alpha = 8;
//采样倍数 traits->samples = 8; traits->sampleBuffers = 1; osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
然后把gc设置给camera就可以了。