渲染管線
一、流水線的概念
-
流水線最終目的:生成或渲染一張二維紋理,輸入是一個虛擬像機,光源,Shader,紋理等。
-
硬盤 –>> RAM –>> 顯存
-
CPU發指令從硬盤到RAM內存,GPU將要顯示的緩存發到顯存
二、GPU渲染管線
-
渲染管線功能:決定在給定虛擬相機、三維物體、光源、照明模式,以及紋理等諸多條件的情況下生成或繪制一幅二維圖像過程。
-
流水線三個概念階段:應用階段、幾何階段、光柵化階段
1、應用階段:
- 將需要在屏幕上顯示出來的幾何體,也就是繪制圖元,比如點、線、矩形等輸入到繪制管線的下一個階段。輸出圖元的頂點數據、攝像機位置、光照紋理等參數。
-
將數據加載到顯存中:(硬盤–>內存RAM –>顯存–> VRAM)
- 設置渲染狀態:使用哪個着色器、光源屬性、材質等
-
調用DrawCall:一個命令,CPU調用GPU的命令,一個DrawCall指向需要渲染的圖元列表
2、幾何階段:
- 需要將頂點數據最終進行屏幕映射,輸出屏幕空間二維頂點坐標,頂點對應的深度值,顏色等相關信息。
- 將各個圖元從模型坐標系轉換到世界坐標系中,也就是模型變換
-
根據光照紋理等計算頂點材質的光照着色效果
- 根據攝像機位置、取景進行觀察變換和裁剪
-
進行屏幕映射,也就是把三維模型轉換到屏幕坐標系
3、光柵化階段:
- 輸入是經過變換和投影后的頂點、顏色以及紋理坐標,工作是給每個像素正確配色,以便繪制整幅圖形。
- 由於輸入的是三形頂點,所以需要根據三角形表面的差異,逐個遍歷三角形計算各個像素的顏色值。之后根據其可見性等進行合並得到最后的輸出。
三、幾何階段
- 頂點着色器:(可編程)模型變換(模型空間到世界空間)、視圖變換(世界空間到觀察空間)、逐頂點光照着色
- 幾何、曲面細分着色器:(可編程)頂點增刪,曲面細分,增加點使曲面更光滑
- 裁剪:(可配置)規范化投影變換(觀察空間到規范化觀察空間)、裁剪
- 屏幕映射:(固定)(規范化觀察空間到屏幕坐標系)
四、光柵化階段
- 三角形設置:(固定)將頂點設置成三角形
- 三角形遍歷:(固定)遍歷三角形,通過頂點的深度插值得到深度,得到三角形的每一個片元,片元是狀態的集合,用來計算每個像素的最終顏色。狀態包括屏幕坐標、深度信息、頂點信息、法線、紋理坐標等。
- 片元着色器:(可編程)根據上面狀態的集合對三角形的每一個片元計算顏色值
- 逐片元操作:(可配置)模板測試、深度測試、顏色混合、幀緩存
五、CPU到GPU
應用程序調用CPU去顯示,CPU從硬盤加載渲染需要的數據到內存,然后從內存里取到頂點數據傳給顯存。
CPU再通過Shader語言調用顯卡驅動來調用GPU,GPU取得顯存里的頂點數據等來計算得到要顯示到屏幕的幀緩存。
六、Shader 語言
OpenGL語言是GLSL(OpenGL Shading Language):優點是跨平台沒有提供着色器編譯器,由顯卡驅動來完成着色器編譯工作。依賴硬件而非操作系統層級的。
DirectX語言是HLSL(High Level Shading Language):由微軟控制着色器編譯,支持平台受限。
NVIDIA的CG(C for Graphic):真正的跨平台,會編譯成相應的中間語言,因為跟微軟合作,所以語法很像HLSL。
HLSL、GLSL、Cg是高級語言,會被編譯成匯編語言,也就是中間語言(Intermediate Language,IL),然后中間語言交給顯卡驅動來翻譯成真正的機器語言,即GPU可以理解的語言。
頂點着色器:Vertex Shader
幾何着色器:Geometry Shader
曲面細分着色器:Tessellation Shader
片元着色器:Fragment Shader
EBO(Element Buffer Object也叫IBO(Index Buffer Object))索引緩沖區對象,這個緩沖區主要用來存儲頂點的索引信息。
VBO(Vertex Buffer Object)頂點緩沖區對象,主要用來存儲頂點的各種信息。好處:模型的頂點信息放進VBO,這樣每次畫模型時,數據不用再從CPU的內存取,而是直接從GPU的顯存里取,提高效率。
VAO(Vertex Arrary Object)頂點數組對象,保存了所有頂點數據屬性的狀態結合,存儲了頂點數據的格式以及頂點數據所需的VBO對象的引用。本身並沒有存儲頂點的相關屬性數據,這些數據是存儲在VBO中的,VAO相當於是對很多個VBO的引用,把一些VBO組合在一起作為一個對象統一管理。