Anti-Aliasing SSAA MSAA MLAA SRAA 简介

http://blog.csdn.net/codeboycjy/article/details/6312758

 

 

前两天在浏览游民星空的时候,小编居然在文章中挂了一篇技术文章,是关于SRAA的。对于AA的了解很少,正好入职之前还有几天的空闲时间,所以就这个机会把AA的一些基本算法简单学习了一下,不过也只是学习到了一点皮毛而已。
本文将简单介绍四种反走样算法,他们分别是:
SSAA: Super Sampling Anti-Aliasing
MSAA: Multi Sampling Anti-Aliasing
MLAA: Morphological Anti-Aliasing
SRAA: Sub-pixel Reconstruction Anti-Aliasing
当然,AA算法的种类实在是很多,还有CSAA,ADAA,Transparent AA等等。本文就简单介绍上面四种吧。
首先,什么是走样呢?我们在现实生活中观察到的物体经常是细节非常丰富的,而大部分信息的频率远远高于人眼的识别能力。而计算机中的图像是由一个一个离散的pixel组成的,其实是个有限的集合。所以它只能用来逼近现实中的场景,并不能完美的重现。走样有很多表现形式,例如边缘的锯齿,采样频率过低等。本文的AA算法都是针对锯齿边缘的。一般而言,纹理的采样频率过低都是通过AF或者更复杂的采样算法来解决的。
image 
举个简单的例子,我们放大一条直线所经过的两个pixel。由于对于每个像素,我们只在像素的中心采样,所以对于上图而言,上面的像素中的采样点是在直线上面的,而下面采样点则在直线的下面。假设我们要把直线下面的图像填充成黑色,如果没有AA,那么下面的像素就会是纯黑色,而上面是纯白色。而这种情况会产生三角形边缘的锯齿现象,我们称之为走样。下图为经过MLAA处理前后的图像变化。
image
当然,如果屏幕分辨率的细致程度已经超过了人眼的识别能力的话,例如iphone4的retina屏幕,那么由于几何体边缘带来的走样现象也会基本没什么影响了。不过大部分的显示器还是能用肉眼观察到锯齿的。
首先我们了解下SSAA的算法吧。几何体的边缘在理论上来说是无限细致的,因为是用数学公式表达的。所以如果投影到光栅屏幕上的话,无论如何都会有细节损失的,只不过是不是明显罢了。当屏幕分辨率增加或者屏幕分辨率不变,而每个像素的采样点增多的时候,这种细节会更好的表现在用户面前,所以解决AA的一个最直观的办法就是通过增加分辨率。如果在图像的长度和宽度都增加2倍的条件下(4 X SSAA ),再次渲染图像。然后做一个downfiltering,那么图像的细节会表现的更好一些,锯齿会明显的减少。这种办法就是SSAA了,挺Brute Force的办法。这种方法的好处在于可以更完美的表现画面,不过问题在于其计算代价是与屏幕分辨率成正比的。4 x SSAA 的速度要比没有AA慢4倍左右的时间,对于大多数应用来说,是得不偿失的。从性能角度而言,SSAA是不实际的。
当然,即使确定了SSAA算法后,也还有一些其他的细节需要考虑。例如,16 x SSAA可以被理解为每个像素有十六个采样点,而采样点的分布是
image
而这种分布对于反走样并不是特别有效的,可以采用如下几种分布来替换
image image image
从左到右依次是随机分布,泊松分布和Jittered分布。随即分布的问题在于采样点数量不多的时候,算法的结果不是特别稳定。泊松分布的问题在于并不能轻易计算出泊松分布的位置,而且位置计算代价很大。当然还有很多其他的分布,这里就不多介绍了。不同的采样点分布算法可以不同程度的改变反走样的效果。
由于SSAA的算法代价过于大,所以应用价值相对而言较小。MSAA假设一个像素内的颜色变化是不大的,从而有效的把颜色和顶点的位置,法线等信息分离开来了。这种算法在很早的Geforce3中,有硬件实现。由于在当时的硬件条件下,纹理的读取的开销很大,所以把这部分独立出来就充分的节省了bandwidth与fillrate。假设这里是4 x MSAA,每个像素的四个采样点中,除了没有颜色信息,会有其他位置等信息。注意这里面的深度信息也是存储在每个采样点中的,就是说深度比较也是基于sub-pixel级别的。Geforce 4系列的AA没有本质的变化,不过在采样点的分布上做了一些调整。
image
蓝色的为像素的中心,而红色的为4 x MSAA的实际采样点。由于平均距离小了很多,所以反走样的效果有了一定的提升。而同期的AMD的硬件的AA效果要好一些,主要是采样分布的原因。Geforce 4用的采样分布属于ordered grid sampling,而AMD采用了另一种rotated grid sampling。
image 
从反走样的质量而言,AMD的R300系列要远远领先与Nv30。
随着游戏产业的不断发展,游戏场景也更加的复杂。很多游戏中利用alpha test简化场景的复杂度。例如下面的铁丝网:

