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