《Real-Time Rendering 4th Edition》讀書筆記--簡單粗糙翻譯 第二章 渲染管線 The Graphics Rendering Pipeline

寫在前面的話:因爲英語不好,所以看得慢,所以還不如索性按自己的理解簡單粗糙翻譯一遍,就當是自己的讀書筆記了。不對之處甚多,以後理解深刻了,英語好了再回來修改。相信花在本書上的時間和精力是值得的。

—————————————————————————————————————————————————————————
“鏈條的堅固程度取決於它最薄弱的環節”

        這章講的是實時渲染的核心內容,圖形渲染管線,通常簡稱爲管線。管線的主要功能是通過給定一個虛擬攝像機一些三維物體光源等來生成或渲染出一個二維圖像,因此渲染管線是實時渲染的基礎。圖2.1描述了渲染管線的過程。物體在圖片中呈現出的位置和形狀由他們的幾何形狀、環境特徵以及攝像機在環境中的位置決定。物體的外觀由材質屬性、光源、表面貼圖以及渲染方程決定。

圖2.1 在左邊的圖中,位於錐形頂端處是一個虛擬攝像機,只有在攝像機視體裏的圖元才能被渲染。在透視投影(本例所示)中,視體是一個平截頭體。右邊的圖表示的是攝像機看到的內容。注意左邊圖中的紅色甜甜圈形狀的物體並沒有被繪製,因爲它位於平截頭體之外。同理左圖中的藍色扭曲棱體超出平截頭體上半部分裁剪掉了。

接下來我們將詳細介紹渲染管線的各階段的功能而不是其實現, 各階段的應用細節將會在後面章節介紹。

2.1  Architecture 架構

       在現實世界中,管線這個概念被應用到了各行各業,例如工廠的生產線、快餐廚房。在圖形渲染管線中,每個階段都有着大量的工作量。

        渲染管線各階段是並行執行的,每個階段又都依賴上一個階段的結果。理想上,一個非管線系統被分成n個管線階段可提高n倍性能。能提高性能是使用管線的主要原因。舉個例子,一部分人一起準備着大量的三明治,一個人負責麪包,一個人負責給麪包加肉,剩下的人負責給麪包加入澆頭。每個人將處理完的三明治交給下一個人進行處理,然後繼續處理下一個三明治。如果每個人需要花費20秒處理完手裏的一個三明治,那麼每個三明治的完成速度最快是20秒,每分鐘3個。雖然管線各階段是並行執行的,但是他們在最慢的階段完成任務之前會被停止。舉例,如果在加肉環節,加入的肉多了,需要花費30秒,那麼一分鐘最快只能生產2個三明治。對管線而言,加肉階段就是瓶頸,它決定了整個生產過程的速度。加入澆頭階段(消費者一樣)在等待加肉階段完成之前都處於一個飢餓狀態。

        這種結構的管線也應用到了計算機圖形實時渲染環境中。一個粗糙的實時渲染管線被分爲4個階段:應用階段,幾何處理階段,光柵化階段和像素處理階段,如圖2.2。這個結構是計算機圖形實時渲染應用程序的核心,也是後續章節討論內容的基礎。這些階段本身可以成一個管線,可由幾個子階段組成。我們在這裏是按照功能和實現方式區分的。每個階段都有着明確的工作,但是沒有指出工作執行的特定方式。例如一個指定的實現方式是聯合兩個階段爲一個單元,或者使用可編程核心執行,同時將另外一個更耗時的階段劃分成幾個硬件單元。

