2010年8月10日 星期二

Anti-aliasing 方法 (supersampling ; area sampling ; weighted ; unweighted)

資料來源 : 名為 " Computer Graphics principles and practice 2nd edition in C " 一書, page 620, 可在 "3d 相關電子書" folder 內找到..

..就是改變 pixel 顏色顯示的計算方式, i.e. 增加 sample point 的數目, 然後平均地計算出該 pixel 的顏色值, 亦即是所謂的 supersampling , 例如在某 3d software 內輸出一幅 800 x 600 的圖, 還未啟動 supersampling 功能之前, 每一個 pixel 只會用一個 sample point 來計算該 pixel 的顏色值(通常是位於 pixel 的 center), 這種計算方式亦稱為 point sampling...
....當啟動 supersampling 之後, 該 software 會先將輸出圖片的解像度增大兩倍成為 1600 x 1200 (也可增大為 3倍, 4倍, 5倍...如此類推, 視乎不同的設定已定, 亦即是 modo 內名為 antialiasing 欄位內所設定的數值, 待証實), 然後將 4 個 pixel 的顏色結合為一個 pixel (利用 4 個 pixels 的顏色值平均地計算出該 pixel 的顏色), 如此類推地將解像度變番做 800 x 600 (這做法便等同將 pixel 界開為多個 sample points, 待証實),  將多個 pixels 合併為一個 pixel 的顏色計算方式亦稱為 area sampling, 當中又可分為 weighted 及 unweighted 兩種..., 
.....unweighted area sampling 是計算 sample points 顏色平均值時, 無論 sample points 是位於中間或邊位, 其計算強度完全相同, 計算方法就是將所有 samples 的顏色值相加再除以 sample 數目, 而 weighted area sampling 的 sample 顏色計算強度會視乎其位置而有所不同, 通常越接近 pixel 中心的 sample, 其強度便越大, 計算方法是先將每一個 sample 的顏色值乘以強度, 然後才加起來除以 sample 的數目....
.....3D software 會提供不同方式的 weighted/unweighted sampling 給你選擇, 亦即是所謂的 antialiasing filters, 例如 box filter 便屬於 weighted, 而 gaussian filter 則屬於 unweighted, 其中一個好處是令 animation 移動畫面不會出現 flickering 現象 (p.621)

