[一] 線段反鋸齒
(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:
所以由 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 的內部顏色算平均的顏色
沒有留言:
張貼留言