圖2.2 渲染管線的結構粗糙的分成4個階段:應用階段(application)、幾何處理階段(geometry processing)、光柵化階段(rasterization)和像素處理階段(pixel processing)。每個階段本身又可以是一個管線,如幾何階段可以分成幾個子階段,綠色矩形所示;或者如像素處理階段所示,一個階段(或部分)可以平行處理,粉紅色矩形所示。圖中,應用程序階段是一個單一處理過程,但是這個階段也可以分成多個子階段或者多個平行階段。注意光柵化階段是在判定那些像素在一個圖元(例如一個三角形)中。

        渲染速度用每秒多少幀(FPS)來表示,也就是每秒可渲染多少張圖。也可以用赫茲(HZ)來表示,赫茲表示每秒更新的頻率。當然用時間毫秒來表示也行,也就是渲染一張圖所用的時間。生成一張圖所用的時間通常不一樣,取決於每幀的計算複雜度。FPS不僅可表示特定幀的速率,也可以表示一段時間內的平均速率。Hz通常用於硬件,例如屏幕刷新速率,通常是個固定速率。

        顧名思義,應用階段由應用程序驅動,因此應用階段是應用在運行在一些通用CPU上的軟件程序中。這些CPU通常是多核的,有多線程並行處理的能力。應用階段可利用CPU高效處理大量的工作 。這些工作按程序需求可分爲傳統的碰撞檢測、全局加速算法、動畫、物理模擬等等。應用階段下一主要階段是幾何處理階段,這一階段主要是處理變換、投影以及其他的各種類型的幾何處理。在這階段主要是計算什麼被繪製,如何繪製,繪製在哪。幾何處理階段很明顯是應用在圖形處理單元(GPU,擁有很多可編程核心)和一些固定操作硬件中。光柵化階段通常是利用三個頂點作爲輸入,形成一個三角形,然後找到三角形中所有的像素,然後將這些像素轉發到下一階段。最後,像素處理階段對每一個像素執行一段程序來決定像素的顏色,是否進行深度測試來判斷是否可見,是否和上一個顏色混合出新的顏色。光柵化階段和像素處理階段都是整個階段在GPU中執行。下面四個小節將介紹這四個階段及其子階段。更多關於GPU如何處理這些階段將在第三章詳細說明。

2.2 應用階段

        應用階段通常在CPU上執行,開發者有完全的自主權。因爲,開發者可以完全決定它的實現,並可在後期修改來提高它的性能。這一階段的改變對後續階段的性能同樣產生影響。例如,在應用階段的一些算法或者設置可以減少繪製的三角形數。

        一些應用程序的工作可以利用特定的計算着色器在GPU上執行。計算着色器如果忽略其特定的渲染圖形功能,可以看作高度並行的通用處理器。

        在應用階段的最後會將需要渲染的幾何圖形提交給幾何處理階段。這些幾何圖形被稱爲渲染圖元,例如點、線和三角形,最後呈現在屏幕上。這也是應用階段最重要的工作。

        如果應用階段是基於軟件實現的話,那麼這一階段沒有像幾何處理階段、光柵化階段、像素處理階段那樣分成了幾個子階段。爲了提高性能,這一階段通常利用幾個處理單元處理工作。在CPU設計上,這通常被稱爲超標量體系結構,因爲他可以同時在工作在幾個處理單元上。8.5章節將會介紹一些利用多處理器單元的方法。

        在應用階段通常會處理碰撞檢測。在兩個物體之間的碰撞被檢測到後,會有對應的處理,例如返回碰撞的物體及碰撞產生的力反饋。在這階段也處理輸入系統,例如鍵盤、鼠標或頭戴式顯示器。基於這些輸入,不同的處理結果會被執行。還有一些加速算法,例如特定的裁剪算法,一些管線無法處理的工作都會在應用程序階段處理。

2.3 幾何處理階段

        幾何處理階段的主要工作是負責對大部分三角形和頂點的操作。這階段可以劃分成下圖2.3所示的幾個功能階段:頂點着色、投影、裁剪和屏幕映射。

圖2.3 幾何處理階段按功能可分成的子階段

2.3.1 頂點着色

        頂點着色主要有兩個工作,計算頂點的位置和計算出程序可能需要的頂點數據,例如法線和紋理座標。以前,大部分物體着色是計算光作用於頂點位置和法線,並將計算後的顏色存儲在頂點。然後這些顏色會插值到三角形。因此,這個可編程的頂點處理單元被稱爲頂點着色。隨着現代GPU的發展,伴隨着部分或者全部像素的着色,頂點着色階段越來越簡單,甚至都不需要計算着色方程,這取決於程序的設計者。頂點着色現在越來越方便將數據設置給頂點。例如,頂點着色器可以利用章節4.4和章節4.5中的方法給物體添加動畫。

        我們首先描述計算頂點位置。被呈現到屏幕之前,一個模型被變換到好幾個空間和座標系中。一開始,模型處在自己的模型空間,這意味着模型沒有進行任何變換。每個模型都可以通過模型變換進行移動和旋轉改變座標位置和朝向,而且可以多次進行變換。在同一場景中每個模型實例可以擁有不同的位置,方向大小而不需要改變模型的基本幾何形狀。

        模型變換其實對模型的頂點和法線進行變換。一個物體的座標被稱爲模型座標。經過模型變換後,模型可以說處在世界座標中或者在世界空間中。世界空間是唯一的,每個模型經過各自的模型變換後,都處於世界空間中。

        正如先前提到的,只有在攝像機看到的模型纔會被渲染。攝像機在世界空間中擁有一個位置和方向。爲了方便投影和裁剪,攝像機和所有的模型都會經過觀察變換觀察變換的目的是將攝像機轉換到原點,並設置好它的朝向,攝像機對準的方向是z軸的反方向,y軸向上,x軸向右。我們約定攝像機是朝向-z軸,有些文中設定的是+z軸。這是語義上的不同,對變換而言,從+z軸到-z軸的變換很簡單。經過觀察變換後的實際位置和方向取決於底層的應用程序編程接口(API)。觀察變換後的空間可以叫攝像機空間,更常見的是叫觀察空間或者視野空間。圖2.4所示是一個模型經過觀察變換後攝像機和模型的變化。模型變換和觀察變換都需要用到4x4的變換矩陣,這將在第四章講到。然而,意識到頂點和法線能被編程計算是很重要的。

