計算機圖形學之光柵圖形學算法


計算機圖形學概論

基本概念

1、一般來說要在計算機上生成一幅表示物體的圖像有三步:造型技術;光照模型;繪制(渲染)技術

2、幀緩沖器

3、分辨率:屏幕分辨率;顯示分辨率;顯卡分辨率

4、顯示器點距(越小越好,一般14或15寸電腦顯示器點距為0.27mm)

5、圖形與圖像的區別

6、位圖(點陣圖)和矢量圖的區別:1)存儲方式的區別:點陣文件是存儲圖的各個像素點的位置信息、顏色信息以及灰度信息。矢量文件通常用圖形的形狀參數和屬性參數來表示圖形。2)縮放的區別:位圖與分辨率有關而矢量圖與分辨率無關。3)存儲格式的區別。

7、計算機圖形系統的組成:輸入,存儲,交互,計算,輸出

簡單計算

1、顯示顏色為64K,分辨率為1024*1024,至少需要的幀緩存容量為:2M  

光柵圖形學算法

  光柵圖形算法多數屬於計算機圖形的底層算法,很多圖形學的基本概念和思想都在這一部分。研究內容主要有:

  ~直線段的掃描轉換算法

  ~多邊形的掃描轉換與區域填充算法

  ~裁剪算法

  ~反走樣算法

  ~消隱算法

一、直線段的掃描轉換算法

  直線是最基本的圖形,一個動畫或真實感圖形往往需要調用成千上萬次畫線程序,因此直線算法的好壞與效率將直接影響圖形的質量和顯示速度。在數學上,直線上有無窮多個點。但在計算機光柵顯示器上需要用有限個像素點去無限逼近這無窮多個點,因此就需要知道這些像素點的x,y坐標。

1、DDA畫線算法

   在確定像素點位置時可以利用直線方程 y = kx + b , 根據x點的坐標得到y點的坐標,但是這樣計算會使用到乘法,若是能將乘法運算轉換成加法運算,效率就會提高。數值微分DDA(Digital Differential Analyzer)法引進圖形學中一個很重要的思想——增量思想

 

    假設x0已知,每次沿x軸方向前進一個像素(步長為1),可以計算出相應的y值。因為像素點的坐標為整數,所以還要將計算得到的y值進行取整處理,取整的方法是將其加0.5再取整。如下推論可以得到增量公式,它的含義是當前y值等於前一步的y值加上斜率k,k稱為增量。

 

 2、中點畫線算法

    中點畫線算法不使用直線的斜截式方程,而使用直線的一般式方程F(x, y) = Ax + By + C 。一條直線將平面划分為三個部分:直線上的點、直線上方的點和直線下方的點。中點畫線算法每次在x方向上的步長為1,而在y方向上要不要變化需要判斷。其中判斷方法是取Pu和Pd的中點M,判斷M點在Q點的上方還是下方。若M點在Q點的下方,說明Pu點距離直線更近,所以選擇Pu點;若M點在Q點的上方,說明Pd點距離直線更近,所以選擇Pd點;若M點正好位於Q點處,則選擇Pu和Pd都可以。

    根據以上算法很容易知道要求的下一個像素點的坐標需要進行一次乘法運算和四次加法運算:di = A(Xi + 1) + B(Yi + 0.5) + C,其效率是很低的,因此這里也引入增量的思想求di。

3、Bresenham算法

   Bresenham算法並不依賴於直線方程,它提供了一個更一般的算法,該算法不僅有好的效率,而且有更廣泛的適用范圍。該算法的基本思想是通過各行、各列像素中心構造一組虛擬的網格線,按照直線起點到終點的順序,計算直線與各垂直網格線的交點,然后根據誤差項的符號確定該像素中與此交點最近的像素。該算法中增量 d = k ,且當d > 1時就將其減一,以保證算法的連續性。

 

  將Bresenham算法進行一些改進:

 二、多邊形掃描轉換與區域填充

   多邊形分為凸多邊形(任意兩頂點間的連線均在多邊形內)、凹多邊形(任意兩頂點間的連線有不在多邊形內的)和含內環的多邊形等。多邊形的掃描轉換和區域填充是研究怎么樣在離散的像素集上表示一個連續的二維圖形。多邊形有兩種表示方法:頂點表示(表示直觀、幾何意義強、占內存少,易於進行幾何轉換,但不能直接用於面着色)和點陣表示(丟失很多信息,但卻是光柵顯示系統顯示時所需的表現形式)。這就涉及到了兩個問題:1、如果知道邊界,能否求出哪些像素在多邊形內;2、知道多邊形內部的像素,反過來如何求多邊形的邊界。計算機圖形學解決的是第一個問題,這種轉換稱為多邊形的掃描轉換。

