渲染管线流程
應用階段--->幾何階段---->光柵化階段---->逐片元操作----->后處理
1,應用階段:粗粒度剔除,進行渲染設置,準備基本數據,輸出到幾何階段。
2,幾何階段:頂點著色器,曲面細分,幾何著色器,頂點裁剪,屏幕映射。
3,光柵化階段:三角形(點/線)設置,三角形(點/線)遍歷,片元著色器。
4,逐片元操作:裁剪測試,透明度測試,深度測試,模板測試,混合。
5,后處理。
應用階段:Application stage
? ? ? ? ? ? ? ? ?3個主要任務(這個階段以開發者為主導,由CPU來實現。):
? ? ? ? ? ? ? ? ?1,準備好場景數據。如,攝像機位置,視椎體,場景中包含的模型,光源etc。
? ? ? ? ? ? ? ? ? 2,粗粒度(Culling)剔除。為了提高渲染性能。
? ? ? ? ? ? ? ? ?3,設置好每個模型的渲染狀態。(渲染狀態包括但不限于使用texture--diffuse,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?reflection etc. Bipmap,Shader)
? ? ? ? ? ? ? ? ?這個階段最重要的輸出是渲染所需的幾何信息-----渲染圖源(Rendering Primitives)
? ? ? ? ? ? ? ? ?
幾何階段:Geometry Stage
? ? ? ? ? ? ? ? ?頂點著色器:計算頂點光照(要計算頂點光照,就需要知道光源的位置,朝向以及攝? ? ? ? ? ? ? ? ? ? ? 像機的位置和朝向,頂點當前世界的位置。當前頂點位置又要知道頂點在模型空間的? ? ? ? ? ? ? ? ? ? ? 位置,以及模型本身的PSR)。
? ? ? ? ? ? ? ? ? 曲面細分著色器: 需要根據現有的頂點來生產更多的頂點。
? ? ? ? ? ? ? ? ? 幾何著色器:通過現有圖元來做一些幾何方面的操作,生成更多的頂點和圖元。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 例如,對現有的圖元所在的平面生成法線。
? ? ? ? ? ? ? ? ? 頂點裁剪:裁剪掉屏幕以外的頂點。
? ? ? ? ? ? ? ? ? 屏幕映射:把頂點從3D坐標空間轉換到2D坐標空間。
光柵化設置:Rasterizer Stage
? ? ? ? ? ? ? ? ? ? ? ?三角形設置(triangle setup):光柵化的第一個流水線階段。
? ? ? ? ? ? ? ? ? ? ? 這個階段會計算光柵化一個三角網格所需的信息。上一個階段輸出的都是三角網格的頂點。即得到的是三角網格每條邊的兩個端點。如果要得到整個三角網格對像素的覆蓋情況,就必須計算每條邊上的像素坐標。為了能夠計算便捷像素的坐標信息,就需要得到三角形便捷的表示方式。這個計算三角網格標識數據的過程就是三角形設置。
? ? ? ? ? ? ? ? ? ? ? 三角形遍歷(TriangleTraversal):檢查每個像素是否被一個三角網格覆蓋,如果被覆蓋,就會生成一個片元(fragment),這樣一個找到哪些像素被三角網格覆蓋的過程就是三角形遍歷,也被稱為掃描變換。
? ? ? ? ? ? ? ? ? ? ? ?這一步的輸出就是德奧一個片元序列。但是片元并不是真正意義上的像素。而是包含了很多狀態的集合,這些狀態用于計算每個像素的最終顏色。這些 狀態包括但不限于他的屏幕坐標,深度信息,以及其他從幾何階段輸出的頂點信息。如發現,紋理坐標等。
? ? ? ? ? ? ? ? ? ? ? 片元著色器(Fragment Shader):是另一個非常重要的可編程著色器階段。
光柵化階段世界上不會影響屏幕上每個像素的顏色值,而是會產生一些列的數據信息,用來表述一個三角網格是怎樣覆蓋每個像素的。每個片元負責存儲這樣的一些列數據。
這個階段可以王城很多重要的渲染技術。最重要的技術之一的就是紋理采樣。為了在片元著色器中進行紋理采樣,同在會在頂點著色器階段輸出每個頂點對應的紋理坐標。然后經過光柵化階段對三角網格的三個頂點對應的紋理坐標進行插值后,就可以得到其覆蓋的片元紋理坐標。
逐片元操作:在OpenGL里成為逐片元操作(Per-Fragment Operations)
? ? ? ? ? ? ? ? ? ? ? 在DirectX里,這個步驟被稱為輸出合并階段(Output-Merger)
? ? ? ? ? ? ? ? ? ? ??所以,這個步驟就是對通過測試的片元合并的過程。
? ? ? ? ? ? ? ? ? ? ?逐片元操作就是通過對像素點做裁剪,透明度,深度,模板等測試后,通過測試的片? ? ? ? ? ? ? ? ? ? ? ?元得以保留下來,沒有通過的則丟棄掉。把通過測試的片元顏色進行一個混合操作從? ? ? ? ? ? ? ? ? ? ? ?而得到像素點最終輸出的顏色。
逐片元操作完成后,得到一個類似貼圖的數據保存在內存里。后處理,就是對這個數據做一些列如模糊,景深,高光等處理。
從幾何階段到逐片元操作,這整個流程就是GPU渲染管線。
?
?
?
?
?----------------------------------------
?頂點著色是可編程的。
從頂點著色到投影的步驟,完成了從頂點空間到投影空間的過程。(投影是GPU自動完成)
裁剪:視椎體裁剪---CVV
Vertex Shader,GPU渲染管線第一個階段,輸入來自于CPU。輸入進來的每一個頂點,都會調用一次頂點著色器。頂點著色器本身不可以創建或者銷毀任何頂點,且無法得到頂點之間的關系。例如,通過頂點著色器,無法得知兩個頂點是否屬于同一個三角網格。
頂點著色器的主要工作:坐標變換和追頂點光照
?模型變換,視圖變換,投影變換,對應的就是MVP矩陣。unity的頂點著色器中,頂點是會從模型坐標新轉換到投影坐標系。
可選步驟
?
可選步驟
?
裁剪不可通過編程來控制,但是可以自定義裁剪來進一步配置。
場景渲染到一個窗口上,窗口的范圍從最小串口坐標(x1,y1)到最大的窗口坐標(x2,y2)。
其中x1<x2,y1<y2.由于輸入的坐標范圍在-1到1.所以這個過程實際是一個縮放的過程。
屏幕坐標系(Screen Coordinate)和z坐標一起構成了窗口坐標系(Window Coordinate)。這些值會一起傳遞到光柵化階段。
OpenGL和DirectX之間的差異
如果得到的圖像是倒轉的,有可能是因為沒有考慮到OpenGL和DirectX之間的差異。
總結
- 上一篇: Linux 中的各种栈:进程栈 线程栈
- 下一篇: 如何免费下载付费音乐歌曲,6个网站+8个