Shader學(xué)習(xí)筆記p1——基礎(chǔ)概念

最近項(xiàng)目需求接觸到了Shader,而Shader也是出了名的不好學(xué)遮晚,我便以此筆記來記錄一下學(xué)習(xí)過程性昭,若有可能,也希望對(duì)迷茫中的新手有些幫助县遣。PS:因?yàn)槭菍W(xué)習(xí)筆記糜颠,自然是想到什么記什么,過程不免有些流水賬萧求,還望見諒其兴。

學(xué)習(xí)一樣新東西,先要知道它是什么夸政,為什么要用它元旬,那么就先來了解一下Shader是什么?為什么要用Shader守问?


先來看看萬能的Wiki是怎么說的

著色器(英語(yǔ):shader)應(yīng)用于計(jì)算機(jī)圖形學(xué)領(lǐng)域匀归,指一組供計(jì)算機(jī)圖形資源在執(zhí)行渲染任務(wù)時(shí)使用的指令,用于計(jì)算圖像的顏色或明暗耗帕。但近來穆端,它也能用于處理一些特殊效果,或者視頻后處理仿便。通俗地說体啰,著色器告訴電腦如何用特有的一種方法去繪制物體。程序員將著色器應(yīng)用于圖形處理器(GPU)的可編程流水線嗽仪,來實(shí)現(xiàn)三維應(yīng)用程序荒勇。這樣的圖形處理器有別于傳統(tǒng)的固定流水線處理器,為GPU編程帶來更高的靈活性和適應(yīng)性钦幔。以前固有的流水線只能進(jìn)行一些幾何變換和像素灰度計(jì)算。現(xiàn)在可編程流水線還能處理所有像素常柄、頂點(diǎn)鲤氢、紋理的位置、色調(diào)西潘、飽和度卷玉、明度、對(duì)比度并實(shí)時(shí)地繪制圖像喷市。著色器還能產(chǎn)生如模糊相种、高光、有體積光源品姓、失焦寝并、卡通渲染箫措、色調(diào)分離、畸變衬潦、凹凸貼圖斤蔓、邊緣檢測(cè)、運(yùn)動(dòng)檢測(cè)等效果

看著有些抽象镀岛,再看看另一篇文章是怎么說的

Shader(著色器)實(shí)際上就是一小段程序弦牡,它負(fù)責(zé)將輸入的Mesh(網(wǎng)格)以指定的方式和輸入的貼圖或者顏色等組合作用,然后輸出漂羊。繪圖單元可以依據(jù)這個(gè)輸出來將圖像繪制到屏幕上驾锰。(參考1)

OK,結(jié)合兩者整理下大概能知道Shader是一個(gè)能處理圖像輸入并輸出提供給GPU進(jìn)行繪制的腳本程序走越。


那么為什么會(huì)出現(xiàn)Shader這東西呢椭豫,我繼續(xù)往下深入,還是先看Wiki

從技術(shù)的角度來看买喧,著色器是渲染器的一個(gè)部分捻悯,它負(fù)責(zé)計(jì)算目標(biāo)的顏色。隨著圖形處理單元的進(jìn)步淤毛,主要的圖形軟件庫(kù)今缚,像OpenGL和Direct3D都開始將目光投向更高階的功能,即用著色器給新型的GPU編程低淡,這就需要開發(fā)一系列的應(yīng)用程序接口(API)滿足著色功能姓言。這樣的改動(dòng)出現(xiàn)在OpenGL的1.5版本和Direct3D的8版本。


停一下

渲染器蔗蹋?OpenGL何荚?Direct3D?看著這些陌生又熟悉的名詞我的大腦一陣顫抖猪杭,硬著頭皮繼續(xù)谷歌...

渲染(英語(yǔ):render餐塘,或稱“繪制”)在電腦繪圖中,是指:用軟件從模型生成圖像的過程皂吮。模型是用語(yǔ)言或者數(shù)據(jù)結(jié)構(gòu)進(jìn)行嚴(yán)格定義的三維物體或虛擬場(chǎng)景的描述戒傻,它包括幾何、視點(diǎn)蜂筹、紋理需纳、照明和陰影等信息。圖像是數(shù)字圖像或者位圖圖像艺挪。渲染用于描述:計(jì)算視頻編輯軟件中的效果不翩,以生成最終視頻的輸出過程。