问题就出现了,由于MSAA的纹理采样频率依旧和没有AA的时候一样,所以对于上图左边而言,没有MSAA和经过MSAA处理的效果基本没有区别。因为上面的铁丝网是通过alpha test来模拟的,而没有实际的网格。MSAA的纹理采样率导致了其在这种情况下的无能为力。当然后来就有了adaptive AA来改进这种问题。
上述的MSAA算法还有一个很严重的问题,就是他们只能与forward rendering结合。而随着游戏中光源效果的复杂,deferred rendering越来越受到关注。而无论是defered rendering还是msaa都是通过把颜色的计算与几何体计算分离开来,而两者是不能并存的。这就导致了很多麻烦。从某种程度上,MLAA和SRAA可以理解为后处理运算,所以是可以和deferred rendering结合的。
MLAA更像是一种图像处理方法,它不需要任何前验信息,只根据像素的颜色进行处理。它可以和raster、ray tracing或者其他算法结合,而且完全不需要生成任何多余的信息。MLAA的算法相对来说复杂很多,这里就不介绍了。
不过由于MLAA只是根据颜色进行判定,所以很多时候可以影响一些高频纹理。当然这些纹理很可能在AF采样后,自动适应MLAA算法了。至少该算法的作者称MLAA不会对纹理的采样其反作用。
MLAA的算法速度可能相对慢一些,作者的数据是在一个单核3GHz的处理器下,每秒可以处理20M的像素。对于大分辨率而言,这个速度可能还不能算是实时。如果利用GPU或者larrabee,可能速度会有些提升吧。论文中是在ray tracing的渲染方法下实验的,由于对于动态场景的ray tracing需要更新空间划分结构,所以可以利用空余线程处理图像,基本不会带来什么开销。对于实时渲染可能就需要用其他手段了。
由于MLAA的一些限制,SRAA就提出了解决方案。SRAA虽然也相当于后处理,不需要任何forward rendering的元素。不过SRAA需要一个G buffer,这个G buffer的分辨率一般要大一些,这里就假设是4 x SRAA吧,那么G Buffer就是back buffer分辨率的4倍。SRAA根据G Buffer中的几何信息,把每个像素与周围一定范围的像素进行混合。由于引入了几何信息,所以可以避免很多MLAA的错误。
image
我们可以看到(c)图中的MLAA算法把右下角本来清晰的矩形模糊化了,而SRAA由于引入了几何信息,很好的保持了其清晰的特性,而又模糊了上面的锯齿。
SRAA算法可以在保持算法性能的条件下生成与16 x SSAA相媲美的画面,当然有些细节可能还是要差一点。毕竟有些情况下,其算法中的部分假设是不成立的。
基本就介绍到这里吧,没有怎么细致介绍,只是概要的提到了一些算法而已。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed

转载于:https://www.cnblogs.com/skiwnchiwns/p/10167893.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis多数据源配置(读写分离)

MyBatis多数据源配置(读写分离) 首先说明,本文的配置使用的最直接的方式,实际用起来可能会很麻烦。 实际应用中可能存在多种结合的情况,你可以理解本文的含义,不要死板的使用。 多数据源的可能情况 1.主从 通常是MySQL一主多…

UI简单工作

UI用户界面 需求——效果图——风格设计——高保证效果——html 网页的宽度屏幕的宽度-纵向滚动条的宽度 企业网站一般是1280 根据百度流量研究所 目前我们的网页注主要是1024和1200 这样的宽度符合大体市场 首屏高度。 首屏的概念来源于出版领域 报纸折叠后贩卖&…

MySQL分库分表总结

MySQL分库分表总结: 单库单表 : 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到。 单库多表 : 随着用户数量的增加,user表的数…

3章 RxJava操作符

本篇文章已授权微信公众号 YYGeeker 独家发布转载请标明出处 CSDN学院课程地址 RxJava2从入门到精通-初级篇:edu.csdn.net/course/deta…RxJava2从入门到精通-中级篇:edu.csdn.net/course/deta…RxJava2从入门到精通-进阶篇:edu.csdn.net/course/deta…RxJava2从入门到精通-源码…

virtualbox 使用

实现文件拖拽功能 1、设备 -- 安装增强功能 -- /bin/sh VboxLinuxaddition.run -- reboot 2、设备 -- 拖放 -- 双向 3、虚拟机 -- 设置 -- 存储 -- 控制器:SATA -- 勾选 使用主机输入输出(I\O 缓存) 4、虚拟机硬盘 -- 勾选固态驱动器 转载于…

linux安装mysql 5.6.33

