管線學習筆記
一. 圖形渲染管線 The Graphics Rendering Pipeline
管線的主要功能是根據場景中給定的虛拟相機,三維物體,光源,陰影計算公式,紋理以及更多的元素,生成一幅二維的圖像。
三個階段conceptual stages:application應用,geometry幾何,rasterizer光栅化
每個conceptual階段還可以區分為functional階段和pipeline階段。
- application:由應用程式驅動的,以軟體的實作方式運作在通用CPUs中。一般地,在CPU中執行的任務主要包括碰撞檢測,全局加速算法,動畫,實體仿真,以及根據應用程式類型對應的大量其他的任務。
- geometry:主要處理變換,投影等運算。在這個階段主要計算将要繪制的内容,如何繪制,以及要儲存繪制資料的載體。Geometry階段通常是在一個圖形處理單元(GPU)中進行處理的。
- rasterizer:使用前面階段産生的資料繪制(渲染)一幅圖像,與任何per-pixel(針對每個像素)進行計算所期望的結果一緻。也在GPU中處理。
1. Application Stage
- 開發人員可以完全控制該階段的執行過程
- 在application階段的最後,需要把要渲染的幾何圖形傳遞給geometry階段。這些幾何圖形也就是rendering primitives(圖元),即points,lines和triangles,最終會顯示到螢幕上(或者任何其他的輸出裝置)。這一過程是application階段最重要的任務。
- collision detection(碰撞檢測)
- 處理一些其他的輸入源,比如鍵盤,滑鼠,頭盔等。
- 實作的其他計算過程包括紋理動畫,通過變換得到的動畫,或者任何隻在該階段執行的運算。一些常用的加速算法,如分層視域體剔除
2.Geometry Stage
- 主要處理大多數的per-polygon和per-vertex(針對每個多邊形和每個頂點)的操作運算。
- 劃分為以下幾個functional階段
- model和view transform(模型和視圖變換)
- 把該模型變換到到多個不同的空間或坐标系中。
- vertex shading(頂點着色)
- 這種确定一種光源照射到某種材質上的呈現效果的操作過程稱為shading(着色)。
- 每一個頂點中可以存儲多種不同的材質資料,比如點坐标位置,法向量,顔色值或者任何其他的用于計算着色公式的資料資訊。然後,把頂點着色的結果值(包括顔色值,向量,紋理坐标或任何其他類型的着色資料)發送到光栅化階段進行插值運算。
- projection(投影)
- 投影是指把視域體變換成一個極值點為(-1,-1,-1)和(1,1,1)的機關立方體。
- orthographic(正交)(也稱為平行)投影和perspective(透視)投影。
- clipping(裁剪)
- 完全位于視域體之内的圖元可以直接傳遞到下一個階段。而完全在視域體之外的圖元就不會再傳遞到下一階段,因為不會渲染這些圖元。隻有部分位于視域體之内的圖元才需要clipping(裁剪)。
- screen mapping(螢幕映射)
- 每一個圖元的 x 和 y 坐标會被經過變換以形成screen coordinates(螢幕坐标)。螢幕坐标與 z 坐标結合一起也稱為window coordinates(視窗坐标)。
- screen mapping就是先執行一次平移變換,接着執行一次縮放變換。而 z 坐标值不會受到screen mapping操作的影響。變換後的 x 和 y 坐标稱為為螢幕坐标。最後,再加上 z 坐标值(−1≤z≤1)(−1≤z≤1)一起傳遞到rasterizer階段。
- model和view transform(模型和視圖變換)
3.The Rasterizer Stage
- 給定了變換和投影後的頂點,以及與頂點對應的着色資料(全部來自geometry階段),rasterizer階段的主要目的是計算并設定物體涵蓋的全部像素(圖檔元素的簡稱)的顔色值。
- 這個過程稱為raterization(光栅處理)或scan conversion(掃描轉換),主要是把screen space中的二維頂點—每一個頂點包含一個 z 值(深度值)以及對應的各種各樣的着色資訊—轉換為螢幕上的像素點。
- rasterizer階段也被劃分為多個functional階段:
- triangle setup(組裝三角形)
- 主要計算三角表面的差異以及其他資料。然後使用該資料執行掃描轉換,同時還用于執行由geometry階段産生的各種着色資料的插值運算。
- 這個過程是由固定功能的硬體處理的,固定功能的硬體正是用于完成這些計算任務。
- triangle traversal(周遊三角形)
- 在這個階段,檢查每一個中心(或采樣)坐标被三角形覆寫的像素點,并生成一個*fragment(片段)*用于表示覆寫三角形的部分像素點。
- pixel shading(pixel着色)
- 使用作為輸入的插值後的shading資料處理任意的per-pixel shading(針對每一個像素進行着色)計算。最終計算的結果是一種或多種顔色值,并被傳遞到下一個階段。
- merging(合并)
- 每一個像素的資訊都存儲在*color buffer(顔色值緩存)*中,該buffer是一個顔色值(每一個顔色值由紅,綠,藍分量組成)的矩陣數組。
- 在merging階段主要負責把shading階段産生的片段顔色值與color buffer中目前存儲的顔色值進行合并。
- buffer是一種與color buffer具有相同大小的形狀的緩存,對于每一個像素存儲了從相機到目前最近的圖元之間的z-value(距離)。
- triangle setup(組裝三角形)
二. GPU渲染管線與可程式設計着色器
GPU實作了第二章中描述的幾何和光栅化概念管線階段。其被分為一些不同程度的可配置性和可程式設計性的硬體階段。
- 綠色的階段都是完全可程式設計的。
- 黃色的階段可配置,但不可程式設計。
- 藍色的階段完全固定。
- 頂點着色器(The Vertex Shader)是完全可程式設計的階段,頂點着色器可以對每個頂點進行諸如變換和變形在内的很多操作,提供了修改/建立/忽略頂點相關屬性的功能,這些頂點屬性包括顔色、法線、紋理坐标和位置。頂點着色器的必須完成的任務是将頂點從模型空間轉換到齊次裁剪空間。
- 幾何着色器(The Geometry Shader)位于頂點着色器之後,允許GPU高效地建立和銷毀幾何圖元。幾何着色器是可選的,完全可程式設計的階段,主要對圖元(點、線、三角形)的頂點進行操作。幾何着色器接收頂點着色器的輸出作為輸入,通過高效的幾何運算,将資料輸出,資料随後經過幾何階段和光栅化階段的其他處理後,會發送給片段着色器。
- 裁剪(Clipping)屬于可配置的功能階段,在此階段可選運作的裁剪方式,以及添加自定義的裁剪面。
- 螢幕映射(Screen Mapping)、三角形設定(Triangle Setup)和三角形周遊(Triangle Traversal)階段是固定功能階段。
- 像素着色器(Pixel Shader,Direct3D中的叫法)常常又稱為片斷着色器,片元着色器(Fragment Shader,OpenGL中的叫法),是完全可程式設計的階段,主要作用是進行像素的處理,讓複雜的着色方程在每一個像素上執行。
- 合并階段(The Merger Stage)處于完全可程式設計和固定功能之間,盡管不能程式設計,但是高度可配置,可以進行一系列的操作。其除了進行合并操作,還分管顔色修改(Color Modifying),Z緩沖(Z-buffer),混合(Blend),模闆(Stencil)和相關緩存的處理。
1. 頂點着色器
頂點着色器提供了修改,建立,或者忽略與每個多邊形頂點相關的值的方式,例如其顔色,法線,紋理坐标和位置。通常,頂點着色器程式将頂點從模型空間(Model Space)變換到齊次裁剪空間(Homogeneous Clip Space),并且,一個頂點着色器至少且必須輸出此變換位置。
- 傳入的每個頂點由頂點着色器程式處理,然後輸出一些在三角形或直線上進行插值後獲得的值。
- 頂點着色器既不能建立也不能消除頂點,并且由一個頂點生成的結果不能傳遞到另一個頂點。
- 由于每個頂點都被獨立處理,是以GPU上的任何數量的着色器處理器都可以并行地應用到傳入的頂點流上。
2. 幾何着色器
- 幾何着色器(Geometry Shader)是頂點和片段着色器之間一個可選的着色器
- 幾何着色器的輸入是單個對象及對象相關的頂點,而對象通常是網格中的三角形,線段或簡單的點。
- 幾何着色器可以改變新傳遞進來的圖元的拓撲結構,且幾何着色器可以接收任何拓撲類型的圖元,但是隻能輸出點、折線(line strip)和三角形條(triangle strips)。
- 幾何着色器需要圖元作為輸入,在處理過程中他可以将這個圖元整個丢棄或者輸出一個或更多的圖元(也就是說它可以産生比它得到的更多或更少的頂點)。這個能力被叫做幾何增長(growing geometry)。
3. 像素着色器
- 用于進行逐像素計算顔色的操作,讓複雜的着色方程在每一個像素上執行。
- 像素着色器是光栅化階段的主要步驟之一
- 像素着色器常用來處理場景光照和與之相關的效果,如凸凹紋理映射和調色。
- 對于一個像素,片斷着色器可能會被調用若幹次來決定它最終的顔色,那些被遮擋的物體也會被計算,直到最後的深度緩沖才将各物體前後排序。