實(shí)時(shí)渲染(第四版)_第3章|GPU并行架構(gòu)及著色器(下)

這一篇文章主要接著上一篇芥玉,介紹各種著色器的特點(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è)噪聲功能使模型扭曲):

vertex.png

曲面細(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)系如圖所示:

11.png

輸入外殼著色器的是一個(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ì)分的效果):


12.png

幾何著色器

幾何著色器可以將一個(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í)行布料模擬):

geometry.png

流輸出

通常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è)衣盾,模擬波浪):


13.png

小結(jié)

主要是了解各個(gè)著色器的特點(diǎn)及其作用。至此爷抓,所有有關(guān)的介紹就結(jié)束了势决,從下一章開始就真正進(jìn)入了圖形學(xué)的重頭戲。接下來的幾篇將帶領(lǐng)大家進(jìn)入圖形學(xué)最重要的基礎(chǔ):轉(zhuǎn)換蓝撇。
參考資料:Real-Time-Rendering-4th

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末果复,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子渤昌,更是在濱河造成了極大的恐慌虽抄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件独柑,死亡現(xiàn)場(chǎng)離奇詭異迈窟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忌栅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門车酣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人索绪,你說我怎么就攤上這事湖员。” “怎么了瑞驱?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵破衔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我钱烟,道長(zhǎng)晰筛,這世上最難降的妖魔是什么嫡丙? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮读第,結(jié)果婚禮上曙博,老公的妹妹穿的比我還像新娘。我一直安慰自己怜瞒,他們只是感情好父泳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吴汪,像睡著了一般惠窄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漾橙,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天杆融,我揣著相機(jī)與錄音,去河邊找鬼霜运。 笑死脾歇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淘捡。 我是一名探鬼主播藕各,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼焦除!你這毒婦竟也來了激况?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤膘魄,失蹤者是張志新(化名)和其女友劉穎誉碴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓣距,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黔帕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹈丸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成黄。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逻杖,靈堂內(nèi)的尸體忽然破棺而出奋岁,到底是詐尸還是另有隱情,我是刑警寧澤荸百,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布闻伶,位于F島的核電站,受9級(jí)特大地震影響够话,放射性物質(zhì)發(fā)生泄漏蓝翰。R本人自食惡果不足惜光绕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畜份。 院中可真熱鬧诞帐,春花似錦、人聲如沸爆雹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钙态。三九已至慧起,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間册倒,已是汗流浹背蚓挤。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剩失,地道東北人屈尼。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓册着,卻偏偏與公主長(zhǎng)得像拴孤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甲捏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容