哦哦哦哦哦!渲染器就是Renderer嘛口蝠!這個(gè)我在Unity菜單里面見過器钟,好吧其實(shí)我也沒什么概念,按照Wiki上面的解釋來看亚皂,我們平時(shí)說的3D模型其實(shí)是一個(gè)3D物體或者3D場(chǎng)景按照一定約束描述的集合俱箱,這個(gè)集合中包含了一些信息,而渲染器讀取這些信息后就會(huì)把這個(gè)物體或者場(chǎng)景還原出來并繪制成我們能看到的畫面灭必,說得更簡(jiǎn)單一些狞谱,渲染器就是一個(gè)畫家,把我們需要畫的東西的信息告訴他禁漓,他就能幫我們畫出來跟衅。

而渲染又有預(yù)渲染(Pre-rendering)和實(shí)時(shí)渲染(Real-time rendering),預(yù)渲染就是計(jì)算機(jī)以CPU為主進(jìn)行渲染播歼,顯示效果好但是畫出來比較耗時(shí)伶跷,實(shí)時(shí)渲染是以GPU為主,效果較差但勝在畫的快秘狞,于是就能理解為什么在游戲中提到都是說實(shí)時(shí)渲染叭莫,而聽到做設(shè)計(jì)的朋友整天抱怨渲染等很久是因?yàn)橛玫氖桥c渲染了。

然后又把OpenGL和Direct3D給谷歌了一番烁试,這倆貨都是繪圖API雇初,區(qū)別就是OpenGL是開源的,用在多個(gè)平臺(tái)减响,Direct3D是必源的靖诗,并且僅用于Windows平臺(tái),他們針對(duì)Shader都有自己的一套GPU編程語(yǔ)言支示,OpenGL對(duì)應(yīng)的是GLSL(OpenGLShading Language刊橘,也叫GLslang) ,Direct3D對(duì)應(yīng)的是HLSL(High Level ShadingLanguage)颂鸿,除了它們兩個(gè)外還有一個(gè)著名卡商N(yùn)VIDIA的GPU編程語(yǔ)言Cg(C for graphic)促绵,三者算是流行三巨頭了

解決了這幾個(gè)看著頭大的名詞,我接著往下看看為什么會(huì)出現(xiàn)需要Shader的情況嘴纺,首先是一張固定的硬件的渲染流水線圖


這張圖描述的是GPU層的渲染的流程败晴,可以看到有個(gè)片段的著色,如果我們需要高效的去實(shí)現(xiàn)一些成像的變換操作颖医,那么比如成像之后再改變位衩,顯然在這里處理是最效率的裆蒸,于是就有了把著色模塊變?yōu)榭删幊袒男枨笕巯簦鶕?jù)之前所了解到的信息,Shader編程本質(zhì)上就是對(duì)可編程化的著色器進(jìn)行編程,那么再來看看可編程化后的渲染流水線圖佛致,

我們可以看到可編程的部分有兩個(gè)贮缕,一個(gè)是針對(duì)頂點(diǎn),一個(gè)是針對(duì)片斷(圖上稱為片段俺榆,查了下英文原文為Fragment感昼,故還是用片斷來稱呼),頂點(diǎn)比較好理解罐脊,一個(gè)模型定嗓,會(huì)存在很多頂點(diǎn),這些頂點(diǎn)通過連接形成線萍桌,一組封閉的線組成面宵溅,許許多多的面組成最后我們看到的模型,而變換頂點(diǎn)可以在一定程度上改變模型的形成效果上炎,舉個(gè)栗子恃逻,


舉個(gè)栗子

我們看到一個(gè)正方形,如果把四個(gè)頂點(diǎn)的位置進(jìn)行不同程度的便宜藕施,那么正方形就會(huì)變成一個(gè)梯形寇损,視覺上就有一種類似透視的效果

簡(jiǎn)單的頂點(diǎn)坐標(biāo)變換

擴(kuò)展想一下,變換的頂點(diǎn)數(shù)更多的情況裳食,甚至可以形成凹凸面等效果矛市,看到這里我忽然發(fā)現(xiàn),雖然這玩意叫著色器胞谈,但實(shí)際上能做的事情不僅僅是著色尘盼,還兼職了包括坐標(biāo)位置在內(nèi)的一些工作,拿著跟別人一樣的工資烦绳,做了其他人幾倍的工作卿捎。

而另一個(gè)片斷著色器的片斷一眼看不出個(gè)所以然,于是來看看Wiki上的說明