進行 supersampling 時其 pixel 內的 sample 排列方式有多種, 包括 ordered grid(或 regular grid), rotate grid, random, poisson disc, jitterred 等等 (參看 http://en.wikipedia.org/wiki/Supersampling), 但估計除了 ordered grid 外, 其餘的方式都只會用在顯示卡上, 因為顯示卡要實時用 hardware 產生 antialiasing 效果, 由於 hardware 能力有限, 所以便不能使用太高的 samples 數目, 否則便會拖慢顯示速度, 正由於 samples 數目很小(例如 2 x 2 = 4 個 samples), 若採用一般的 ordered grid  方式的話, 由於其 samples 排列得太有規律而令效果強差人意, 於是便發明了其他的 samples 排列方式, 另外亦估計大多數的 3d software 都採用 ordered grid 排列方法, 因為其原理較簡單易用, 至於其排列太規律這問題, 只需將 samples 數目大幅提高便可解決

Aliasing 如何形成

資料來源 :  google search 所得來零零碎碎的資料綜合而成, 當中包括自己加入的一些想法, 未必百份百正確..

...由於 LCD 的 pixel 是四方形以及一行行咁排列的, 解像度有限, 雖然可以 "完美無瑕" 地顯示完全水平或垂直的線條, 但卻無法 "完美無瑕" 地顯示斜線或曲線而出現鋸齒現象(jagged edge), 另外若要顯示密集的黑白格仔或線條時, 亦會出現所謂的波紋現象(moire), 而對於動畫黎講, 亦會出現所謂的 flickering 現象 , 這些問題都稱為 Aliasing, 而解決這些問題的方法便稱為 Anti-aliasing...

.... 出現 jagged edge 的原因是由於 LCD 的 pixel 是四方形, 當顯示斜線時便只能用 "梯級線" 的方式來達成, 假設 LCD 的解像度是 100 x 100, 當顯示完全水平的直線時, 只需簡單地啟動打橫的 100 行 pixels 之中的其中一行便可(假設該直線的闊度是 1 pixel), 但若要顯示斜線的話(將完全水平的直線稍為轉動一兩度), 便要先啟動第一行的頭 10 個 pixels, 然後跳落下一行啟動 11 至 20 的 pixels, 再跳落下一行啟動 21 至 30 pixels , 如此類推...雖然 "梯級" 之間只有 1 pixel 的落差, 但由於 pixel 的 size 不夠微細, 令人類眼晴察覺到 "狗牙" 的存在 (若 pixel 是圓形的話可能會好 D, 但圓形之間會有空位, 除非可以做到互相重疊的圓形 pixel , 這時自己的諗法而已, 未必正確)....
.....另一個原因是由於線條上所有的 pixels 都用同一種顏色來顯示, 更加凸顯了 aliasing 的嚴重性, 假如 pixel 的顏色是跟據該線條所佔用的範圍平均計算出來的話 (即是 pixel 顏色有深淺變化), 便可將 "狗牙" 的嚴重程度減低, 雖然 pixel 的形狀及 size 並沒有改變, 但顏色的改變又會令人類眼晴察覺不到 "狗牙" 的存在(所以 anti-aliasing 方法亦是朝著這個方向進行)

LCD 如何顯示線條

  ....資料來源, 名為 computer graphics 的書, chapter 2, Scan Conversion Techniques, 作者是 A.P. Godse (在 google 圖書內 online 查看), 書內採用 linear equation 數學方程式原理配合類似 BASIC 的電腦語言來講解運算方法, 不算太艱深, 自己亦睇得明 (其實還提供了 C 語言, 但自己睇唔明), 以下是將書內容 "消化" 後得出的見解.....  

...對於繪畫直線條黎講, 點樣將 vector 線條顯示在一點點的 lcd 上呢? 可使用名為 Bresenham's Line Algorithm 的計算方法, 原理是取得頭尾兩個 pixels 的座標值之後(用 mouse 畫直線時所 click 選的兩個 points), 利用 "接近法" 遂一計算出第 2, 3, 4 ....的 pixels (頭 pixel 唔需要計算, 因為用 mouse 畫線時已被定出, 至於最尾的 pixel , 雖然亦已被定出, 但仍然會再用方程式計算一次 ), 所謂 "接近法",  是量度 pixel 中心點和 Vector 線之間的距離, 並選用距離較短的 pixel...
....例如頭尾兩個 pixels 分別為 (0,0) 及 (10,10), 這時第二個 pixel 便會是 (1,1), 因為 vector 直線會直接穿過這個 pixel 的中心點, 但若將尾 pixel 改為 (10,8) 的話, 這時 vector 直線便會位於 (1,1) 和 (1,0) 上下兩個 pixels 之間, 由於較接近上面的 pixel, 所以便選用了 (1,1), 其它行數計算方法相同....
.....咁駛唔駛計埋橫行呢? 答案是當 vector 直線斜度超過 45 度時便要改為採用橫行的 pixels, 否則便會出現錯誤, 例如頭尾兩個 pixel 是 (0,0) 及 (1,10) , 其直線斜度差不多有 90 度, 而且只有兩行打直, 若依然用打直的方法來計算的話, 每行取一個 pixel , 總數便只有兩個 pixels, 無法形成一條直線 (改用打橫 pixels 後, 第一直行會佔用 5 個 pixels, 第二直行亦佔用 5 個 pixels 而形成一條直線)....
...也可使用名為 DDA Algroithm 的計算方法, 但由於有弱點, 所以較小採用, 弱點包括 (1) 由於要用小數來運算, 計算速度較慢, 即是所謂的 floating point, 這是電腦的弱項(待查近年的 cpu 是否已不再存在這問題), 而前述計算方法則採用整數(integer)來運算, (2) end point 位置可能會出現偏差 , 即是經由方程式計算出來的 end point 並不能保証會等同 mouse-click 時的 point, 而前者的計算方法則完全準確...