圖2.4 在左邊圖中,是一個自頂向下的視圖,攝像機在世界空間中的位置不再原點,世界空間的+z軸是朝上的。右圖,經過觀察變換後,攝像機的位置在原點,並且攝像機的觀察方向是-z軸,攝像機的x軸朝右,y軸指向屏幕外。這是爲了投影和裁剪更簡單更快。圖中藍色區域表示的是視體,這裏用的是透視投影,所以視體是平截頭體。其他類型的投影都是類似的技術。

        接下來,我們描述頂點着色的第二種輸出。爲了生成一個足夠現實的場景,只是渲染出物體的形狀或者頂點是不足夠的,物體的外觀也是需要模仿的。這包括物體的材質以及光照在物體上的反光。從簡單的顏色到細緻物理特徵,材質和光可以有多種方式建模。

        決定一個光在材質上的效果的操作叫着色。它需要計算物體每個頂點上着色方程。有些頂點計算是在幾何處理階段,還有些是在像素處理階段。各種材質數據可以存儲在頂點,例如頂點座標,法線,顏色以及任何計算着色方程需要的數字信息。頂點着色生成的數據會被轉送到光柵化階段和像素處理階段,進行插值,計算表面着色。

        在第三章和第五章,以GPU頂點着色器的形式將會更深入的討論頂點着色。

       作爲頂點着色的組成部分,渲染系統需要執行投影和裁剪。將視體轉換到一個極值點爲的單位立方體中。體積可以用不同的範圍來定義,例如。這個單位立方體被稱爲標準化視體。首先是在GPU上的頂點着色器中完成投影,投影有兩種方式,正交投影(又稱平行投影)和透視投影。如圖2.5所示,實際上,正交投影只是平行投影中的一種,在建築學中可見其他的類型的平行投影,例如三向投影、傾斜投影。

圖2.5 左邊是正交投影 ,右邊是透視投影

        注意,投影矩陣,通常會和其他的幾何變換組合在一起。

        正交視角的視體通常是一個矩形,經過正交投影后變成一個單位立方體。正交投影的主要特徵是平行線經過變換還是平行的。這個變換是由平移變換和縮放變換組合而成。

        透視投影稍微複雜點。在透視投影中,物體裏攝像機越遠,投影后物體變得越小。此外,平行線會在遠方合攏。透視變換模擬了人眼,能感覺到物體大小的變化。在幾何學上,視體稱爲平截頭體,就像一個金字塔頭部被截斷了。這個平截頭體同樣需要被轉換成單位立方體中。不管是正交變換還是透視變換,都可以用一個4x4的矩陣表示,模型經過投影變換後,模型會變換到裁剪座標中。裁剪座標是一個齊次座標,將會在第四章討論到,這裏是沒有除以w的。GPU的頂點着色器必須每次都輸出的是這種類型的座標,爲了確保下一階段,裁剪階段能夠工作正常。

        儘管這些矩陣是把一個體積變換成另外一個體積, 但是他們被稱爲投影是因爲在後續的生成的圖像中z座標沒有存儲,而是存儲在了z-buffer中。通過這種方式,模型就從三維空間投影到了二維平面中。

