對渲染管線的調研

2022-08-01 07:51:11 字數 3359 閱讀 4551

渲染管線, 英文 rendering pipeline, 我們可以將其理解為乙個流程, 即我們告訴 gpu 一堆資料, 最後得出來一副二維影象, 這堆資料報括 "視點 / 三維物體 / 光源 / 光照模型 / 紋理" 等元素.

渲染管線可以理解為一種流水線, 是對 "從得到模型資料到繪製出影象" 這一過程的稱呼. 渲染管線是實時渲染技術的底層工具, 影象中物體的位置及形狀是通過它們的幾何描述|環境特徵|以及該環境中虛擬攝像機的擺放位置來決定的. 物體的外觀受到了材質屬性|燈源|貼圖以及渲染模式的影響.

在圖形學中, 渲染管線主要分為三個大階段 : 應用程式階段 | 幾何階段 | 光柵化階段 .

渲染管線是在顯示器上為了顯示出影象而經過的一系列必要操作. 主要步驟有 : 本地座標 → 檢視座標 → 背面座標 → 光照 → 裁剪 → 投影 → 檢視變換 → 光柵化.

這個階段主要和 cpu 及記憶體打交道, 把該計算的都計算好了之後, 這個階段的末端就把這些計算好的資料通過資料匯流排傳給圖形硬體以供渲染 (時間瓶頸), 作為我們進一步處理的源資料進行幾何階段, 這些資料一般包括 頂點座標|法向量|紋理座標|紋理 等等.

應用程式階段通過高階程式語言進行開發, 主要任務是識別出潛在可視的網格例項, 並把它們及其材質呈交給圖形硬體以供渲染. 該階段負責驅動 gpu 管道, 有三個角色 :

1. 可見性判別 : 僅把可見或至少潛在可見的物體提交給 gpu , 以免浪費寶貴的資源去渲染看不見的物體.

2. 提交幾何圖元到 gpu 以供渲染 : 呼叫渲染呼叫介面, 把子網格材質對傳送至 gpu 進行下一步操作, 或者建立 gpu 命令表. 場景如果需要多步驟渲染, 則需要多次提交, 所提交的幾何圖元應該有適當的排序以及效能優化.

3. 控制著色器引數以及渲染狀態.

很多經典的演算法都是在這個階段進行的, 比如 碰撞檢測|場景圖建立|空間八叉樹更新|視錐裁剪 等等.

幾何階段基於 gpu 進行計算, 主要負責頂點座標變換|光照|裁剪|投影以及螢幕對映, 該階段的末尾得到經過變換和投影之後的頂點座標|顏色|以及紋理座標. 其主要工作可以概括為 : 變換三維頂點座標 和 光照計算.

三維頂點座標為什麼需要變換? 場景中的每個模型都可以用乙個向量來確定它的位置, 但是如何讓計算機根據這些座標把模型正確的有層次的畫在二維螢幕上, 這就需要去變換三維頂點座標, 最終目的就是讓 gpu 可以將這些三維資料繪製到二維螢幕上, 並讓二維畫面看起來有 3d 效果.

根據頂點座標變換的順序, 主要有如下幾個座標空間 : 區域性座標系(或稱自身座標系|建模座標系)|世界座標系|觀察座標系|視口座標系(螢幕座標系)等等.

幾何階段處理結束後, 送到光柵化階段是一堆三角形麵片, 所以幾何階段中還需要對頂點進行圖元裝配. 圖元裝配, 就是指根據頂點原始的連線關係, 還原出模型的網格結構. 網格由頂點和索引組成, 在之前的流水線中是對頂點的處理, 而在這個階段是根據索引將頂點連線在一起, 組成線|面單元. 然後對超出視口之外的三角形進行裁剪 (視口裁剪), 如果有乙個三角形其中乙個頂點位於畫面外, 另外兩個頂點位於畫面內, 我們將看到乙個四邊形, 這個四邊形又被劃分為兩個小的三角形.

裁剪是乙個大概念 : 包括 視域裁剪 (應用程式階段) | 視口裁剪 | 背面剔除 | 遮擋裁剪 (光柵化階段).

管道的最終階段為合併階段或者混合階段, nvidia 稱之為光柵運算階段, 光柵化的目的是計算出每個畫素的顏色值. 這個階段把幾何階段送來的三角形轉化為片段, 並對片段進行著色. 經歷了這階段之後,畫素的顏色值被寫入幀快取中

片段經過裁剪測試| alpha 測試|模板測試|深度測試|融合 等等處理之後, 最終和幀緩衝混合. 光柵化的過程大致如下圖所示 :

**背面剔除 → **

**alpha 測試 → **

紋理的顏色中含有 alpha 分量, alpha 分量主要用於指定畫素的透明度. alpha 測試指的是將乙個畫素點的 alpha 值和乙個固定值比較, 如果比較的結果失敗, 畫素就不會被寫到顯示輸出中.

**模板測試 → **

模板快取與深度測試快取|後台快取 (或顏色快取, 最終顯示在螢幕上的緩衝區) 的大小 (解析度) 完全一致, 模板快取中的畫素點與後台快取的畫素點是一一對應的, 模板快取允許我們動態地有針對性地決定是否將某個畫素寫入後台快取中. 模板快取用於獲得某種特效, 如鏡面效果或者陰影效果. 在實現鏡面效果時, 我們在 "鏡子"這塊區域中繪製某個特定物體的映像, 而使用模板快取來阻止物體映像在 "非鏡子" 的區域中進行繪製. 為了進行這種阻止, 就需要使用模板測試. 判斷是否將某個畫素寫入後台快取的決策過程, 稱為模板測試.

**深度測試 → **

當兩個物體有前後位置關係時, 位於前面的物體會將後面的物體部分或全部遮擋, 為了優化考慮, gpu 不應該繪製被遮擋的片段, 這種行為稱為遮擋剔除.

深度快取是乙個只含有特定畫素的深度資訊而不含影象資料的表面, 深度快取為最終繪製影象中的每乙個畫素都保留了乙個深度項. 所以, 當繪製的圖形的解析度為 640 * 480 時, 深度快取中將有 640 * 480 個深度項. 深度快取用於計算每個畫素的深度值並進行深度測試, 深度測試的基本內容是依據深度值讓處於同一位置的不同畫素進行競爭, 以選出該寫入該位置的畫素, 距離攝像機最近的畫素獲勝, 並被寫入深入快取的對應位置上. 這樣做是合理的, 因為距離攝像機最近的畫素一定會將位於其後方的畫素遮擋.

**alpha 融合 → **

融合技術能使我們將當前要進行的光柵化的畫素的顏色與先前已經光柵化並處於同一位置的畫素進行合成, 即將正在處理的圖元顏色值與儲存中後台快取中的畫素顏色值進行合成. 利用該技術我們可以獲得各種各樣的效果, 尤其是透明效果. 不過值得注意的是, 為了在場景中繪製透明物體, 通常需要對物體按照由後向前的順序進行混合處理, 如果按照任意順序進行處理將會產生嚴重的失真. 所以在 blending 操作之前要來一次 depth test.

**抖動處理 → **

在低位深度的影象中, 由於顏色總數的限制, 有些顏色無法顯示出來, 為了模擬出那些顏色以提高顯示效果, 廣泛採用了一種稱為抖動處理的方法, 也稱為半色調處理. 它是指用交替的點圖案去模擬在影象中不能使用的顏色的過程. 單色圖象是最簡單的格式, 一般由黑色和白色組成, 在一些單色圖象如黑白**和有深淺的圖案中, 會使用各種灰度, 這種圖象常被稱為灰度圖象 (grayscale image). 由於人眼會把乙個很細緻的黑白相間的圖案解釋成灰色, 所以灰度圖象也可使用單色檔案格式, 資料仍然可以是黑和白. 使用黑色或某一種單色的點獲得連續的該色灰度的過程就是抖動處理. 抖動處理被更多的用在那些低位數彩色圖象檔案中, 與不採用這種處理相比, 它具有更好的顯示效果.

→ 瞎聊 unity shader 系列之二:渲染管線

→ 學習shader之前必須知道的東西之計算機圖形學(一)渲染管線

→ ** gpu圖形固定渲染管線

end.

OpenGL ES渲染管線

渲染管線 graphics pipeline 在 opengl es 1.0 版本中,支援固定管線,而 opengl es 2.0 版本不再支援固定管線,只支援可程式設計管線。什麼是管線?什麼又是固定管線和可程式設計管線?管線 pipeline 也稱渲染管線,因為 opengl es在渲染處理過程中...

opengl渲染管線

學習著色器,並理解著色器的工作機制,就要對opengl的固定功能管線有深入的了解。首先要知道幾個opengl的術語 渲染 rendering 計算機根據模型 model 建立影象的過程。模型 model 根據幾何圖元建立的物體 object 幾何圖元 包括點 直線和多邊形等,它是通過頂點 verte...

GPU渲染管線

3 光柵化階段 4總結 主要是為了得到三維頂點的法線,紋理等資料資訊 但是不能夠 幾何階段這個座標系轉化如下 這個階段主要做的事情事頂點著色器 模型變換,檢視變換,頂點著色 模型變換 將建模座標系轉化為世界座標系,相當於以物體為中心轉化為以世界為中心的轉化,可以理解為為模型統一乙個座標系 檢視變換 ...