GPU渲染流水線


當GPU從CPU得到渲染命令后,就會進行一系列流水線操作,最終把圖元渲染到屏幕上。

對於幾何階段和光柵化階段,開發者無法擁有絕對的控制權,其實現的載體是GPU。GPU通過實現流水線化,大大加快了渲染速度。

幾何階段和光柵化階段可以分成若干更小的流水線階段,這些流水線階段由GPU實現,每個階段GPU提供了不同的可配置性或可編程性。

從圖中可以看出,GPU的渲染流水線接收頂點數據作為輸入。這些頂點數據是由應用階段加載到顯存中,再由DrawCall指定的。這些數據隨后被傳遞給頂點着色器。

 

1.頂點着色器(Vertex Shader):完全可編程

通常用於實現頂點的空間變換、頂點着色等功能。

頂點着色器是流水線的第一個階段,它的輸入來自於CPU。頂點着色器的處理單位是頂點,輸入進來的每個頂點都會調用一次頂點着色器。頂點着色器本身並不會創建或者銷毀頂點,而且無法得到頂點與頂點之間的關系。

例如:我們無法得知兩個頂點是否屬於一個三角網格。正因為這樣的相互獨立性,GPU可以利用本身的特性並行化處理每一個頂點。

頂點着色器需要完成的工作主要有:坐標變換和頂點光照。當然還可以輸出后續階段所需的數據。

 

2.裁剪(Clipping):可配置

這一階段的目的是將那些不再攝像機視野內的頂點裁減掉,並剔除某些三角圖元的面片。

目的:處理不在攝像機視野范圍內的物體。

一個圖元和攝像機視野有三種關系:完全在視野內、部分在視野內、完全在視野外。完全在視野內的圖元即系傳遞給下一個流水線階段,完全在視野外的圖元就不會向下傳遞,因為不需要被渲染。而那些部分在視野內的圖元就需要進行一個處理,那就是裁剪。

和頂點着色器不同,這一步是不可編程的。無法通過編程來控制裁剪的過程,是硬件上的固定操作

但是可以自定義一個剪裁操作來對這一步進行配置

 

3.屏幕映射(Screen Mapping):不可配置和編程的

這一步輸入的坐標仍然是三維坐標系下的坐標。

負責把每個圖元的坐標轉換到屏幕坐標系中。

 

4.三角形設置(Triangle Setup)和三角形變量(Triangle Traversal)階段都是固定函數(Fixed-Function)的階段

這一階段開始進入光柵化階段。從上一個階段輸出的信息是屏幕坐標系下的頂點位置以及和它們相關的額外信息,如:深度值(Z)、法線方向、視角方向等。

光柵化階段有兩個重要的目標:計算每個圖元的覆蓋了哪些像素,以及為這些像素計算顏色。

三角形設置:計算光柵化一個三角網格所需的信息。具體來講,上一個階段輸出的都是三角網格的頂點,即我們得到的是三角網格每條邊的兩個頂點。但是如果要得到整個三角形網格對像素的覆蓋情況,我們就必須計算每條邊上的像素坐標。為了能夠計算邊界像素的坐標信息,我們就需要得到三角形邊界的表示方式。這樣一個計算三角形網格表示數據的過程叫做三角形設置。

三角形遍歷:檢查每個像素是否被一個三角網格所覆蓋。如果覆蓋的話,就會生成一個片段(fragment)。這樣一個找到哪些像素被三角網格覆蓋的過程就是三角形遍歷,這個階段也被稱為掃描變換(Scan Conversion)。

片段並不是真正意義上的像素,而是包含了很多狀態的集合,這些狀態用於計算每個像素的最終顏色。

 

5.片段着色器(Fragment Shader):完全可編程

用於實現逐片元(Per-Fragment)的着色操作。

片段着色器的輸入是上一個階段對頂點信息插值得到的結果,更具體來說,是根據那些從頂點着色器中輸出的數據插值得到的。輸出的是一個或者多個顏色值。

這一個階段可以完成很多重要的渲染技術,其中最重要的技術之一就是紋理采樣。為了在片段着色器中進行紋理采樣,通常會在頂點着色器階段輸出每個頂點對應的紋理坐標,然后經過光柵化階段對三角網格的3個頂點對應的紋理進行插值后,就可以得到其覆蓋的片段的紋理坐標了。

 

6.逐片元操作(Per-Fragment Operations):不可編程,但具有很高的可配置性

負責執行很多重要的操作,例如:修改顏色、深度緩沖、進行混合等。

這一階段OpenGL-逐片元操作 DirectX-輸出合並階段

這一階段有幾個重要的任務:

(1) 決定每個片元的可見性:這涉及了很多測試工作,例如:深度測試、模板測試

(2) 如果一個片元通過了所有的測試,就需要把這個片元的顏色值和已經儲存在顏色緩沖區中的顏色進行合並,混合


免責聲明!

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



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