Shader理論《二》GPU流水線之幾何階段

歡迎加入Unity業內qq交流羣:956187480

qq掃描二維碼加羣,行業縱橫頗多,每個人精通領域各異,旨在交流,


接上篇博客。

GPU流水線

當GPU從CPU那裏得到渲染命令後,就會進行一系列操作,最終把圖元渲染到屏幕上

幾何和階段光柵化階段可以分爲若干更小的流水線階段,這些流水線階段由GPU來實現,每個階段gpu提供了不同的可配置性或可編程性,如下圖從圖中可以看出GPU的渲染流水線接收頂點數據作爲輸入。這些頂點數據是由應用階段加載到顯存中的,再由DrawCall指定的。這些數據隨後被傳遞給頂點着色器。

幾何階段:


頂點着色器: 是完全可編程的,他通常用於實現頂點的空間變換,頂點着色等功能。 是流水線的第一個階段,他的輸入來自於CPU。頂點着色器的處理單位是頂點,也就是說輸入進來的每個頂點都會調用一次頂點着色器,頂點着色器本身不可以創建或者銷燬任何頂點,而且無法得到頂點與頂點之間的聯繫。這一階段的處理速度很快。頂點着色器需要完成的工作主要有:座標變換和逐頂點光照,除此頂點着色器還要輸出後續階段所需要的數據

座標變換。 顧名思義,就是對頂點的位置座標進行某種變換,在頂點動畫中是非常有用的。例如我們可以通過改變頂點位置來模擬水面,布料等,一個最基本的頂點着色器必須完成的任務就是把頂點座標從模型空間轉換到齊次裁剪空間。

o.pos = mul(UNITY_MVP, v.position);

類似上面的代碼就是把頂點座標轉換到齊次裁剪座標系下,接着通常再由硬件做透視除法後,最終得到歸一化的設備座標。過程如圖

曲面細分着色器: 可選的着色器,用於細分圖元。

幾何着色器:也是一個可選的着色器,他可以被用於執行逐圖元的着色操作,或者被用於產生更多的圖元

裁剪:這一階段的目的是將那些不在攝像機視野內 的頂點裁減掉,並剔除某些三角圖元的面片

一個圖元跟攝像機的關係有三種:完全在視野內,部分在視野內,完全在視野外,完全在視野內的就會傳遞給下一階段,完全在視野外的不需要渲染不予理睬,而那些部分在視野內的就需要做一個處理,這就是裁剪;與頂點着色器不同,這一步是不可編程 的,即我們無法通過編程來控制裁剪的過程,而是硬件上的固定操作,但我們可以定義一個裁剪操作來對這一步驟進行配置

屏幕映射:這一階段是不可配置和編程的,他負責把每個圖元的座標轉換到屏幕座標系中

這一步驟輸入的座標仍然是三維座標系下的座標,屏幕映射的任務是吧每個圖元的x和y座標轉換到屏幕座標系下,屏幕座標系是一個二維座標系,他和我們用於顯示畫面的分辨率有很大關係。

假設我們需要把一個場景渲染到一個窗口上,窗口的範圍是從最小的窗口座標(x1,y1)到最大的座標(x2,y2),在窗口座標變化的時候其實也就是一個縮放的過程,在此過程中屏幕映射不會對輸入的z座標做任何處理。實際上屏幕座標和z座標構成了一個新的座標系叫做窗口座標系。這些值會一起被傳遞到光柵化階段。屏幕映射得到的屏幕座標決定了這個頂點對應屏幕上哪個像素以及距離這個像素有多遠。

注意:屏幕座標系在OpenGL和DirectX之間是存在差異的,OpenGL把屏幕左下角當成最小的窗口座標值,而DirectX則定義了屏幕左上角爲窗口的最小座標值


歡迎加入Unity業內qq交流羣:956187480

qq掃描二維碼加羣,行業縱橫頗多,每個人精通領域各異,旨在交流,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章