.到MySQL官网下载mysql编译好的二进制安装包,在下载页面Select Platform:选项选择linux-generic,然后把页面拉到底部,64位系统下载Linux - Generic (glibc 2.5) (x86, 64-bit),下载后文件名:mysql-5.6.33-linux-glibc2…

Go 函数特性和网络爬虫示例

爬取页面 这篇通过网络爬虫的示例,来了解 Go 语言的递归、多返回值、延迟函数调用、匿名函数等方面的函数特性。首先是爬虫的基础示例,下面两个例子展示通过 net/http 包来爬取页面的内容。 获取一个 URL 下面的程序展示从互联网获取信息,获…

Qt的安装和使用中的常见问题(详细版)

对于太长不看的朋友,可参考Qt的安装和使用中的常见问题(简略版)。 目录 1、引入2、Qt简介3、Qt版本 3.1 查看安装的Qt版本3.2 查看当前项目使用的Qt版本3.3 查看当前项目使用的QtCreator版本3.4 Linux命令行下查看和使用不同版本的Qt4、Qt模块…

python与C#的互相调用

python与C#的互相调用一、C#调用python新建一个项目,添加引用:IronPython.dll,Microsoft.Scripting.dll(在IronPython的安装目录中)。创建一个文本文件命名为hello.py,把该文件添加的当前的项目中,并设置为总是输出。#…

各行业大数据可视化界面参考

转载于:https://www.cnblogs.com/wangsongbai/p/10178096.html

mysql远程连接 Host * is not allowed to connect to this MySQL server

localhost改成% 进入mysql的BIN目录 代码如下 复制代码 mysql -u root -p mysql>use mysql; mysql>update user set host ’%where user ’root’; mysql>flush privileges; 具体分析 1、在本机登入mysql后,更改“mysql”数据库里的“user”表里的“h…

今日听闻这几款手机软件比较火爆 果然名不虚传!

如今的时代,智能手机已经成为我们生活中不可缺少的一部分,大家之所以这么爱玩手机,其实并不是手机本身有多么吸引人,而是安装在手机上的各种各样的APP,比如各种社交软件、音频软件、购物软件以及地图软件等等。下面我们…

setdefault()方法

setdefault()方法 描述 字典 setdefault() 方法和 get()方法类似,返回指定键的值,如果键不在字典中,将会添加键并将值设置为一个指定值,默认为None。 get() 和 setdefault() 区别: setdefault() 返回的键如果不在字典中&#xff0…

Hive2.1.1、Hadoop2.7.3 部署

本文以远程模式安装Hive2.1.1将hive的元数据放置在MySQL数据库中。 1 安装mysql数据库 sudo apt-get install mysql-server11 重启mysql服务使得配置文件生效 sudo service mysql restart11 创建hive专用账户 CREATE USER hive% IDENTIFIED BY 123456;11 给hive账户授予所有权限…

Django 的简单ajax

需要通过ajax实现局部刷新 js代码 $(#guo-sou-ajax).click(function(){ #获取id为guo-sou-ajax点击后的信号console.log($(this).attr("data-action")) $.ajax({ #调用ajaxurl: $(this).attr("data-action"), #url保存在标签里面的data-actio…

postman提取返回值

Postman是做接口测试的,但是很多接口并不是直接就能测,有的需要一些预处理。比如说身份认证,需要传递一个token。如果做网页测试,一般打开登陆界面的时候就会生成一个token,如果返回值是json格式,用Postman…

docker下用keepalived+Haproxy实现高可用负载均衡集群

启动keepalived后宿主机无法ping通用keepalived,报错: [rootlocalhost ~]# ping 172.18.0.15 PING 172.18.0.15 (172.18.0.15) 56(84) bytes of data. From 172.18.0.1 icmp_seq1 Destination Host Unreachable From 172.18.0.1 icmp_seq2 Destination H…

hadoop hive 2.1.1 将Hive启动为服务

我们之前使用的Shell方式与Hive交互只是Hive交互方式中的一种,还有一种就是将Hive启动为服务,然后运行在一个节点上,那么剩下的节点就可以使用客户端来连接它,从而也可以使用Hive的数据分析服务。 前台模式 可以使用下面的命令来将…

大数据学习要知道的十大发展趋势,以及学习大数据的几点建议

2016年,近40%的公司正在实施和扩展大数据技术应用,另有30%的公司计划在未来12个月内采用大数据技术,62.5%的公司现在至少有一个大数据项目投入生产,只有5.4%的公司没有大数据应用计划,或者是没有正在进行的大数据项目&…

pickle 模块

import pickle # class Elephant:def __init__(self, name, weight, height):self.name nameself.weight weightself.height heightdef tiaoxi(self):print(f"{self.name}大象特别喜欢调戏人")# e Elephant("宝宝", "185T", "175"…