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.pswp.cn/news/387708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387708.shtml
英文地址,請注明出處:http://en.pswp.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"…