Shader程式設計之渲染流程

2021-12-30 03:29:34 字數 3064 閱讀 9698

一、圖形渲染與渲染流水線在計算機中的圖形渲染,給定乙個視點,和需要繪製的圖形的幾何頂點的幾何,然後通過一系列的數**算,然後轉換為計算機可以識別的資料最後顯示在二維的螢幕上。

在我們生產手機的工廠中就有許多的流水線,流水線的每個階段都執行不同的功能,而在計算機圖形中我們也是將圖形的渲染分為幾個大的階段,而每個大的階段中又有幾個小的階段,在大的階段中我們通過把渲染管線分為三個階段 1、應用程式階段 2、幾何階段 3、光柵化階段

應用程式階段主要是在cpu執行,使用c/c++等程式語言,對記憶體中的資料進行操作。,在應用程式階段主要執行了幾個操作:

1、圖形繪製資料的載入,將硬碟中的圖形資料載入到系統記憶體中,當資料載入到記憶體中後我們可以操作頂點進行相關的操作,列入碰撞檢測,場景圖形的建立,剔除完全處於攝像機視野的幾何體(裁剪)等。在進行這些操作之後把我們需要進行圖形渲染的資料再拷貝到視訊記憶體中。提供給我們的gpu進行資料的渲染。

2、設定渲染狀態,渲染狀態就是指定那些網格使用那些材質和著色器,以及怎樣的方式去繪製這些網格,不同的物體有不同的渲染狀態,當我們沒有對物體改變渲染狀態時則所有的物體都會使用同一種渲染狀態。

3、在所有的工序都準備好之後我們就可以開始進行圖形渲染了,cpu向gpu傳送圖形繪製的指令,gpu接收到繪製指令之後就會根據渲染狀態對對應的的物體進行渲染。而這些指令在directx或者opengl中則表現為圖形繪製命令。

在了解到應用程式階段執行的操作之後我們還需要知道cpu和gpu之間資料又是如何拷貝到視訊記憶體中的,以及繪製圖形緩慢的原因。

1、cpu與記憶體之間通過記憶體寬頻進行連線,cpu通過記憶體寬頻獲取記憶體中的資料進行處理,在處理完成之後又通過記憶體寬頻傳遞到記憶體中儲存,而記憶體中的資料則是通過pcle寬頻進行傳輸到視訊記憶體進行儲存,gpu則和cpu一樣通過視訊記憶體寬頻獲取視訊記憶體中的資料進行處理,在處理完成之後也通過視訊記憶體寬頻存放到視訊記憶體中,等待以後的利用。

2、當我們每次繪製一次圖形,都需要從cpu向gpu傳遞繪製圖形的資料,每次資料的傳遞都需需要在視訊記憶體中分配一片接觸空間來儲存這些資料,而且pcle記憶體寬頻的資料傳輸速率又低,這樣導致cpu運算過載,而gpu本身處理速度很快,在處理完成上一次的繪製資料後沒有新的繪製指令就會不在進行運算。在現代的圖形繪製系統中為了解決這個問題,cpu在向gpu傳送圖形繪製指令的時候建立乙個命令緩衝,將需要繪製的模型資料和繪製指令、渲染狀態等一次性通過pcle記憶體寬頻傳遞到視訊記憶體,此時gpu只需要從命令緩衝中讀取繪製指令進行圖形的繪製就行,而不必每繪製一次圖形,就傳遞一次資料和指令。

1、為什麼使用gpu出來資料而不直接使用cpu

cpu由大部分的控制器和暫存器組成很少的部分邏輯運算單元(alu),控制器的主要主要作用是從執行的程式中取出執行,然後對指令進行分析確定該執行怎樣的操作,然後通過協調各個硬體部分進行協調工作,而邏輯運算單元則用於對程式中的資料進行運算處理,由於cpu中的邏輯運算單元很少,再進行資料運算的時候非常的慢.所以在cpu中適合用於指令的獲取與分析,控制和協調計算機各個部分的共同工作。

gpu則由大部分的邏輯運算單元和少部分的控制器組成,並且gpu採用的是並行設計結構,即在gpu中可以在同一時刻同時處理多個資料,而且運算速度非常的快,適合用於大量的資料運算,但在指令解析等方面則非常的弱,同時在處理資料的時也無法知道資料與資料之間的關聯。

從圖中我們可以看出cpu在進行資料處理的時候在同一時刻只能同時處理乙個元素,所以需要使用迴圈語句來迴圈處理,而gpu採用並行結構,無需迴圈,在同一時間則則可以全部處理完成所有的資料。

遊戲中有大量的模型頂點需要進行數**算,所以我們在對遊戲中的邏輯程式設計的時候使用c++等程式語言在cpu中執行運算,而涉及到頂點變化等運算我們則使用shader語言在gpu中運算

2、視訊記憶體

視訊記憶體和記憶體一樣用於儲存gpu處理過後的資料,在視訊記憶體中有幾種不同的儲存區域,用於儲存不同階段需要的資料。

1、頂點緩衝區:用於儲存從記憶體中傳遞過來的頂點資料。

2、索引緩衝區:用於儲存每個頂點的索引值,我們可以根據索引來使用相應的頂點

3、紋理緩衝區:用於儲存從記憶體中傳遞過來的紋理資料

4、深度緩衝區:用於儲存每個畫素的深度資訊

5、模板緩衝區:用於儲存畫素的模板值,且模板緩衝區域深度緩衝區公用一片記憶體。

6、顏色緩衝區:用於儲存畫素的顏色資料

在gpu中主要是對頂點進行運算然後顯示在螢幕上的過程。在固定管線時代的流程為:

1、模型座標系下的頂點(object coordinates):

模型的所有頂點都是以模型自身建立的乙個座標係為參考座標系,然後在這個座標系下定義模型頂點的位置,所有的頂點資料都是從此處進行拷貝並進行變化,在模型自身的座標下可以進行一些基本的變換操作,如 縮放操作,旋轉操作,在模型座標下進行的變化會改變模型自身的頂點的座標位置

2、世界座標係為整個遊戲場景中的參考座標系,是乙個固定不變的座標系,所有的模型的座標都可以在世界座標系中表示,模型在世界座標系中可以執行位移變換,旋轉變換,縮放變換等操作,但此時參考的座標系是以世界座標係為參考座標系。在世界座標系中還需要執行的是光照的計算、物體材質計算等工作。

3、攝像機座標系

Shader 渲染流程

gpu graphics processing unit,影象處理器,gpu上有成千上萬核,這些核並行執行 cpu central processing unit,處理器,cpu通常有單核 雙核 四核和八核,但這些核只能序列操作。渲染流水線的工作任務在於由乙個三維場景出發 生成 或渲染 一張二維影象...

shader 延遲渲染

正向渲染 forward rendering 或稱正向著色 forward shading 是渲染物體的一種非常直接的方式,在場景中我們根據所有光源照亮乙個物體,之後再渲染下乙個物體,以此 類推。傳統的正向渲染思路是,先進行著色,再進行深度測試。其的主要缺點就是光照計算跟場景 複雜度和光源個數有很大...

shader程式設計之Cg基本語法

struct name abs num 絕對值 三角函式 cross a,b 兩個向量的叉積 determinant m 矩陣的行列式 dot a,b 兩個向量的點積 floor x 向下取整 lerp a,b,f 在a,b之間線性插值 log2 x 以2為底的x的對數 mul m,n 矩陣x矩陣,...