图形学渲染管线
本文由@淺墨_毛星云?出品,轉(zhuǎn)載請(qǐng)注明出處。??
文章鏈接:?http://blog.csdn.net/poem_qianmo/article/details/70544201
這篇文章是解析計(jì)算機(jī)圖形學(xué)界“九陰真經(jīng)總綱”一般存在的《Real-Time Rendering 3rd》系列文章的第二篇。將帶來(lái)RTR3第二章內(nèi)容“Chapter 2 The Graphics Rendering Pipeline 圖形渲染管線(xiàn)”的總結(jié)、概括與提煉。
文章分為全文內(nèi)容思維導(dǎo)圖、核心內(nèi)容分章節(jié)提煉、本章內(nèi)容提煉總結(jié)三個(gè)部分來(lái)呈現(xiàn),其中:
- 文章的第一部分,“全文內(nèi)容思維導(dǎo)圖”,分為“章節(jié)框架思維導(dǎo)圖”和“知識(shí)結(jié)構(gòu)思維導(dǎo)圖”兩個(gè)部分。
- 文章的第二部分,“核心內(nèi)容分節(jié)提煉”,是按原書(shū)章節(jié)順序分布的知識(shí)梳理。
- 而文章的第三部分“本章內(nèi)容提煉總結(jié)”,則是更加精煉,只提煉出關(guān)鍵信息的知識(shí)總結(jié)。
一、全文內(nèi)容思維導(dǎo)圖
1.章節(jié)框架思維導(dǎo)圖
?
2.知識(shí)結(jié)構(gòu)思維導(dǎo)圖
?
二、核心內(nèi)容分節(jié)提煉
?
2.1 圖像渲染管線(xiàn)架構(gòu)概述 Architecture
渲染管線(xiàn)的主要功能就是決定在給定虛擬相機(jī)、三維物體、光源、照明模式,以及紋理等諸多條件的情況下,生成或繪制一幅二維圖像的過(guò)程。對(duì)于實(shí)時(shí)渲染來(lái)說(shuō),渲染管線(xiàn)就是基礎(chǔ)。因此,我們可以說(shuō),渲染管線(xiàn)是實(shí)時(shí)渲染的底層工具。
圖2.1展示了使用渲染管線(xiàn)步驟。渲染出的圖像的位置、形狀是由它們的幾何形狀,環(huán)境特性,攝像機(jī)位置決定的。而物體的外觀由材質(zhì)特性,光源,紋理和著色模型確定。
?
原書(shū)圖2.1 左圖中,相機(jī)放在棱椎的頂端(四條線(xiàn)段的交匯點(diǎn)),只有可視體內(nèi)部的圖元會(huì)被渲染。
?
在概念上可以將圖形渲染管線(xiàn)分為三個(gè)階段:
- 應(yīng)用程序階段(The Application Stage)
- 幾何階段(The Geometry Stage)
- 光柵化階段(The Rasterizer Stage)
?
如下圖:
原書(shū)圖2.2 繪制管線(xiàn)的基本結(jié)構(gòu)包括3個(gè)階段:應(yīng)用程序、幾何、光柵化。
?
?
幾個(gè)要點(diǎn):
- 每個(gè)階段本身也可能是一條管線(xiàn),如圖中的幾何階段所示。此外,還可以對(duì)有的階段進(jìn)行全部或者部分的并行化處理,如圖中的光柵化階段。應(yīng)用程序階段雖然是一個(gè)單獨(dú)的過(guò)程,但是依然可以對(duì)之進(jìn)行管線(xiàn)化或者并行化處理。
- 最慢的管線(xiàn)階段決定繪制速度,即圖像的更新速度,這種速度一般用FPS來(lái)表示,也就是每秒繪制的圖像數(shù)量,或者用Hz來(lái)表示。
?
?
2.2 應(yīng)用程序階段 The Application Stage
?
- 應(yīng)用程序階段一般是圖形渲染管線(xiàn)概念上的第一個(gè)階段。應(yīng)用程序階段是通過(guò)軟件方式來(lái)實(shí)現(xiàn)的階段,開(kāi)發(fā)者能夠?qū)υ撾A段發(fā)生的情況進(jìn)行完全控制,可以通過(guò)改變實(shí)現(xiàn)方法來(lái)改變實(shí)際性能。其他階段,他們?nèi)炕蛘卟糠纸⒃谟布A(chǔ)上,因此要改變實(shí)現(xiàn)過(guò)程會(huì)非常困難。
- 正因應(yīng)用程序階段是軟件方式實(shí)現(xiàn),因此不能像幾何和光柵化階段那樣繼續(xù)分為若干個(gè)子階段。但為了提高性能,該階段還是可以在幾個(gè)并行處理器上同時(shí)執(zhí)行。在CPU設(shè)計(jì)上,稱(chēng)這種形式為超標(biāo)量體系(superscalar)結(jié)構(gòu),因?yàn)樗梢栽谕浑A段同一時(shí)間做不同的幾件事情。
- 應(yīng)用程序階段通常實(shí)現(xiàn)的方法有碰撞檢測(cè)、加速算法、輸入檢測(cè),動(dòng)畫(huà),力反饋以及紋理動(dòng)畫(huà),變換仿真、幾何變形,以及一些不在其他階段執(zhí)行的計(jì)算,如層次視錐裁剪等加速算法就可以在這里實(shí)現(xiàn)。
- 應(yīng)用程序階段的主要任務(wù):在應(yīng)用程序階段的末端,將需要在屏幕上(具體形式取決于具體輸入設(shè)備)顯示出來(lái)繪制的幾何體(也就是繪制圖元,rendering primitives,如點(diǎn)、線(xiàn)、矩形等)輸入到繪制管線(xiàn)的下一個(gè)階段。
- 對(duì)于被渲染的每一幀,應(yīng)用程序階段將攝像機(jī)位置,光照和模型的圖元輸出到管線(xiàn)的下一個(gè)主要階段——幾何階段。
?
2.3 幾何階段 The Geometry Stage
?
幾何階段主要負(fù)責(zé)大部分多邊形操作和頂點(diǎn)操作。可以將這個(gè)階段進(jìn)一步劃分成如下幾個(gè)功能階段:
- 模型視點(diǎn)變換Model & View Transform
- 頂點(diǎn)著色Vertex Shading
- 投影 Projection
- 裁剪 Clipping
- 屏幕映射Screen Mapping
?
如圖2.3所示。
原書(shū)圖2.3 幾何階段細(xì)分為的功能階段管線(xiàn)
?
需要注意:
- 根據(jù)具體實(shí)現(xiàn),這些階段可以和管線(xiàn)階段等同,也可以不等同。在一些情況下,一系列連續(xù)的功能階段可以形成單個(gè)管線(xiàn)階段(和其他管線(xiàn)階段并行運(yùn)行)。在另外情況下,一個(gè)功能階段可以劃分成其他更細(xì)小的管線(xiàn)階段。
- 幾何階段執(zhí)行的是計(jì)算量非常高的任務(wù),在只有一個(gè)光源的情況下,每個(gè)頂點(diǎn)大約需要100次左右的精確的浮點(diǎn)運(yùn)算操作。
?
?
2.3.1 模型和視圖變換 Model and View Transform
?
- 在屏幕上的顯示過(guò)程中,模型通常需要變換到若干不同的空間或坐標(biāo)系中。模型變換的變換對(duì)象一般是模型的頂點(diǎn)和法線(xiàn)。物體的坐標(biāo)稱(chēng)為模型坐標(biāo)。世界空間是唯一的,所有的模型經(jīng)過(guò)變換后都位于同一個(gè)空間中。
- 不難理解,應(yīng)該僅對(duì)相機(jī)(或者視點(diǎn))可以看到的模型進(jìn)行繪制。而相機(jī)在世界空間中有一個(gè)位置方向,用來(lái)放置和校準(zhǔn)相機(jī)。
- 為了便于投影和裁剪,必須對(duì)相機(jī)和所有的模型進(jìn)行視點(diǎn)變換。變換的目的就是要把相機(jī)放在原點(diǎn),然后進(jìn)行視點(diǎn)校準(zhǔn),使其朝向Z軸負(fù)方向,y軸指向上方,x軸指向右邊。在視點(diǎn)變換后,實(shí)際位置和方向就依賴(lài)于當(dāng)前的API。我們稱(chēng)上述空間為相機(jī)空間或者觀察空間。
下圖顯示了視點(diǎn)變換對(duì)相機(jī)和模型的影響。
原書(shū)圖2.4 在左圖中,攝像機(jī)根據(jù)用戶(hù)指定的位置進(jìn)行放置和定位。在右圖中,視點(diǎn)變換從原點(diǎn)沿著Z軸負(fù)方向?qū)ο鄼C(jī)重新定位,這樣可以使裁剪和投影操作更簡(jiǎn)單、更快速。可視范圍是一個(gè)平截椎體,因此可以認(rèn)為它是透視模式。
?
【總結(jié)】模型和視圖變換階段分為模型變換和視圖變換。模型變換的目的是將模型變換到適合渲染的空間當(dāng)中,而視圖變換的目的是將攝像機(jī)放置于坐標(biāo)原點(diǎn),方便后續(xù)步驟的操作。
?
2.3.2 頂點(diǎn)著色 Vertex Shading
為了產(chǎn)生逼真的場(chǎng)景,渲染形狀和位置是遠(yuǎn)遠(yuǎn)不夠的,我們需要對(duì)物體的外觀進(jìn)行建模。而物體經(jīng)過(guò)建模,會(huì)得到對(duì)包括每個(gè)對(duì)象的材質(zhì),以及照射在對(duì)象上的任何光源的效果在內(nèi)的一些描述。且光照和材質(zhì)可以用任意數(shù)量的方式,從簡(jiǎn)單的顏色描述到復(fù)雜的物理描述來(lái)模擬。
確定材質(zhì)上的光照效果的這種操作被稱(chēng)為著色(shading),著色過(guò)程涉及在對(duì)象上的各個(gè)點(diǎn)處計(jì)算著色方程(shading equation)。通常,這些計(jì)算中的一些在幾何階段期間在模型的頂點(diǎn)上執(zhí)行(vertex shading),而其他計(jì)算可以在每像素光柵化(per-pixel rasterization)期間執(zhí)行。可以在每個(gè)頂點(diǎn)處存儲(chǔ)各種材料數(shù)據(jù),諸如點(diǎn)的位置,法線(xiàn),顏色或計(jì)算著色方程所需的任何其它數(shù)字信息。頂點(diǎn)著色的結(jié)果(其可以是顏色,向量,紋理坐標(biāo)或任何其他種類(lèi)的陰著色數(shù)據(jù))計(jì)算完成后,會(huì)被發(fā)送到光柵化階段以進(jìn)行插值操作。
通常,著色計(jì)算通常認(rèn)為是在世界空間中進(jìn)行的。在實(shí)踐中,有時(shí)需要將相關(guān)實(shí)體(諸如相機(jī)和光源)轉(zhuǎn)換到一些其它空間(諸如模型或觀察空間)并在那里執(zhí)行計(jì)算,也可以得到正確的結(jié)果。
這是因?yàn)槿绻^(guò)程中所有的實(shí)體變換到了相同的空間,著色計(jì)算中需要的諸如光源,相機(jī)和模型之間的相對(duì)關(guān)系是不會(huì)變的。
?
【總結(jié)】頂點(diǎn)著色階段的目的在于確定模型上頂點(diǎn)處材質(zhì)的光照效果。
2.3.3 投影 Projection
在光照處理之后,渲染系統(tǒng)就開(kāi)始進(jìn)行投影操作,即將視體變換到一個(gè)對(duì)角頂點(diǎn)分別是(-1,-1,-1)和(1,1,1)單位立方體(unit cube)內(nèi),這個(gè)單位立方體通常也被稱(chēng)為規(guī)范立方體(Canonical View Volume,CVV)。
目前,主要有兩種投影方法,即:
- 正交投影(orthographic projection,或稱(chēng)parallel projection)。
- 透視投影(perspective projection)。
?
如下圖所示。
?
原書(shū)圖2.5 左邊為正交投影,右邊為透視投影
?
兩種投影方式的主要異同點(diǎn):
- 正交投影。正交投影的可視體通常是一個(gè)矩形,正交投影可以把這個(gè)視體變換為單位立方體。正交投影的主要特性是平行線(xiàn)在變換之后彼此之間仍然保持平行,這種變換是平移與縮放的組合。
- 透視投影。相比之下,透視投影比正交投影復(fù)雜一些。在這種投影中,越遠(yuǎn)離攝像機(jī)的物體,它在投影后看起來(lái)越小。更進(jìn)一步來(lái)說(shuō),平行線(xiàn)將在地平線(xiàn)處會(huì)聚。透視投影的變換其實(shí)就是模擬人類(lèi)感知物體的方式。
- 正交投影和透視投影都可以通過(guò)4 x 4的矩陣來(lái)實(shí)現(xiàn),在任何一種變換之后,都可以認(rèn)為模型位于歸一化處理之后的設(shè)備坐標(biāo)系中。
?
雖然這些矩陣變換是從一個(gè)可視體變換到另一個(gè),但它們?nèi)员环Q(chēng)為投影,因?yàn)樵谕瓿娠@示后,Z坐標(biāo)將不會(huì)再保存于的得到的投影圖片中。通過(guò)這樣的投影方法,就將模型從三維空間投影到了二維的空間中。
?
【總結(jié)】投影階段就是將模型從三維空間投射到了二維的空間中的過(guò)程。
?
2.3.4 ?裁剪 Clipping
?
只有當(dāng)圖元完全或部分存在于視體(也就是上文的規(guī)范立方體,CVV)內(nèi)部的時(shí)候,才需要將其發(fā)送到光柵化階段,這個(gè)階段可以把這些圖元在屏幕上繪制出來(lái)。
不難理解,一個(gè)圖元相對(duì)視體內(nèi)部的位置,分為三種情況:完全位于內(nèi)部、完全位于外部、部分位于內(nèi)部。所以就要分情況進(jìn)行處理:
- 當(dāng)圖元完全位于視體內(nèi)部,那么它可以直接進(jìn)行下一個(gè)階段。
- 當(dāng)圖元完全位于視體外部,不會(huì)進(jìn)入下一個(gè)階段,可直接丟棄,因?yàn)樗鼈儫o(wú)需進(jìn)行渲染。
- 當(dāng)圖元部分位于視體內(nèi)部,則需要對(duì)那些部分位于視體內(nèi)的圖元進(jìn)行裁剪處理。
對(duì)部分位于視體內(nèi)部的圖元進(jìn)行裁剪操作,這就是裁剪過(guò)程存在的意義。裁剪過(guò)程見(jiàn)下圖。
原書(shū)圖2.6 投影變換后,只對(duì)單位立方體內(nèi)的圖元(相應(yīng)的是視錐內(nèi)可見(jiàn)圖元)繼續(xù)進(jìn)行處理,因此,將單位立方體之外的圖元剔除掉,保留單位立方體內(nèi)部的圖元,同時(shí)沿著單位立方體將與單位立方體相交的圖元裁剪掉,因此,就會(huì)產(chǎn)生新的圖元,同時(shí)舍棄舊的圖元。
?
【總結(jié)】裁剪階段的目的,就是對(duì)部分位于視體內(nèi)部的圖元進(jìn)行裁剪操作。
?
2.3.5 屏幕映射 Screen Mapping
只有在視體內(nèi)部經(jīng)過(guò)裁剪的圖元,以及之前完全位于視體內(nèi)部的圖元,才可以進(jìn)入到屏幕映射階段。進(jìn)入到這個(gè)階段時(shí),坐標(biāo)仍然是三維的(但顯示狀態(tài)在經(jīng)過(guò)投影階段后已經(jīng)成了二維),每個(gè)圖元的x和y坐標(biāo)變換到了屏幕坐標(biāo)系中,屏幕坐標(biāo)系連同z坐標(biāo)一起稱(chēng)為窗口坐標(biāo)系。
?
假定在一個(gè)窗口里對(duì)場(chǎng)景進(jìn)行繪制,窗口的最小坐標(biāo)為(x1,y1),最大坐標(biāo)為(x2,y2),其中x1<x2,y1<y2。屏幕映射首先進(jìn)行平移,隨后進(jìn)行縮放,在映射過(guò)程中z坐標(biāo)不受影響。新的x和y坐標(biāo)稱(chēng)為屏幕坐標(biāo)系,與z坐標(biāo)一起(-1≦ z ≦ 1)進(jìn)入光柵化階段。如下圖:
?
原書(shū)圖2.8 經(jīng)過(guò)投影變換,圖元全部位于單位立方體之內(nèi),而屏幕映射主要目的就是找到屏幕上對(duì)應(yīng)的坐標(biāo)
?
屏幕映射階段的一個(gè)常見(jiàn)困惑是整型和浮點(diǎn)型的點(diǎn)值如何與像素坐標(biāo)(或紋理坐標(biāo))進(jìn)行關(guān)聯(lián)。可以使用Heckbert[書(shū)后參考文獻(xiàn)第520篇]的策略,用一個(gè)轉(zhuǎn)換公式進(jìn)行解決。
?
【總結(jié)】屏幕映射階段的主要目的,就是將之前步驟得到的坐標(biāo)映射到對(duì)應(yīng)的屏幕坐標(biāo)系上。
?
?
2.4 光柵化階段 The Rasterizer Stage
給定經(jīng)過(guò)變換和投影之后的頂點(diǎn),顏色以及紋理坐標(biāo)(均來(lái)自于幾何階段),給每個(gè)像素(Pixel)正確配色,以便正確繪制整幅圖像。這個(gè)過(guò)個(gè)過(guò)程叫光珊化(rasterization)或掃描變換(scan conversion),即從二維頂點(diǎn)所處的屏幕空間(所有頂點(diǎn)都包含Z值即深度值,及各種與相關(guān)的著色信息)到屏幕上的像素的轉(zhuǎn)換。
與幾何階段相似,該階段細(xì)分為幾個(gè)功能階段:
?
- 三角形設(shè)定(Triangle Setup)階段
- 三角形遍歷(Triangle Traversal)階段
- ?像素著色(Pixel Shading)階段
- ?融合(Merging)階段
?
?
如下圖所示:
?
原書(shū)圖2.8 ?光柵化階段一般細(xì)分為三角形設(shè)定,三角形遍歷,像素著色和融合四個(gè)子階段。
?
?
2.4.1 三角形設(shè)定 Triangle Setup
三角形設(shè)定階段主要用來(lái)計(jì)算三角形表面的差異和三角形表面的其他相關(guān)數(shù)據(jù)。該數(shù)據(jù)主要用于掃描轉(zhuǎn)換(scan conversion),以及由幾何階段處理的各種著色數(shù)據(jù)的插值操作所用。 該過(guò)程在專(zhuān)門(mén)為其設(shè)計(jì)的硬件上執(zhí)行。
?
2.4.2 三角形遍歷 Triangle Traversal
在三角形遍歷階段將進(jìn)行逐像素檢查操作,檢查該像素處的像素中心是否由三角形覆蓋,而對(duì)于有三角形部分重合的像素,將在其重合部分生成片段(fragment)。
找到哪些采樣點(diǎn)或像素在三角形中的過(guò)程通常叫三角形遍歷(TriangleTraversal)或掃描轉(zhuǎn)換(scan conversion)。每個(gè)三角形片段的屬性均由三個(gè)三角形頂點(diǎn)的數(shù)據(jù)插值而生成(在第五章會(huì)有講解)。這些屬性包括片段的深度,以及來(lái)自幾何階段的著色數(shù)據(jù)。
?
【總結(jié)】找到哪些采樣點(diǎn)或像素在三角形中的過(guò)程通常叫三角形遍歷(TriangleTraversal)或掃描轉(zhuǎn)換(scan conversion)。
?
?
2.4.3 像素著色 Pixel Shading
?
所有逐像素的著色計(jì)算都在像素著色階段進(jìn)行,使用插值得來(lái)的著色數(shù)據(jù)作為輸入,輸出結(jié)果為一種或多種將被傳送到下一階段的顏色信息。紋理貼圖操作就是在這階段進(jìn)行的。
?
像素著色階段是在可編程GPU內(nèi)執(zhí)行的,在這一階段有大量的技術(shù)可以使用,其中最常見(jiàn),最重要的技術(shù)之一就是紋理貼圖(Texturing)。紋理貼圖在書(shū)的第六章會(huì)詳細(xì)講到。簡(jiǎn)單來(lái)說(shuō),紋理貼圖就是將指定圖片“貼”到指定物體上的過(guò)程。而指定的圖片可以是一維,二維,或者三維的,其中,自然是二維圖片最為常見(jiàn)。如下圖所示:
?
?
原書(shū)圖2.9 ?左上角為一沒(méi)有紋理貼圖的飛龍模型。左下角為一貼上圖像紋理的飛龍。右圖為所用的紋理貼圖。
【總結(jié)】像素著色階段的主要目的是計(jì)算所有需逐像素操作的過(guò)程。
?
2.4.4 融合 Merging
每個(gè)像素的信息都儲(chǔ)存在顏色緩沖器中,而顏色緩沖器是一個(gè)顏色的矩陣列(每種顏色包含紅、綠、藍(lán)三個(gè)分量)。融合階段的主要任務(wù)是合成當(dāng)前儲(chǔ)存于緩沖器中的由之前的像素著色階段產(chǎn)生的片段顏色。不像其它著色階段,通常運(yùn)行該階段的GPU子單元并非完全可編程的,但其高度可配置,可支持多種特效。
?
此外,這個(gè)階段還負(fù)責(zé)可見(jiàn)性問(wèn)題的處理。這意味著當(dāng)繪制完整場(chǎng)景的時(shí)候,顏色緩沖器中應(yīng)該還包含從相機(jī)視點(diǎn)處可以觀察到的場(chǎng)景圖元。對(duì)于大多數(shù)圖形硬件來(lái)說(shuō),這個(gè)過(guò)程是通過(guò)Z緩沖(也稱(chēng)深度緩沖器)算法來(lái)實(shí)現(xiàn)的。Z緩沖算法非常簡(jiǎn)單,具有O(n)復(fù)雜度(n是需要繪制的像素?cái)?shù)量),只要對(duì)每個(gè)圖元計(jì)算出相應(yīng)的像素z值,就可以使用這種方法,大概內(nèi)容是:
Z緩沖器器和顏色緩沖器形狀大小一樣,每個(gè)像素都存儲(chǔ)著一個(gè)z值,這個(gè)z值是從相機(jī)到最近圖元之間的距離。每次將一個(gè)圖元繪制為相應(yīng)像素時(shí),需要計(jì)算像素位置處圖元的z值,并與同一像素處的z緩沖器內(nèi)容進(jìn)行比較。如果新計(jì)算出的z值,遠(yuǎn)遠(yuǎn)小于z緩沖器中的z值,那么說(shuō)明即將繪制的圖元與相機(jī)的距離比原來(lái)距離相機(jī)最近的圖元還要近。這樣,像素的z值和顏色就由當(dāng)前圖元對(duì)應(yīng)的值和顏色進(jìn)行更新。反之,若計(jì)算出的z值遠(yuǎn)遠(yuǎn)大于z緩沖器中的z值,那么z緩沖器和顏色緩沖器中的值就無(wú)需改變。
?
上面剛說(shuō)道,顏色緩沖器用來(lái)存儲(chǔ)顏色,z緩沖器用來(lái)存儲(chǔ)每個(gè)像素的z值,還有其他緩沖器可以用來(lái)過(guò)濾和捕獲片段信息。
- 比如alpha通道(alpha channel)和顏色緩沖器聯(lián)系在一起可以存儲(chǔ)一個(gè)與每個(gè)像素相關(guān)的不透明值。可選的alpha測(cè)試可在深度測(cè)試執(zhí)行前在傳入片段上運(yùn)行。片段的alpha值與參考值作某些特定的測(cè)試(如等于,大于等),如果片斷未能通過(guò)測(cè)試,它將不再進(jìn)行進(jìn)一步的處理。alpha測(cè)試經(jīng)常用于不影響深度緩存的全透明片段(見(jiàn)6.6節(jié))的處理。
- 模板緩沖器(stencil buffer)是用于記錄所呈現(xiàn)圖元位置的離屏緩存。每個(gè)像素通常與占用8個(gè)位。圖元可使用各種方法渲染到模板緩沖器中,而緩沖器中的內(nèi)容可以控制顏色緩存和Z緩存的渲染。舉個(gè)例子,假設(shè)在模版緩沖器中繪制出了一個(gè)實(shí)心圓形,那么可以使用一系列操作符來(lái)將后續(xù)的圖元僅在圓形所出現(xiàn)的像素處繪制,類(lèi)似一個(gè)mask的操作。模板緩沖器是制作特效的強(qiáng)大工具。而在管線(xiàn)末端的所有這些功能都叫做光柵操作(raster operations ,ROP)或混合操作(blend?? operations)。
- 幀緩沖器(frame buffer)通常包含一個(gè)系統(tǒng)所具有的所有緩沖器,但有時(shí)也可以認(rèn)為是顏色緩沖器和z緩沖器的組合。
- 累計(jì)緩沖器(accumulation buffer),是1990年,Haeberli和Akeley提出的一種緩沖器,是對(duì)幀緩沖器的補(bǔ)充。這個(gè)緩沖器可以用一組操作符對(duì)圖像進(jìn)行累積。例如,為了產(chǎn)生運(yùn)動(dòng)模糊(motion blur.,可以對(duì)一系列物體運(yùn)動(dòng)的圖像進(jìn)行累積和平均。此外,其他的一些可產(chǎn)生的效果包括景深(e depth of field),反走樣(antialiasing)和軟陰影(soft shadows)等。
?
而當(dāng)圖元通過(guò)光柵化階段之后,從相機(jī)視點(diǎn)處看到的東西就可以在熒幕上顯示出來(lái)。為了避免觀察者體驗(yàn)到對(duì)圖元進(jìn)行處理并發(fā)送到屏幕的過(guò)程,圖形系統(tǒng)一般使用了雙緩沖(double buffering)機(jī)制,這意味著屏幕繪制是在一個(gè)后置緩沖器(backbuffer)中以離屏的方式進(jìn)行的。一旦屏幕已在后置緩沖器中繪制,后置緩沖器中的內(nèi)容就不斷與已經(jīng)在屏幕上顯示過(guò)的前置緩沖器中的內(nèi)容進(jìn)行交換。注意,只有當(dāng)不影響顯示的時(shí)候,才進(jìn)行交換。
?
【總結(jié)】融合階段的主要任務(wù)是合成當(dāng)前儲(chǔ)存于緩沖器中的由之前的像素著色階段產(chǎn)生的片段顏色。此外,融合階段還負(fù)責(zé)可見(jiàn)性問(wèn)題(Z緩沖相關(guān))的處理。
?
2.5 管線(xiàn)縱覽與總結(jié)
在概念上可以將圖形渲染管線(xiàn)分為三個(gè)階段:應(yīng)用程序階段、幾何階段、光柵化階段。
這樣的管線(xiàn)結(jié)構(gòu)是API和圖形硬件十年來(lái)以實(shí)時(shí)渲染應(yīng)用程序?yàn)槟繕?biāo)進(jìn)行演化的結(jié)果。需要注意的是這個(gè)進(jìn)化不僅僅是在我們所說(shuō)的渲染管線(xiàn)中,離線(xiàn)渲染管線(xiàn)(offline rendering pipelines)也是另一種進(jìn)化的路徑。且電影產(chǎn)品的渲染通常使用微多邊形管線(xiàn)(micropolygon pipelines)。而學(xué)術(shù)研究和預(yù)測(cè)渲染的(predictive rendering)應(yīng)用,比如建筑重建(architectural previsualization)通常采用的是光線(xiàn)跟蹤渲染器(ray tracing renderers)
?
三、本章內(nèi)容提煉總結(jié)
以下是對(duì)《Real Time Rendering 3rd》第二章“圖形渲染管線(xiàn)”內(nèi)容的文字版概括總結(jié):
?
圖形渲染管線(xiàn)的主要功能就是決定在給定虛擬相機(jī)、三維物體、光源、照明模式,以及紋理等諸多條件的情況下,生成或繪制一幅二維圖像的過(guò)程。在概念上可以將圖形渲染管線(xiàn)分為三個(gè)階段:應(yīng)用程序階段、幾何階段、光柵化階段。
?
1、應(yīng)用程序階段
應(yīng)用程序階段的主要任務(wù),是將需要繪制圖元輸入到繪制管線(xiàn)的下一個(gè)階段,以及實(shí)現(xiàn)一些軟件方式來(lái)實(shí)現(xiàn)的方法。主要方法有碰撞檢測(cè)、加速算法、輸入檢測(cè),動(dòng)畫(huà),力反饋以及紋理動(dòng)畫(huà),變換仿真、幾何變形,以及一些不在其他階段執(zhí)行的計(jì)算,如層次視錐裁剪等加速算法。
對(duì)于被渲染的每一幀,應(yīng)用程序階段將攝像機(jī)位置,光照和模型的圖元輸出到管線(xiàn)的下一個(gè)主要階段,即幾何階段。
?
2、幾何階段
幾何階段主要負(fù)責(zé)大部分多邊形操作和頂點(diǎn)操作,可以將這個(gè)階段進(jìn)一步劃分成如下幾個(gè)功能階段:模型視點(diǎn)變換、頂點(diǎn)著色、投影、裁剪、屏幕映射。這些功能階段的主要功能如下:
- 【模型和視圖變換階段】:模型變換的目的是將模型變換到適合渲染的空間當(dāng)中,而視圖變換的目的是將攝像機(jī)放置于坐標(biāo)原點(diǎn),方便后續(xù)步驟的操作。
- 【頂點(diǎn)著色階段】:頂點(diǎn)著色的目的在于確定模型上頂點(diǎn)處材質(zhì)的光照效果。
- 【投影階段】:投影階段就是將模型從三維空間投射到了二維的空間中的一個(gè)過(guò)程。投影階段也可以理解為將視體變換到一個(gè)對(duì)角頂點(diǎn)分別是(-1,-1,-1)和(1,1,1)單位立方體內(nèi)的過(guò)程 。
- 【裁剪階段】裁剪階段的目的,就是對(duì)部分位于視體內(nèi)部的圖元進(jìn)行裁剪操作。
- 【屏幕映射階段】屏幕映射階段的主要目的,就是將之前步驟得到的坐標(biāo)映射到對(duì)應(yīng)的屏幕坐標(biāo)系上。
?在幾何階段,首先,對(duì)模型的頂點(diǎn)和法線(xiàn)進(jìn)行矩陣變換,并將模型置于觀察空間中(模型和視圖變換),然后,根據(jù)材質(zhì)、紋理、以及光源屬性進(jìn)行頂點(diǎn)光照的計(jì)算(頂點(diǎn)著色階段),接著,將該模型投影變換到一個(gè)單位立方體內(nèi),并舍棄所有立方體之外的圖元(投影階段),而為了得到所有位于立方體內(nèi)部的圖元,接下來(lái)對(duì)與單位立方體相交的圖元進(jìn)行裁剪(裁剪階段),然后將頂點(diǎn)映射到屏幕上的窗口中(屏幕映射階段)。在對(duì)每個(gè)多邊形執(zhí)行完這些操作后,將最終數(shù)據(jù)傳遞到光柵,這樣就來(lái)到了管線(xiàn)中的最后一個(gè)階段,光柵化階段。
?
3、光柵化階段
給定經(jīng)過(guò)變換和投影之后的頂點(diǎn),顏色以及紋理坐標(biāo)(均來(lái)自于幾何階段),給每個(gè)像素正確配色,以便正確繪制整幅圖像。這個(gè)過(guò)個(gè)過(guò)程叫光柵化,即從二維頂點(diǎn)所處的屏幕空間(所有頂點(diǎn)都包含Z值即深度值,及各種與相關(guān)的著色信息)到屏幕上的像素的轉(zhuǎn)換。光柵化階段可分為三角形設(shè)定階段、三角形遍歷階段、像素著色階段、融合階段。這些功能階段的主要功能如下:
- 【三角形設(shè)定階段】三角形設(shè)定階段主要用來(lái)計(jì)算三角形表面的差異和三角形表面的其他相關(guān)數(shù)據(jù)。
- 【三角形遍歷階段】找到哪些采樣點(diǎn)或像素在三角形中的過(guò)程通常叫三角形遍歷。
- 【像素著色階段】像素著色階段的主要目的是計(jì)算所有需逐像素計(jì)算操作的過(guò)程。
- 【融合階段】融合階段的主要任務(wù)是合成當(dāng)前儲(chǔ)存于緩沖器中的由之前的像素著色階段產(chǎn)生的片段顏色。此外,融合階段還負(fù)責(zé)可見(jiàn)性問(wèn)題(Z緩沖相關(guān))的處理。
?
在光柵化階段,所有圖元會(huì)被光柵化,進(jìn)而轉(zhuǎn)換為屏幕上的像素。首先,計(jì)算三角形表面的差異和三角形表面的其他相關(guān)數(shù)據(jù)(三角形設(shè)定階段),然后,找到哪些采樣點(diǎn)或像素在三角形中(三角形遍歷階段),接著計(jì)算所有需逐像素計(jì)算操作(像素著色階段),然后,合成當(dāng)前儲(chǔ)存于緩沖器中的由之前的像素著色階段產(chǎn)生的片段顏色,可見(jiàn)性問(wèn)題可通過(guò)Z緩存算法解決,隨同的還有可選的alpha測(cè)試和模版測(cè)試(融合階段)。所有對(duì)像依次處理,而最后的圖像顯示在屏幕上。
The end.PS:從早上9點(diǎn)寫(xiě)到晚上9點(diǎn),好累...
圖片來(lái)自《地平線(xiàn):黎明時(shí)分》。
總結(jié)
- 上一篇: Java11新特性概览
- 下一篇: C语言家族成员关系系统,家族成员信息管理