像素著色器(Direct3D)径密,常常又稱為片斷著色器(OpenGL)午阵,處理來自光柵化器的數(shù)據(jù)。光柵化器已經(jīng)將多邊形填滿并通過流水線傳送至像素著色器享扔,后者逐像素計(jì)算顏色底桂。像素著色器常用來處理場(chǎng)景光照和與之相關(guān)的效果,如凸凹紋理映射和調(diào)色惧眠。名稱片斷著色器似乎更為準(zhǔn)確籽懦,因?yàn)閷?duì)于著色器的調(diào)用和屏幕上像素的顯示并非一一對(duì)應(yīng)。舉個(gè)例子氛魁,對(duì)于一個(gè)像素暮顺,片斷著色器可能會(huì)被調(diào)用若干次來決定它最終的顏色厅篓,那些被遮擋的物體也會(huì)被計(jì)算,直到最后的深度緩沖才將各物體前后排序捶码。

像素著色引擎(Pixel Shader)是以每像素(Pixel)為單位的圖形處理功能羽氮。像素著色引擎不是最迫切需要的,擁有較低的優(yōu)先權(quán)惫恼,當(dāng)頂點(diǎn)著色引擎負(fù)荷大時(shí)档押,像素著色引擎可能被閑置著。大多數(shù)情況下祈纯,可使用頂點(diǎn)著色法代替像素著色法令宿。Direct3D 9.0 擴(kuò)充像素著色引擎,有多達(dá)1536個(gè)指令腕窥。

emmmmmm...大概意思應(yīng)該是針對(duì)像素來進(jìn)行著色掀淘,但是可以被頂點(diǎn)著色器以某種算法取代,但是要展現(xiàn)出更好的效果油昂,則需要它來處理每一個(gè)像素革娄,比如有一個(gè)面,會(huì)先對(duì)這個(gè)面的像素點(diǎn)顏色進(jìn)行計(jì)算冕碟,然后如果這個(gè)面被光照著了拦惋,那么就再計(jì)算被光照后的像素點(diǎn)顏色,這樣調(diào)用兩次片斷著色器安寺,就算出最終這個(gè)像素點(diǎn)的成像顏色厕妖。當(dāng)然,現(xiàn)實(shí)情況肯定會(huì)更復(fù)雜挑庶,不過通過這兩段說明大致上已經(jīng)了解片斷著色器是做什么的了言秸。

而時(shí)代在進(jìn)步,科技在升華迎捺,為了應(yīng)對(duì)一些新的需要举畸,展現(xiàn)出更好的畫面,現(xiàn)在的渲染流水線中已經(jīng)增加了更加細(xì)分的著色器凳枝,比如可以從幾何面中增刪頂點(diǎn)的幾何著色器(Geometry shaders)抄沮,Direct3D 11新增用來處理表面細(xì)分的曲面細(xì)分表面著色器(Tessellation shaders)

看了這么多,也大概了解了Shader是什么岖瑰,以及為什么要用Shader了叛买,下一篇就從代碼入手開始學(xué)習(xí)。


PS:由于本人沒有學(xué)過計(jì)算機(jī)圖形相關(guān)專業(yè)課程蹋订,若有理解不準(zhǔn)確的地方還望指正m(_? _)m


參考:

貓都能學(xué)會(huì)的Unity3D Shader入門指南(一)

The Book of Shaders by Patricio Gonzalez Vivo and Jen Lowe

3D游戲引擎系列五

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末率挣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子露戒,更是在濱河造成了極大的恐慌椒功,老刑警劉巖娃圆,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蛾茉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撩鹿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門谦炬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人节沦,你說我怎么就攤上這事键思。” “怎么了甫贯?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵吼鳞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我叫搁,道長(zhǎng)赔桌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任渴逻,我火速辦了婚禮疾党,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惨奕。我一直安慰自己雪位,他們只是感情好甘耿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布揩尸。 她就那樣靜靜地躺著俘侠,像睡著了一般赫舒。 火紅的嫁衣襯著肌膚如雪筷频。 梳的紋絲不亂的頭發(fā)上欠雌,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天淆游,我揣著相機(jī)與錄音恃锉,去河邊找鬼港粱。 笑死嗜侮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啥容。 我是一名探鬼主播锈颗,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼咪惠!你這毒婦竟也來了击吱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤遥昧,失蹤者是張志新(化名)和其女友劉穎覆醇,沒想到半個(gè)月后朵纷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡永脓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年袍辞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片常摧。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搅吁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出落午,到底是詐尸還是另有隱情谎懦,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布溃斋,位于F島的核電站界拦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梗劫。R本人自食惡果不足惜享甸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梳侨。 院中可真熱鬧枪萄,春花似錦、人聲如沸猫妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)割坠。三九已至齐帚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彼哼,已是汗流浹背对妄。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敢朱,地道東北人剪菱。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拴签,于是被迫代替她去往敵國(guó)和親孝常。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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