2.3.2  可選的頂點處理

        每個管線都有剛描述到的頂點處理。一旦該頂點處理完成,GPU有幾個可選階段,按照順序:細分曲面(tessellation),幾何着色( geometry shading),流輸出( stream output)。他們需要看硬件是不是支持,並不是所有的GPU都支持,以及看程序是否需要。他們彼此之間相互獨立,通常沒用到。第三章會講述更多細節。

        第一個可選階段是細分曲面。想象一下,你有一個彈跳球對象。如果你只是用一些列的三角形來描述它,那麼你會面臨一個質量和性能問題。你的球可能在5米外看起來很好,但是仔細觀察每個三角形,特別是輪廓處的三角形,是看得見的。但是一旦你爲了提高質量,用更多地三角形來描述球,你可能在離球足夠遠且球在屏幕上只有幾個像素的時候浪費掉大量的處理時間和內存。而細分曲面,可以用適當的三角形表示一個曲面。

        我們已經談了一點三角形,但是到目前爲止我們只是處理了頂點。頂點可以用來表示點、線、三角形或其他的物體。頂點也可以用來表示曲面,例如球。這些表面需要一組控制點(稱爲Patch,可以理解爲一個很粗糙的曲面)來定義,而每個控制點又由一組頂點構成。細分曲面階段可分成幾個子階段——外殼着色器,細分曲面,域着色器——將這些控制點頂點轉換成更大的頂點集合,然後用這個頂點集合製作出更多地新的三角形。場景中的攝像機用來決定多少三角形需要被製作,當攝像機靠近控制點Patch的時候需要更多地三角形,反之需要的三角形少。

        下一個可選階段是幾何着色器。幾何着色器的出現比細分曲面着色器早,在GPU上幾何着色器要被支持的更多。類似於細分曲面着色器,幾何着色器也是把各圖元的頂點細分歸類,然後生成更多地頂點。這個階段相比細分曲面要簡單的多,因爲生成的頂點是有數量限制的,輸出的圖元種類也有更多地限制。幾何着色器有很多的用途,其中最爲流行的用法是來生成粒子,比如模擬煙花爆竹的效果。每個火球都可以由一個點,單個頂點來表示。幾何着色器可以把這些點轉變成一個面朝着觀察者的擁有些許像素的正方形以方便進行着色。

        最後一個可選階段是流輸出。這個階段我們可以把GPU當做一個幾何引擎。沒有將我們處理好的頂底輸出給下一個管線階段進而渲染到屏幕,而是選擇輸出這些頂點到一個數組中以便將來用得着。這些數據可以存儲起來,以便被CPU或GPU在未來使用。流輸出最典型的使用是用來模擬粒子,例如煙花。

        可選的三個階段的順序是——細分曲面,幾何着色,流輸出,每一個都是獨立可選的。不管這幾個階段是否被選,渲染管線會繼續走到下一個階段,需要判定生成頂點(座標是齊次座標)是否在攝像機視野內。

2.3.3 裁剪

        只有全部或者部分在視體內的圖元才能被傳給光柵化階段,然後被繪製在屏幕上。如果圖元完全在視體之外,並不會傳給光柵化,因此不會被渲染。對於那些部分在視體內的圖元,需要進行裁剪掉在視體之外的部分。這樣,在視體之外的頂點會被視體和連線相交處的新頂點取代。經過投影矩陣後,意味着圖元是用單位立方體進行裁剪。在裁剪之前執行觀察變換和投影變換的好處是可以簡化裁剪,圖元總是用單位立方體進行裁剪。

        裁剪過程如圖2.6所示。除了視體的6個裁剪面外,還可以自定義額外的裁剪面,818頁處的圖19.1展示了一種自定義裁剪,稱爲切割(sectioning)。

        裁剪每步使用的是投影后生成的4值齊次座標。在透視空間內並不會對三角形進行線性插值。齊次座標的第4個值在透視投影的時候很重要。最後通過透視除法將三角形的座標結果轉換到三維規格化設備座標中。前面提到的,視體的範圍變成了從幾何階段的最後一個步驟會將裁剪空間變換到屏幕空間。

圖2.6  投影變換之後,只有在單位立方體內的圖元纔會進行下一步處理。因此,在單位立方體之外的圖元是會被剔除的,在單位立方體之內的圖元被保留。和單位立方體相交的圖元,相交的交點會變成新的頂點,立方體之外的頂點會被丟棄。

2.3.4 屏幕映射