1、X—掃描線算法

   X—掃描線算法的基本思想是按掃描線的順序,計算掃描線與多邊形的相交區間,再用要求的顏色顯示這些區間的像素,即完成填充工作。算法步驟如下:

   1)確定多邊形所占有的最大掃描線數,得到多邊形頂點的最小和最大y值(ymin和ymax);

   2)從 y = ymin 到 y = ymax,每次用一條掃描線進行填充;

   3)對每一條掃描線填充的過程可分為四個步驟:a、求交:計算掃描線與多邊形各邊的交點;b、排序:把所有交點按遞增順序進行排序;c、交點配對(要保證掃描線與多邊形的交點是偶數個):第一個與第二個,第三個與第四個;d、區間填色:把這些相交區間內的像素置成不同與背景色的填充色。當掃描線與多邊形頂點相交時,要考慮交點的取舍問題。

  解決方案:若共享頂點的兩條邊分別落在掃描線的兩邊,交點只能算一個;若共享頂點的兩條邊在掃描線的同一邊,這時交點作為個,檢查共享頂點的兩條邊的兩外兩個端點的y值,按這兩個y值中大於交點y值的個數來決定交點數。如上圖:點(1,7)交點算一個;點(3,1)和點(8,1)算兩個;點(6,5)算零個。

  以上的算法效率非常低,因為需要大量的求交運算,而求交運算是非常可怕的。

  因此需要對以上算法進行改進,想辦法不進行求交運算。可以從以下三個方面考慮加以改進

  1)在處理一條掃描線時,僅對與它相交的多邊形的邊(有效邊)進行求交運算。下圖中有效邊為:P1P4和P2P3

 

  2)考慮掃描線的連貫性,即當前掃描線與各邊的交點順序與下一條掃描線與各邊的交點順序可能相同或非常相似。

   3)最后考慮多邊形的連貫性,即當某條邊y與當前掃描線相交時,它很可能也與下一條掃描線相交。為了避免求交運算,我們需要引進一套數據結構

   該數據結構包括以下幾個部分:

  1)活性邊表(AET):把當前與掃描線相交的邊稱為活性邊,並把他們按照與掃描線交點x坐標遞增的順序存放在一個鏈表中。

  2)結點內容:x(當前掃描線與邊交點的橫坐標),▲x(從當前掃描線到下一條掃描線間x的增量),ymax(該條邊上最大的y值,通過它判斷該條線還是不是活性邊)。容易知道▲x的值為1/k,其中k為直線斜率。

   為了方便活性邊表的建立與更新,還需要構造一個新邊表(NET),用來存放多邊形的邊的信息,分為四個步驟:

   1)首先構造一個縱向鏈表,鏈表的長度為多邊形所占有的最大掃描線數,鏈表的每個結點,稱為一個吊桶,對應多邊形覆蓋的每一條掃描線。、

  2)NET掛在與該邊低端y值相同的掃描線桶中。結點中包含的信息有:該邊的ymax、該邊較低點的x坐標值xmin、1/k以及指向下個結點的指針。

 2、區域填充算法

     區域是指已經表示成點陣形式的填充圖形,是象素的集合。區域填充是指將區域內的一點(常稱種子點)賦予給定的顏色,然后將這種顏色擴展到整個區域的過程。區域填充算法要求區域是聯通的,因為只有在聯通的區域中,才能將種子點的顏色擴展到區域內的其他點,區域可以分為4向聯通區域和8向聯通區域

     算法步驟:將種子象素入棧,當棧非空時重復執行如下的三個步驟

   1)棧頂象素出棧

   2)將出棧象素置成要填充的顏色

   3)按左、上、右、下的順序檢查與棧象素相鄰的四個象素,若其中某個象素不在邊界且沒有置成填充色,則把該象素入棧。

 三、反走樣

   解決走樣的方法:非加權區域采樣法、加權區域采樣法

   非加權區域采樣法:根據物體的覆蓋率計算象素的顏色。覆蓋率是指某個象素區域被物體覆蓋的比例。、

 四、消隱算法

   要消除二義性,就必須在繪制時消除被遮擋的不可見的線或面,習慣上稱作消除隱藏線和隱藏面,簡稱為消隱。消隱不僅與消隱對象有關,還與觀察者的位置有關。消隱一般分為兩大類,按照消隱對象分類可以分為線消隱(消隱對象是物體的邊)和面消隱(消隱對象是物體上的面);按消隱空間可以分為物體空間的消隱算法和圖像空間的消隱算法。以下是三個基於圖像空間的消隱算法:

1、Z-buffer算法:也叫深度緩沖器算法,該算法有幀緩沖器深度緩沖器,對應兩個數組。

   Intensity(x, y)——屬性數組,存儲圖像空間的每個可見象素的光強或顏色;

   Depth(x, y)——深度數組,存放圖像空間每個可見象素的z坐標。

   算法步驟:

   1)先將Z緩沖器中的各單元的初始值置為最小值;

   2)當要改變某個象素的顏色值時,首先檢擦當前多邊形的深度值是否大於該象素原來的深度值;

   3)如果大於原來的Z值,說明當前多邊形更靠近觀察者,用它的顏色替換象素原來的顏色。

   判斷一個像素點是否在多邊形內部的方法:射線法、弧長法和以頂點符號為基礎的弧長累加方法

2、區間掃描線算法:掃描線的交點把這條掃描線分成了若干個區間,每個區間上必是同一種顏色。

   如何確定小區間的顏色:

   1)小區間上沒有任何多邊形,則用背景色顯示;

   2)小區間只有一個多邊形,則顯示該多邊形的顏色;

   3)小區間上存在兩個或兩個以上的多邊形,必須通過深度測試判斷哪個多邊形可見

3、Warnock消隱算法(區域子分割算法):把物體投影到全屏幕窗口上,然后遞歸分割窗口,直到窗口內目標足夠簡單,可以顯示為止。

   1)如果窗口內沒有物體則按背景色顯示;

   2)如果窗口內只有一個面,則把這個面顯示出來;

   3)否則,窗口內含有兩個以上的面,則把窗口等分為四個子窗口。對每個子窗口再做上述同樣的處理。這樣反復的進行下去。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM