圖形渲染流水線


本文記錄《實時渲染》的讀書筆記。

圖形渲染的流水線包括三個階段:應用階段、幾何階段、光柵化階段。

1. 應用階段

應用階段是應用所驅動的,因此是被軟件所執行,並且運行在CPU上。根據不同的應用這個階段包括碰撞檢測、全局加速算法、動畫、物理模擬等。

2. 幾何階段

幾何階段負責每個多邊形和每個頂點的操作,通常這個階段可以分成以下幾個功能階段:模型和視覺變換——頂點shading——投影——裁剪——屏幕映射。

模型變化:每個模型都有它自己的坐標系,我們要把模型放到時間坐標系去中,就需要通過模型變換。每個模型都有一個與之相關的模型變換,通過這個模型變換可以把這個模型放在世界坐標系中合適的位置。
視覺變換:在場景中的所有模型,都必須在相機的可視范圍內才會變渲染出來,而這個相機也是放置在世界坐標系中的某個方位。為了方便后面裁剪和投影的計算,我們需要把世界坐標系變換成相機坐標系,也就是變換世界坐標系使相機處在坐標系的原點,X軸指向右邊,Y軸指向上方,朝向-Z軸(有些可能使用+Z軸)。而這個過程是通過視覺變換來完成的。
頂點shading:決定光線在某個材質上產生的效果的這個操作叫做shading。它涉及在不同的頂點上計算shading方程,產生的結果將用於光柵化。
投影:把可視空間(view volume)變換到單位立方體中,這個立方體的坐標范圍在(-1,-1,-1)到(1,1,1)之間,這個立方體叫做正規可視化空間(canonical view volume)。包括兩種投影,正交投影和透視投影。投影后的坐標系稱作標准設備坐標系(normalized device coordinates)。盡管這個過程是從一個空間變換到另一個空間,但這里仍用投影這個術語是因為經過顯示后z坐標不在存儲在圖像中(而是保存在Z-buffer中)。從這個角度上看,這是一個從三維到二維的變換。這里指的是經過顯示后的坐標,事實上,投影后坐標還是三維的。
裁剪:只有全部或者部分基本圖元的頂點出現在可視空間內才會被傳到光柵化階段,然后顯示在屏幕上。一個圖元的全部頂點都在可視空間內時,這個圖元會直接被傳到光柵化階段,如果全部頂點都不在可視空間內時,這個圖元就會直接被丟棄,因此只有那些部分頂點在可視空間的圖元才需要進行裁剪。不像其他可編程的階段,這個階段通常是被固定的硬件所操作。
屏幕映射:經過這個階段后坐標將從三維變成二維,這里的二維坐標將變成屏幕上的坐標。在DX10 之前每個像素的中心坐標為“0.0”形式,DX10以后以及OpenGL每個像素的中心坐標為“0.5”形式。另外,OpenGL以左下角為原點,DX以右上角為原點。
3. 光柵化階段
給定變換和投影后的頂點以及它們相應的shading數據,光柵化的目標是計算覆蓋在每個物體上的像素顏色。這個階段也可以分為幾個功能階段:三角形設置——三角形遍歷——像素shading——合並。
三角形設置:三角形表面的差異和其他的相關數據被計算出來。固定的硬件操作來完成。
三角形遍歷:這個階段檢查每個像素是否在三角形內部,fragment在這個階段產生。通常采用插值方法。
像素shading:使用插值shading數據作為輸入,輸出一個或者多個顏色值用於下一階段使用。這個階段是可以通過編程來控制GPU執行,在這個階段最常用的技術是紋理技術。
合並: 每個像素的顏色值存儲在顏色緩存(color buffer)中,並在這個階段進行顏色合並。這個階段不是完全可編程的,它可以被配置以產生不同的效果。這個階段會通過Z-buffer負責解決能見度(visibility)問題。除了color buffer和Z-buffer外,還有其他的一些buffer也在這個階段產生作用,比如alpha通道,用於執行alpha test,stencil buffer,用於記錄已渲染圖元的位置。


免責聲明!

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



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