以前 Simple2D 使用 Canvas2D 对象来绘制几何图形,而且渲染出来的几何图形存在明显的锯齿。如果想要抗锯齿的几何图形,则需要开启 OpenGL 的 MSAA,这需要很大的开销。

  如果不使用 MSAA,如何实现反走样的几何图形呢?如果在网上查一查的话,很多的文章都在讲反走样直线的实现,很难找到反走样多边形的实现。不过,你可以在 ImGui 中发现反走样的直线和多边形。于是,我就看了 ImGui 的源码,探究 ImGui 使用什么算法实现反走样的。可以发现 ImGui 并没有使用图元 GL_LINES 来绘制线段,无论是线段还是多边形都使用 GL_TRIANGLES 来绘制。下面来介绍 ImGui 反走样的原理:

  反走样直线

  (图片只是为了说明反走样的原理,并不能表现锯齿效果或反走样效果)

  上图左侧是使用普通的方法绘制的折线,只需要 3 个顶点就可以绘制,但这样绘制的折线会存在锯齿。

  右侧则是 ImGui 反走样直线原理,同样是一根折线,但它是由 8个三角形绘制而成,也就是一条直线需要使用 4 个三角形绘制。有红圈圈住的顶点的 alpha 值为 0,而蓝圈圈住的顶点的 alpha 值为 1。这样绘制出来的直线的边缘会有透明效果,看起来很平滑。

  上图是 Tween 动画演示中绘制的曲线,有很好的反走样效果。那么如何通过 3 个点计算出其它 6 个顶点从而构成 8 个三角形?可以先计算出直线的法线,然后往法线的方向平移 1 像素,就可以得到两条直线,按照一定的规律连接这些顶点可以得到 4 个三角形:

  这是一条直线的情况下,如果是由多条直线组成的折线,再以同样的方法计算出顶点,会发现交界处的顶点没有闭合:

  正常的情况应该是下图这样的:

  解决的方法是把交接处的两个分离的顶点合成一个顶点即可,将两条直线的法线相加再取平均值得到新的法线,把交接点往新法线平移得到的新顶点就是外面两条直线的交点。

  上面是线宽为 1 的直线的反走样实现,如果是线宽 > 1 的情况,反走样原理则和多边形的反走样类似。

  反走样多边形

  假设要绘制反走样的 6 边形:

  和反走样直线类似,内圈顶点的 alpha 值为 1,外圈顶点的 alpha 值为 0,唯一的不同是组成三角形的方式。内、外圈的顶点都可以通过法线来计算,和直线的计算一样,最后按图所示组成三角形即可。

  使用这种方法可以实现反走样,但需要额外的顶点。Simple2D 的 Painter 对象替换掉 Canvas2D 对象,提供了反走样图形的绘制。

  源码下载:Simple2D-20.rar

Simple2D-23(重构)反走样几何图形的更多相关文章

  1. NeHe OpenGL教程 第四十六课:全屏反走样

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. qt反走样(简选)

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #qt反走样(简选) #概念 """ ...

  3. Wu反走样算法绘制圆(C++/MFC实现)

    Wu反走样圆 原理:参考Bresenham算法,在主位移过程中计算出离理想圆最近的两个点,赋予不同的亮度值,绘制像素点即可! MFC 中CXXXView类中添加函数: //Wu算法画反走样圆 void ...

  4. Wu反走样算法绘制直线段

    Wu反走样算法 原理:在我看来,Wu反走样算法是在Bresenham算法基础上改进了一番,它给最靠近理想直线/曲线的两个点以不同的亮度值,以达到模糊锯齿的效果.因为人眼看到的是线附近亮度的平均值. M ...

  5. Opengl研究4.0 走样与反走样

    Opengl研究4.0 走样与反走样 DionysosLai(906391500@qq.com) 2014-06-25          走样与反走样,也叫混淆与反混淆.所谓走样,是因为使用离散量(像 ...

  6. Qt 学习之路 2(26):反走样

    Qt 学习之路 2(26):反走样 豆子 2012年11月12日 Qt 学习之路 2 9条评论 我们在光栅图形显示器上绘制非水平.非垂直的直线或多边形边界时,或多或少会呈现锯齿状外观.这是因为直线和多 ...

  7. OpenGL(十八) 顶点数组和抗锯齿(反走样)设置

    顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用.使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERT ...

  8. osg如何设置抗锯齿(反走样,反锯齿)

    首先抗锯齿是什么? 举个最简单的例子 你用windows画图软件画一根直线(准确说这个叫做线段),当水平或者垂直的时候,如下图,这是绝对完美的 但是当线段出现倾斜时,就无法做到完美了此时就会出现锯齿 ...

  9. osg反走样

    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits-& ...

随机推荐

  1. 破解UltraEdit(Ver20.00.0.1040),无限试用

    因为是第一次破解较大型的商业软件,所以有必要记录一下,另外UE的价格也实在太贵了... 第零步:准备 准备好破解常用软件.我常用的工具有IDA(用于静态分析).Ollydbg(动态调试).PEiD(用 ...

  2. 初探Net框架下的XML编程技术

    一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的X ...

  3. ResourceBundle介绍

    介绍: ResourceBundle类主要作用是读取属性文件,读取属性文件时可以直接指定属性文件的名称(指定名称时不需要文件的后缀),也可以根据Locale所指定的区域码来选取指定的资源文件: Res ...

  4. webpack 基本使用

    1. 创建webpack-test文件夹 2. npm初始化 3. 安装webpack 4. 使用webpack打包 hello.js 是需要打包的文件  hello.bundle.js 是打包完以后 ...

  5. bzoj2048 书堆

    Description Input 第一行正整数 N M Output 一行(有换行符),L,表示水平延伸最远的整数距离 (不大于答案的最大整数) 贪心地把最高的书尽量向右放可以得到最优解,因而最高的 ...

  6. [转]生成 Excel.dll

    来自:http://bbs.csdn.net/topics/330137762 默认的情况下microsoft excel 11.0 object library对象是一个.exe文件,所以我们需要利 ...

  7. OSPF里几个特殊区域(stub、Totally stubby、NSSA、Totally NSSA)总结

    网友总结: 简单的说,就是 stub过滤4,5类lsa,ABR会产生缺省的3类lsa,区域内不能引入外部路由 total stub过滤3,4,5类lsa,ABR会产生缺省的3类lsa,区域内不能引入外 ...

  8. oracle如何导出owner和tablespace

    原文转载至:http://bbs.csdn.net/topics/390819138 --用户创建语句,权限语句select dbms_metadata.get_ddl('USER','SCOTT') ...

  9. (转)RRU交织冗余在LTE-R组网中的应用研究

    RRU交织冗余在LTE-R组网中的应用研究 王 芳1,2 庞萌萌1,2 (1.北京全路通信信号研究设计院集团有限公司,北京 100070; 2.北京市高速铁路运行控制系统工程技术研究中心,北京 100 ...

  10. centos 7.x设置守护进程的文件数量限制

    在Bash中有个ulimit命令,提供了对Shell及该Shell启动的进程的可用资源控制.主要包括打开文件描述符数量.用户的最大进程数量.coredump文件的大小等. 1. 系统级设置 1.1 C ...