這一篇文章主要接著上一篇芥玉,介紹各種著色器的特點(diǎn)以及作用:
頂點(diǎn)著色器
這是GPU流水管線的第一個(gè)階段。是完全可編程的階段急迂。正如其名影所,他只處理傳入的頂點(diǎn)數(shù)據(jù),比如位置僚碎、顏色猴娩、法線、紋理坐標(biāo)等。頂點(diǎn)著色器通常會(huì)將頂點(diǎn)從模型控件轉(zhuǎn)換到齊次裁減空間卷中,因此頂點(diǎn)著色器必須輸出他的位置矛双。
頂點(diǎn)著色器既不能創(chuàng)建和銷毀頂點(diǎn),也不能將一個(gè)頂點(diǎn)處理的結(jié)果傳到另一個(gè)頂點(diǎn)仓坞。每個(gè)頂點(diǎn)都是被獨(dú)立處理的背零。
頂點(diǎn)著色器適用于如下場(chǎng)景:
1、 通過一次性的創(chuàng)建網(wǎng)格并通過頂點(diǎn)著色器使其變形來創(chuàng)建物體
2无埃、 通過使用皮膚和變形技術(shù)來使得角色身體和面部具有動(dòng)畫
3徙瓶、 程序上的變形,比如旗幟嫉称、布料或水的移動(dòng)
4侦镇、 通過發(fā)送退化網(wǎng)格到流水管線下端,并依據(jù)需要給定一定區(qū)域來生成粒子
5织阅、 通過使用整個(gè)幀緩沖生成一個(gè)屏幕對(duì)齊的紋理去進(jìn)行程序變形來制作:光學(xué)變形壳繁、熱霧、水波荔棉、頁面卷曲以及其他的效果
6闹炉、 通過頂點(diǎn)紋理獲取應(yīng)用到地形高度領(lǐng)域
部分效果如圖(左側(cè)是普通的茶壺,中間是被頂點(diǎn)著色器執(zhí)行的簡(jiǎn)單裁剪操作润樱,右側(cè)噪聲功能使模型扭曲):
曲面細(xì)分著色器
曲面細(xì)分著色器最主要的作用是將曲面轉(zhuǎn)換成一組三角形渣触。這是一個(gè)可選擇的著色器。他具有如下的幾個(gè)優(yōu)點(diǎn):
曲面細(xì)分比提供相應(yīng)的三角形描述一個(gè)曲面會(huì)更加緊密壹若;節(jié)省內(nèi)存嗅钻;在處理角色或物體動(dòng)畫上可以防止CPU到GPU之間運(yùn)轉(zhuǎn)的瓶頸;使用適當(dāng)?shù)娜切慰梢杂行У某尸F(xiàn)曲面店展。比如:一個(gè)球距離攝像機(jī)很遠(yuǎn)养篓,那么只需要渲染幾個(gè)三角形就可以了;如果距離很近赂蕴,那么可能就要上千的三角形來渲染曲面柳弄。這種控制細(xì)節(jié)等級(jí)的能力也可以應(yīng)用程序控制性能,比如在低性能GPU上使用低質(zhì)量的網(wǎng)格來保持幀率概说。
曲面細(xì)分階段包括了三個(gè)子階段:在DX中稱為外殼著色器碧注、曲面細(xì)分和域著色器。
他們之間的執(zhí)行關(guān)系如圖所示:
輸入外殼著色器的是一個(gè)特殊的補(bǔ)丁圖元:定義曲面的控制點(diǎn)席怪,貝塞爾曲面補(bǔ)丁或者其他類型的曲面元素应闯。外殼著色器有兩個(gè)功能:它會(huì)告訴曲面細(xì)分階段有多少個(gè)三角形需要生成纤控,以及他們的結(jié)構(gòu)挂捻;以及對(duì)每個(gè)控制點(diǎn)進(jìn)行處理;可選擇性的船万,外殼著色器可以更改傳進(jìn)來的補(bǔ)丁刻撒,也可以增加或者刪除控制點(diǎn)骨田。外殼著色器輸出一系列的控制點(diǎn),伴隨著曲面細(xì)分階段處理的數(shù)據(jù)声怔,傳到域著色器态贤。
曲面細(xì)分階段在流水管線中是固定執(zhí)行階段,只與曲面細(xì)分著色器一起使用醋火。他的任務(wù)是通過外殼著色器傳過來的有關(guān)曲面細(xì)分有關(guān)的信息:三角形悠汽、四邊形或者等值線,以及曲面細(xì)分因子芥驳,來添加新的頂點(diǎn)柿冲,并計(jì)算每個(gè)頂點(diǎn)的相對(duì)位置。
域著色器類似頂點(diǎn)著色器兆旬。它主要是處理從外殼著色器以及曲面細(xì)分階段傳送過來的頂點(diǎn)假抄,生成相應(yīng)的輸出頂點(diǎn),沿著流水管現(xiàn)傳送下去丽猬。
部分效果如圖(左側(cè)是大概6000三角形的模型宿饱,右側(cè)是每個(gè)三角形使用PN三角形細(xì)分的效果):
幾何著色器
幾何著色器可以將一個(gè)圖元轉(zhuǎn)換成其他圖元。它位于曲面細(xì)分著色器的后面脚祟,也是一個(gè)可選的著色器谬以。
幾何著色器輸入的是單個(gè)模型以及其關(guān)聯(lián)的頂點(diǎn)。對(duì)象通常是由三角形帶愚铡、線或單個(gè)點(diǎn)蛉签。幾何著色器也可以定義和處理拓展圖元。幾何著色器處理圖元并輸出0或者更多的頂點(diǎn)沥寥,這些頂點(diǎn)被視為點(diǎn)碍舍、折線或三角形帶。注意邑雅,幾何著色器可以沒有任何輸出片橡。在這種方式下,網(wǎng)格可以通過編輯頂點(diǎn)有選擇的修改淮野、增加或移除圖元捧书。
幾何著色器是為了更改輸入的數(shù)據(jù)或者制作有限數(shù)量的副本而設(shè)計(jì)的。例如:生成6個(gè)轉(zhuǎn)換后的副本去同時(shí)渲染立方體紋理的6面骤星;高效創(chuàng)建陰影紋理去顯示高質(zhì)量陰影经瓷;從點(diǎn)數(shù)據(jù)創(chuàng)建可變粒子;皮毛渲染洞难;為陰影算法尋找物體邊緣等舆吮。
幾何著色器需要確保輸出圖元的結(jié)果與輸入時(shí)候的順序一致,這會(huì)影響性能。因?yàn)槿绻恍┲鞔a是并行運(yùn)行的色冀,結(jié)果必須被保存以及排序潭袱,這一點(diǎn)因素不利于幾何著色器在一次調(diào)用中輔助或創(chuàng)建大量幾何圖元。
幾何著色器的行為是最不可預(yù)測(cè)的锋恬,需要考慮資源和內(nèi)存屯换。實(shí)際上,幾何著色器很少使用与学,因?yàn)樗荒芎芎玫挠成涑鯣PU的優(yōu)勢(shì)彤悔。
常見效果如圖(左側(cè),金屬球等值面曲面細(xì)分被GS動(dòng)態(tài)執(zhí)行索守。中間蜗巧,使用GS進(jìn)行線段不規(guī)則曲面細(xì)分以及流輸出,廣告牌被GS生成以顯示閃電蕾盯。右側(cè)幕屹,通過使用頂點(diǎn)和幾何著色器和流輸出執(zhí)行布料模擬):
流輸出
通常GPU流水管線的標(biāo)準(zhǔn)使用是發(fā)送數(shù)據(jù)經(jīng)過頂點(diǎn)著色器,然后光柵化三角形级遭,在到像素著色器中處理望拖。這些數(shù)據(jù)通過流水管線并且中間結(jié)果不能被訪問。著色器模型4.0添加了流輸出的概念挫鸽。在頂點(diǎn)著色器處理過頂點(diǎn)之后说敏,這些頂點(diǎn)數(shù)據(jù)可以輸出到一個(gè)流中,即一個(gè)順序數(shù)組丢郊,附加的傳送到光柵化階段盔沫。實(shí)際上,光柵化可以完全關(guān)閉枫匾,流水管線純粹作為一個(gè)無圖像流處理器架诞。這種方式處理的數(shù)據(jù)可以通過流水管線返回,從而允許迭代處理干茉∏从牵可以用在模擬水流或其他粒子效果。
流輸出返回的數(shù)據(jù)都是浮點(diǎn)類型的數(shù)據(jù)角虫,因此會(huì)有顯著的內(nèi)存消耗沾谓。另外流輸出是在圖元上工作的,而不是直直接在頂點(diǎn)上戳鹅。如果網(wǎng)格被傳到流水管線下端均驶,每個(gè)三角形都會(huì)生成他自己的三個(gè)輸出頂點(diǎn)集,原始網(wǎng)格上的任何共享頂點(diǎn)將丟失枫虏。由于這個(gè)原因妇穴,更典型的使用是僅僅將頂點(diǎn)作為頂點(diǎn)圖元集通過流水管線傳送亮垫。
像素著色器
在頂點(diǎn)、曲面細(xì)分和幾何著色器執(zhí)行之后伟骨,圖元將被裁減以及光柵化處理。光柵化計(jì)算出三角形覆蓋每個(gè)像素單元的面積燃异,部分或者完全重疊像素的三角形這一部分稱為片元携狭。三角形頂點(diǎn)的值,包括深度緩沖區(qū)的Z值回俐,將會(huì)通過三角形表面逛腿,為每個(gè)片元插值運(yùn)算,片元以及插值數(shù)據(jù)一起傳送到像素著色器仅颇。像素著色器實(shí)際上處理的是片元单默,而不是真正的像素。所有在OpenGL中忘瓦,也稱為片元著色器搁廓。
像素著色器主要是計(jì)算并輸出片元的顏色,同樣可以產(chǎn)生不透明值以及可選擇性的更改他的Z深度值耕皮。像素著色器還具有特有的能力:丟棄一段片元境蜕,即,不輸出此片元的數(shù)據(jù)凌停。
最初粱年,像素著色器僅僅只能輸出到合并階段。但是隨著GPU的發(fā)展罚拟,像素著色器可執(zhí)行的指令數(shù)量在增加台诗。其中就有多重渲染目標(biāo)的指令。不同于僅僅將像素著色器程序結(jié)果發(fā)到顏色和深度緩沖區(qū)赐俗,可以為每個(gè)片元生成多重設(shè)置數(shù)值并保存到不同的緩沖區(qū)拉队,每個(gè)緩沖區(qū)成為渲染目標(biāo)。多重渲染目標(biāo)在高效執(zhí)行渲染算法上是強(qiáng)有力的輔助工具阻逮。一個(gè)渲染通道用來生成顏色圖像氏仗,另一個(gè)生成對(duì)象標(biāo)識(shí)符,第三個(gè)生成世界空間距離等夺鲜。比如延遲渲染:第一個(gè)通道存儲(chǔ)關(guān)于每個(gè)像素的物體位置和材質(zhì)數(shù)據(jù)皆尔,第二個(gè)通道進(jìn)行光照計(jì)算和其他特效,其中可見性和著色是在單獨(dú)的通道中完成的币励。
像素著色器還有一個(gè)限制是:他只能處理對(duì)應(yīng)的片元慷蠕,而不能從相鄰的像素中讀取結(jié)果。也就是當(dāng)像素著色器程序執(zhí)行時(shí)食呻,他不能將輸出結(jié)果發(fā)送給相鄰像素流炕,也不能訪問其他像素?cái)?shù)據(jù)澎现。但是有例外,比如像素著色器在梯度或者導(dǎo)數(shù)計(jì)算時(shí)可以間接的訪問相鄰片元信息每辟。但是梯度信息不能受動(dòng)態(tài)流程控制影響的像素著色器訪問剑辫,即if語句或可變數(shù)量的迭代循環(huán),所有組內(nèi)的片元必須使用同一設(shè)置的指令進(jìn)行處理渠欺,即使是在離線渲染系統(tǒng)妹蔽,這也是一個(gè)最基本的限制。
合并
合并階段是處理單獨(dú)的片元深度以及顏色值(像素著色器生成)并與幀緩沖區(qū)合并的地方挠将。如果片元可見胳岂,那么他將和緩沖區(qū)的像素顏色進(jìn)行混合。對(duì)于不透明的片元舔稀,那么片元只是簡(jiǎn)單的替換像素顏色乳丰,而對(duì)于透明的片元,才算的上是真正意義上的混合内贮。
如果通過片元通過了像素著色器的計(jì)算到達(dá)了合并階段产园,但是根據(jù)深度值發(fā)現(xiàn),他是被其他像素覆蓋著的夜郁,那么他在像素著色器中的計(jì)算將相當(dāng)于是一次浪費(fèi)淆两。為了避免這種情況,有一些GPU采用early-z技術(shù)拂酣,即在像素著色器之前進(jìn)行深度檢測(cè)秋冰,見檢測(cè)其可見性,如果不可見則不會(huì)傳送到像素著色器進(jìn)行計(jì)算婶熬。但是前面說到像素著色器具有改變z深度值或者完全剔除片元的能力剑勾,如果在像素著色器程序中有這兩種任何一種操作,early-z通常不能使用赵颅,并且要關(guān)閉虽另。合并階段是高度可配置的,我們可以決定混合操作的模式等饺谬。
計(jì)算著色器
計(jì)算著色器并沒有規(guī)定在圖形管線的什么位置執(zhí)行捂刺。他和其他著色器一樣,有相同的數(shù)據(jù)輸入集并且可以訪問緩沖區(qū)(比如紋理)用來輸入輸出募寨。計(jì)算著色器被線程組執(zhí)行族展,每個(gè)線程組都有一段小內(nèi)存在線程間共享。計(jì)算著色器最重要的優(yōu)點(diǎn)在于他們可以訪問GPU生成的數(shù)據(jù)拔鹰。后處理是指渲染后的圖形進(jìn)一步進(jìn)行處理仪缸,是計(jì)算著色器的常見用途。共享內(nèi)存意味著從采樣像素的結(jié)果可以與相鄰線程共享列肢。例如恰画,使用計(jì)算著色器去確定一個(gè)圖像的分布或平均亮度宾茂,其運(yùn)行速度是像素著色器執(zhí)行此操作的兩倍。
計(jì)算著色器同樣用于粒子系統(tǒng)拴还,網(wǎng)格處理比如面部動(dòng)畫跨晴,裁剪,圖像過濾片林,改善深度精度端盆,陰影,區(qū)域深度拇厢,以及其他的任何一組GPU處理器可以處理的任務(wù)。
常見效果如圖(左側(cè)使用計(jì)算著色器進(jìn)行模擬風(fēng)吹頭發(fā)的效果晒喷,頭發(fā)本身是用曲面細(xì)分執(zhí)行的孝偎;中間,計(jì)算著色器執(zhí)行快速模糊操作凉敲,右側(cè)衣盾,模擬波浪):
小結(jié)
主要是了解各個(gè)著色器的特點(diǎn)及其作用。至此爷抓,所有有關(guān)的介紹就結(jié)束了势决,從下一章開始就真正進(jìn)入了圖形學(xué)的重頭戲。接下來的幾篇將帶領(lǐng)大家進(jìn)入圖形學(xué)最重要的基礎(chǔ):轉(zhuǎn)換蓝撇。
參考資料:Real-Time-Rendering-4th