在視體內的圖元被傳輸到屏幕映射階段,此時的座標仍然是三維座標。每個圖元的x軸和y軸被變換爲屏幕座標屏幕座標加上z軸被稱爲窗口座標。假設屏幕需要被渲染到窗口中,窗口的左下角座標爲,右上角的座標爲,有屏幕映射就是一個縮放的操作。映射後的x,y座標稱爲屏幕座標,z軸(opengl範圍是[-1,1], directx的範圍是[0,1])同樣被映射到[z1,z2]範圍內,其中z1=0,z2=1是默認值。可以通過API來改變這兩個值。z軸重映射後的屏幕座標被傳輸到光柵化階段。圖2.7表示了屏幕映射過程。

圖2.7 投影變換後在單位立方體內的圖元經過屏幕映射後在屏幕上找到對應的座標位置。

        接下來描述如何通過整數和浮點數關聯到像素點。在笛卡爾座標系中,給定一組水平像素[0,9],最左邊像素的最邊緣的浮點值座標爲0.0,像素的中心座標爲0.5。所以一組像素[0,9]包含區間爲[0,10),公式如下

d表示像素的索引,是離散的整數,c表示像素點在內的連續浮點數。

        所有的API關於像素位置的座標都是從左往右遞增的,至於零點座標是在左上角還是左下角是不一致的,OpenGL用的是笛卡爾座標,左下角是零點座標,而DirectX大部分時候是左上角作爲零點的,需要視情況而定。當從一種API移植到另外一種API,考慮到兩者之間的不同很重要。

2.4 光柵化階段

        有了經過變換和投影后的頂點及幾何處理後的相關渲染數據,接下來一個階段的目標就是找到所有需要被渲染的圖元的全部像素,我們稱這個過程爲光柵化,它可分成兩個子階段:設置三角形和遍歷三角形,如圖2.8所示。注意這些處理也可以處理點和線,之所以子階段名字裏有三角形是因爲三角形最爲常見。光柵化又叫掃描轉換,是將屏幕空間裏的二維頂點(包含有z值表示深度和頂點相關的各種渲染信息)轉換到屏幕像素點的過程。光柵化可以認爲是幾何處理和像素處理之間的一個同步點,因爲這裏構成三角形的頂點由幾何處理得到,同時光柵化後的像素會交給像素處理階段進行處理。

圖2.8 左邊:光柵化分成兩個子階段,設置三角形,遍歷三角形。 右邊:像素處理階段分成兩個階段,像素着色,合併。

        判斷三角形是否覆蓋住了像素取決於你如何設置GPU管線。舉個例子,你可能使用點採樣去決定是否在三角形裏面 。最簡單的例子是用一個點採樣像素的中心,如果中心點在三角形內,可以認爲該像素在三角形內。你也可以利用多個點來採樣,例如超級採樣supersample或多重採樣multisample抗鋸齒技術。還有一種方式是利用保守光柵化技術,如果像素只要有一點和三角形重疊,就認爲像素在三角形內。

2.4.1 設置三角形

        在這個階段會計算三角形的差異,邊緣方程等數據。這些數據會被用來遍歷三角形,插值幾何階段生成的各種着色數據。這個由硬件支持。

2.4.2 遍歷三角形

        這裏是檢測每個像素的中心(或採樣點)是否在三角形內,並給在三角形內的像素生成一個片元(fragment)。在5.4章節有更詳細的採樣方法。

       尋找哪些像素或者採樣點在三角形內的過程叫遍歷三角形。每個三角形片元的屬性內容都由三角形三個頂點插值而來。這些屬性包括片元的深度,幾何階段生成的着色數據。每個圖元內的像素或採樣點都會傳送給像素處理階段,接下來會講到。

2.5 像素處理階段

        到目前爲止,由前面一系列步驟生成的像素的都拿到了。像素處理階段可分成像素着色和合成兩個階段。如圖2.8所示。像素處理階段可以認爲是對每個圖元內每個像素或採樣點進行逐像素或逐採樣點計算和操作的地方。

2.5.1 像素着色

        任何逐像素着色計算都在這裏進行,以插值的着色數據作爲輸入。輸出到下一階段的是一個或者多個顏色值。不像設置三角形和遍歷三角形是由專門的硬件來計算,像素着色階段是由可編程的GPU單元執行。程序員提供一段程序給像素着色器(或者片元着色器)。這裏需要用到大量的技術,其中最重要的一項是紋理(texturing)。第六章會詳細講到texturing。簡單說,texturing一個物體就是爲了各種各樣的目的給一張或多張圖像添加到物體上。圖2.9展示的是一個簡單的例子。 這些圖像可以是一維、二維、三維圖像,其中二維圖像運用最多。最簡單的理解是經過texturing後會生成每一個片元的顏色值,並會傳送到下一階段。

