2013年11月4日 星期一

[openGL] Antialiasing

[一] 線段反鋸齒




(1) 想法

    將每個 pixel 分成 9 個 subpixel,將顏色的強度算出來,如圖,(x, y) 強度為 3,

    (x+1, y) 強度為 1,(x+1, y+1) 強度為 2

(2) 作法

    如上圖,對 9 個 subpixel 而言,因為假設一條 line 的寬度等於一個 pixel 的寬度,

    就是像左上角的 pixel 中那九個點中左側的三個點依照斜率往上跳,因為 |m| < 1

    所以由 y 出發,範例 code:

    //以下程式片段以將 pixel 分為 16 個 subpixel 為例
    int up = 0;  // up 只是一個 counter
    for (int i = 0; i < 4; i++) {
        float yt = y + 0.125 + i * 0.25;
        float temp = yt + m * 0.125;
        if (temp > (int)y + 1) up++;
        temp = yt + m * 0.375;
        if (temp > (int)y + 1) up++;
        temp = yt + m * 0.625;
        if (temp > (int)y + 1) up++;
        temp = yt + m * 0.875;
        if (temp > (int)y + 1) up++;
    }

    算出 up (也就是跑上去 y+1 的有幾個)後,up / 16 就是 (x, y+1) 的顏色強度,

    (16 - up) / 16 就是 (x, y) 的強度,如果是要算 |m| > 1 的話,就要改過來用 y 算 x 唷

[二] 圖形反鋸齒




(1) 想法:

    以上圖為例,假設 line 的下方為圖形內部,上方為外部,

    將每一個 line 上的 pixel 等分成 9 個 subpixel,以此來計算顏色的比例,

     上圖中,該 pixel 由 5 / 9 的紅色和 4 / 9 的圖形內部的顏色混合起來

(2) 作法:

    以上圖為例,跟前面畫線演算法一樣,假如 |m| < 1,用 x 算 y 的值;反之亦然。

    而上圖的 slope 小於 1 ,所以用 x 算出 y 值,

    對於 3 個 x 值 { x + (1 / 6), x + (3 / 6), x + (5 / 6) },

    可以算出 x + (1 / 6) 的 y 值介於 y + (1 / 6) 到 y + (3 / 6) 之間,

     x + (3 / 6) 的 y 值介於 y + (1 / 6) 到 y + (3 / 6) 之間,
     x + (5 / 6) 的 y 值介於 y + (3 / 6) 到 y + (5 / 6) 之間,所以,總共有 5 個黑點在 line 之上,

    4 個黑點在 line 之下,以此為顏色的比例,

    所以 (x, y) 要用 5 / 9 的 border 顏色和 4 / 9 的內部顏色算平均的顏色

沒有留言:

張貼留言