1. 程式人生 > >Shader學習筆記——GPU流水線

Shader學習筆記——GPU流水線

(應用階段)-> 頂點資料,【頂點著色器,曲面細分著色器,幾何著色器,裁剪,螢幕對映】(幾何階段),【三角形設定,三角形遍歷,片元著色器,逐片元操作】(光柵化階段),螢幕影象

頂點著色器(Vertex Shader):把頂點座標從模型空間轉換到齊次裁剪空間。o.pos = mul(UNITY_MVP,v.position)

再由硬體做透視除法,最終得到歸一化的裝置座標(Normalized Device Coordinates , NDC)。

裁剪(Clipping):完全在視野內,傳遞給下一個流水線階段;部分在視野內,進行裁剪處理;完全在視野外,剔除。裁剪是硬體上的固定操作,不可程式設計,但是可自定義一個裁剪操作進行配置。

螢幕對映(Screen Mapping):把每個圖元的x和y座標轉換到螢幕座標系(Screen Coordinates)。螢幕對映不會對輸入的z座標做處理,螢幕座標系和z座標一起構成了一個座標系,叫做視窗座標系(Window Coordinates)。這些值會一起被傳遞到光柵化階段。螢幕對映得到的螢幕座標決定了這個頂點對應螢幕上哪個畫素以及距離這個畫素有多遠。(注意:OpenGL把螢幕的左下角當成最小的視窗座標值,而DirectX則定義了螢幕的左上角為最小的視窗座標)。

開始進入光柵化階段:計算每個圖元覆蓋了哪些,以及為這些畫素計算它們的顏色

三角形設定(Triangle Setup):計算光柵化一個三角網格所需的資訊。

三角形遍歷(Triangle Traversal):檢查每個畫素是否被一個三角網格覆蓋。如果被覆蓋的話,就會生成一個片元。輸出一個片元序列。

片元:不是真正意義上的畫素,而是包含了很多狀態的集合,用於計算每個畫素的最終顏色。這些狀態包括每個畫素的螢幕座標、深度資訊,以及其他從幾何階段輸出的頂點資訊如法線,紋理座標等

片源著色器(Fragment Shader):DirectX中稱為畫素著色器(Pixel Shader)。輸入是上一個階段對頂點資訊插值得到的結果。輸出是一個或者多個顏色值。這一步完成很多重要的渲染技術如紋理取樣。

紋理取樣(texture sample):

逐片元操作(Per-Fragment Operations):DirectX中稱為輸出合併階段(Output-Merger)。

1.決定每個片元的可見性,深度測試、模板測試等;

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

模板測試(Stencil Test):首先讀取(使用讀取掩碼)模板緩衝區(Stencil Buffer)該片元位置的模板值,然後將該值和讀取(使用讀取掩碼)到的參考值進行比較,比較函式可以由開發者指定。捨棄沒有通過測試的片元,並根據結果修改模板緩衝區。模板測試通常用於限制渲染的區域,和一些更高階的用法如渲染陰影、輪廓渲染等。

深度測試(Depth Test):GPU把該片元的深度值和已經存在於深度緩衝區中的深度值進行比較。通常如果當前片元的深度值大於等於當前深度緩衝區的值,就會捨棄它。如果通過測試,開發者還可以指定是否要用這個片元的深度值覆蓋掉原來的深度值,這是通過開啟/關閉深度寫入來做到的。透明效果和深度測試以及深度寫入的關係非常密切。

合併功能:每個畫素的顏色資訊被儲存在顏色緩衝區,合併功能決定這次渲染的顏色是覆蓋上次的結果還是進行其他處理。對於不透明物體,開發者可以關閉混合(Blend)操作;對於半透明物體,需要使用混合操作。

雙重緩衝(Double Buffering):為了避免我們看到那些正在進行光柵化的圖元。對場景的渲染髮生在後置緩衝(Back Buffer)中,一旦場景被渲染到了後置緩衝中,GPU就會交換後置緩衝區和前置緩衝區(Front Buffer)的內容,而前置緩衝區是之前顯示在螢幕上的影象。由此保證我們看到的影象是連續的。