圖2.9 左上圖是一個沒有貼圖的巨龍模型  左下圖是添加了各種貼圖後的巨龍模型

2.5.2 合併

        每個像素的信息都存儲在顏色緩衝(color buffer)中,顏色緩衝是一個顏色值得矩陣(包含紅綠藍三色通道)。合併階段的職責是將由像素着色階段生成的顏色值和當前存儲在顏色緩衝中的顏色進行結合。這個階段又可以稱爲ROPraster operations (pipeline)或 render output unit,取決於你問誰)。不像像素着色階段,GPU子單元處理這個階段不是完全可編程的,然而他是可以高度可配的,可生成各種效果。

        這個階段同時也負責解決可見性。這意味着當整個場景被渲染後,顏色緩衝應該包含有所有攝像機能看到的圖元的顏色值。對大部分甚至全部圖形硬件,都是通過z-buffer(又稱深度緩衝)來做這件事的。深度緩衝和顏色緩衝類似,對每個像素而言,他將z值存儲到了離得最近的圖元上。這意味着當一個圖元上的某個像素需要被渲染的時候,需要計算該圖元上該像素的z值並同深度緩衝中當前像素的z值進行比較。如果新計算出來的z值比存儲在深度緩衝中的z值小,則說明當前像素點上的正在渲染的圖元比先前離攝像機最近的圖元更接近攝像機。因此,當前像素的z值和顏色值需要更新。如果計算出來的z值比存在深度緩衝中的z值大,則顏色緩衝和深度緩衝中當前像素點的顏色和z值是不需要改變的。深度緩衝算法是簡單的,複雜度爲O(n),其中n是需要渲染的圖元的數量,適用於任何能給相關像素計算z值得圖元。同時注意這個算法運行大部分圖元是無序渲染的,這也是該算法流行的另外一個原因。然而,因爲深度緩衝只存儲了屏幕上每個點的一個單一值,所以它並不能給半透明圖元用。半透明圖元必須在所有不透明圖元渲染之後進行渲染, 並且是從後到前的順序進行,或者使用一個獨立與順序無關的算法(5.5節有講)。透明度是基本z-buffer最主要的幾個缺點之一。

        我們已經說過了顏色緩衝是用來存儲每個像素的顏色值,深度緩衝存儲的是每個像素的z值。然後,還有其他的通道或者緩衝可以用來過濾或抓取片元信息。和顏色緩衝相關的alpha通道被用來存儲像素的透明度。在舊的API中,alpha通道被用來進行alpha測試選擇性的剔除一些像素。如今,剔除操作可以在像素着色器中完成,並且任何類型的計算都可以觸發剔除。alpha測試可以被用來確保全透明片元不會影響到深度緩衝。

        模板緩衝是一種離屏緩衝,被用來記錄已渲染的圖元的位置。通常每個像素有8bits。圖片可以通過各種功能被渲染進模板緩衝,然後模板緩衝被用來控制是否渲染進顏色緩衝和深度緩衝。舉例,假設一個圓形區域繪製進模板緩衝中,就可以利用模板緩衝只在圓形區域的圖元能被渲染進顏色緩衝中。模板緩衝能用來做一些特殊效果。組合階段最後的操作被稱爲光柵操作(raster operations ,ROP)或者 混合操作(blend operation)。它可以將三角形內正在處理的像素顏色同顏色緩衝中的顏色進行混合。這可以影響透明度或者顏色樣本的卷積。混合不是完全可編程的,而是可配的。然而一些API已經支持光柵順序視圖( raster order views),或者稱爲像素着色器可序( pixel shader ordering),使得混合可編程。

        幀緩衝通常包含系統中所有的緩衝。

        一旦圖元到達並通過了光柵化階段,那麼這些圖元將被繪製到屏幕上。顏色緩衝中的內容將會繪製到屏幕上。爲了避免,觀察者看到圖元正在被光柵化的過程,產生了雙緩衝技術。這意味着場景會被離屏渲染進後緩衝中,一旦場景被渲染完成,後緩衝會被交換到前緩衝,然後呈現到屏幕上。這個交換髮生在垂直回掃(vertical retrace)中(垂直同步),這是爲了安全 (防止出現閃爍斷層等現象)。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章