[轉(zhuǎn)] Shader 優(yōu)化相關(guān)資料整理

優(yōu)化必須先搞清楚什么是渲染管線


注:
應(yīng)用程序階段:主要是CPU與內(nèi)存打交道,例如碰撞檢測摔桦,計(jì)算好的數(shù)據(jù)(頂點(diǎn)坐標(biāo)、法向量承疲、紋理坐標(biāo)邻耕、紋理)就會通過數(shù)據(jù)總線傳給圖形硬件 。
幾何階段:其實(shí)上圖有個(gè)問題(網(wǎng)上不少博客也沒寫清楚這個(gè)問題)燕鸽,根據(jù) OpenGL 藍(lán)寶書(Super Bible)上的講解兄世,“幾何圖元裝配”應(yīng)該位于“細(xì)分著色器”階段之后(細(xì)分著色器處理的還是一個(gè)個(gè) Patch),然后再進(jìn)入“幾何著色器”(因?yàn)閹缀沃魈幚淼幕A(chǔ)就是一整個(gè)圖元)生成新的圖元啊研,在該階段的最后碘饼,就是我們熟悉的MVP變換視錐體裁剪操作了。


光柵化階段:進(jìn)入光柵化器進(jìn)行光柵化(還包括剪刀測試悲伶、深度測試、模板測試)住涉,最后輸出到屏幕的 framebuffer 中麸锉。

編寫shader時(shí)的一些建議
轉(zhuǎn)自:http://www.cnblogs.com/sifenkesi/p/4716791.html

1、只計(jì)算需要計(jì)算的東西
盡量減少無用的頂點(diǎn)數(shù)據(jù), 比如貼圖坐標(biāo), 如果有Object使用2組有的使用1組, 那么不 要將他們放在一個(gè)vertex buffer中, 這樣可以減少傳輸?shù)臄?shù)據(jù)量;
避免過多的頂點(diǎn)計(jì)算,比如過多的光源, 過于復(fù)雜的光照計(jì)算(復(fù)雜的光照模型);
避免 VS 指令數(shù)量太多或者分支過多, 盡量減少 VS 的長度和復(fù)雜程度;

2舆声、盡量在 VS 總計(jì)算
通常花沉,需要渲染的像素比頂點(diǎn)數(shù)多,而頂點(diǎn)數(shù)又比物體數(shù)多很多媳握。所以如果可以碱屁,盡量將運(yùn)算從 FS 移到 VS,或直接通過 script 來設(shè)置某些固定值蛾找;

3娩脾、指令優(yōu)化【Unity】
在使用Surface Shader時(shí),可以通過一些指令讓shader優(yōu)化很多打毛。
  通常情況下柿赊,Surface shader的很多默認(rèn)選項(xiàng)都是開啟的俩功,以適應(yīng)大多數(shù)情況,但是很多時(shí)候碰声,你可以關(guān)閉其中的一些選項(xiàng)诡蜓,從而讓你的shader運(yùn)行的更快:  
(1) approxview 對于使用了 view direction 的shader,該選項(xiàng)會讓 view dir 的 normalize 操作 per-vertex 進(jìn)行胰挑,而不是 per-pixel蔓罚。這個(gè)優(yōu)化通常效果明顯≌八蹋   (2) halfasview 可以讓Specular shader變得快一些豺谈,使用一個(gè)介于光照方向和觀察方向之間的 half vector 來代替真正的觀察方向 viewDir 來計(jì)算光照函數(shù)。
 (3) noforwardadd Forward Rende r時(shí)蘸朋,完全只支持一盞方向光的 per-pixel 渲染核无,其余的光照全部按照 per-vertex 或 SH 渲染。這樣可以確保shader在一個(gè)pass里渲染完成藕坯⊥拍希 
 (4) noambient 禁掉 ambient lighting 和 SH lighting,可以讓 shader 快一點(diǎn)兒炼彪。

4吐根、浮點(diǎn)數(shù)精度相關(guān):
 float:最高精度,通常32位 
 half:中等精度辐马,通常16位拷橘,-60000到60000, 
 fixed:最低精度喜爷,通常11位冗疮,-2.0到2.0,1/256的精度檩帐∈踽# 
 盡量使用低精度。對于 color 和 unit length vectors湃密,使用fixed诅挑,其他情況,根據(jù)取值范圍盡量使用 half泛源,實(shí)在不夠則使用 float 拔妥。  在移動平臺达箍,關(guān)鍵是在 FS 中盡可能多的使用低精度數(shù)據(jù)没龙。另外,對于多數(shù)移動GPU,在低精度和高精度之間轉(zhuǎn)換是非常耗的兜畸,在fixed上做swizzle操作也是很費(fèi)事的努释。

5、Alpha Test
  Alpha test 和 clip() 函數(shù)咬摇,在不同平臺有不同的性能開銷伐蒂。  通常使用它來剔除那些完全透明的像素肛鹏∫莅睿  但是,在 iOS 和一些 **Android **上使用的 PowerVR GPUs上面在扰,alpha test非常的昂貴缕减。6、Color Mask
  在移動設(shè)備上芒珠,Color Mask 也是非常昂貴的桥狡,所以盡量別使用它,除非真的是需要皱卓。

shader中用for裹芝,if等條件語句為什么會使得幀率降低很多?

作者:空明流轉(zhuǎn)鏈接:https://www.zhihu.com/question/27084107/answer/39281771來源:知乎著作權(quán)歸作者所有娜汁,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)嫂易。

  1. For和If不一定意味著動態(tài)分支
    在GPU上的分支語句(for,if-else掐禁,while)怜械,可以分為三類。Branch的Condition僅依賴編譯期常數(shù)此時(shí)編譯器可以直接攤平分支傅事,或者展開(unloop)缕允。對于For來說,會有個(gè)權(quán)衡蹭越,如果For的次數(shù)特別多灼芭,或者body內(nèi)的代碼特別長,可能就不展開了般又,因?yàn)闀噶钛b載也是有限或者有耗費(fèi)的額外成本可以忽略不計(jì)Branch的Condition僅依賴編譯期常數(shù)和Uniform變量一個(gè)運(yùn)行期固定的跳轉(zhuǎn)語句,可預(yù)測同一個(gè)Warp內(nèi)所有micro thread均執(zhí)行相同分支額外成本很低Branch 的 Condition 是動態(tài)的表達(dá)式這才是真正的“動態(tài)分支”會存在一個(gè)Warp的 Micro Thread 之間各自需要走不同分支的問題2. 跳轉(zhuǎn)本身的成本非常低
    隨著IP/EP(Instruction Pointer/Execution Pointer)的引入巍佑,現(xiàn)代GPU在執(zhí)行指令上的行為茴迁,和CPU沒什么兩樣。跳轉(zhuǎn)僅僅是重新設(shè)置一個(gè)寄存器萤衰。3.Micro Thread 走不同分支時(shí)的處理
    GPU本身的執(zhí)行速度快堕义,是因?yàn)樗粭l指令可以處理多個(gè) Micro Thread 的數(shù)據(jù)(SIMD)。但是這需要多個(gè) Micro Thread 同一時(shí)刻的指令是相同的。如果不同倦卖,現(xiàn)代GPU通常的處理方法是洒擦,按照每個(gè)Micro Thread的不同需求多次執(zhí)行分支。[cpp] view plain copy
x = tex.Load();  
if(x == 5)  
{  
    // Thread 1 & 2 使用這個(gè)路徑  
   out.Color = float4(1, 1, 1, 1);   
}  
else  
{  
    // Thread 3 & 4 使用這個(gè)路徑  
   out.Color = float4(0, 0, 0, 0);  
} 

比如在上例中怕膛,兩個(gè)分支的語句Shader Unit都會執(zhí)行熟嫩,只是不同的是如果在執(zhí)行if分支,那么計(jì)算結(jié)果將不會寫入到thread 3 和 4的存儲中(無副作用)褐捻。這樣做就相當(dāng)于運(yùn)算量增加了不少掸茅,這是動態(tài)分支的主要成本。但是如果所有的線程柠逞,都走的是同一分支昧狮,那么另外一個(gè)分支就不用走了。這個(gè)時(shí)候Shader Unit也不會去傻逼一樣的執(zhí)行另外一個(gè)根本不需要執(zhí)行的分支板壮。此時(shí)性能的損失也不多逗鸣。并且,在實(shí)際的Shader中绰精,除非特殊情況撒璧,大部分Warp內(nèi)的線程,即便在動態(tài)分支的情況下茬底,也多半走的是同一分支沪悲。4. 動態(tài)分支和代碼優(yōu)化難度有相關(guān)性
這一點(diǎn)經(jīng)常被忽視,就是有動態(tài)分支的代碼阱表,因?yàn)闆]準(zhǔn)你要讀寫點(diǎn)什么殿如,前后還可能有依賴,往往也難以被優(yōu)化最爬。比如說你非要鬧這樣的語句出來:[cpp] view plain copy

if(x == 1)  
{  
   color = tex1.Load(coord);  
}  
else if(x == 2)  
{  
   color = tex2.Load(coord);  
}  

你說編譯器怎么給你優(yōu)化涉馁。說句題外話,為啥要有TextureArray呢爱致?也是為了這個(gè)場合烤送。TextureArray除了紋理不一樣,無論格式糠悯、大小帮坚、坐標(biāo)、LoD互艾、偏移试和,都可以是相同的。這樣甚至可以預(yù)見不同Texture Surface上取數(shù)據(jù)的內(nèi)存延遲也是非常接近的纫普。這樣有很多的操作都可以合并成SIMD阅悍,就比多個(gè)Texture分別來取快得多了。這就是一個(gè)通過增加了約束(紋理格式、大小节视、尋址坐標(biāo))把SISD優(yōu)化成SIMD的例子拳锚。

定位渲染通道瓶頸的方法
轉(zhuǎn)自:http://blog.csdn.net/rabbit729/article/details/6398343

一般來說, 定位渲染通道瓶頸的方法就是改變渲染通道每個(gè)步驟的工作量, 如果吞吐量也改變了, 那個(gè)步驟就是瓶頸.寻行。找到了瓶頸就要想辦法消除瓶頸, 可以減少該步驟的工作量, 增加其他步驟的工作量霍掺。  一般在光柵化之前的瓶頸稱作”transform bound”, 三角形設(shè)置處理后的瓶頸稱作”fill bound”
定位瓶頸的辦法:

  1. 改變幀緩沖或者渲染目標(biāo)(Render Target)的顏色深度(16 到 32 位), 如果幀速改變了, 那么瓶頸應(yīng)該在幀緩沖(RenderTarget)的填充率上寡痰。
  2. 否則試試改變貼圖大小和貼圖過濾設(shè)置, 如果幀速變了,那么瓶頸應(yīng)該是在貼圖這里抗楔。
  3. 否則改變分辨率.如果幀速改變了, 那么改變一下pixel shader的指令數(shù)量, 如果幀速變了, 那么瓶頸應(yīng)該就是pixel shader. 否則瓶頸就在光柵化過程中。
  4. 否則, 改變頂點(diǎn)格式的大小, 如果幀速改變了, 那么瓶頸應(yīng)該在顯卡帶寬上拦坠。
  5. 如果以上都不是, 那么瓶頸就在CPU這一邊连躏。

轉(zhuǎn)自:http://blog.csdn.net/panda1234lee/article/details/54861041

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贞滨,隨后出現(xiàn)的幾起案子入热,更是在濱河造成了極大的恐慌,老刑警劉巖晓铆,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺良,死亡現(xiàn)場離奇詭異,居然都是意外死亡骄噪,警方通過查閱死者的電腦和手機(jī)尚困,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來链蕊,“玉大人事甜,你說我怎么就攤上這事√显希” “怎么了逻谦?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陪蜻。 經(jīng)常有香客問我邦马,道長,這世上最難降的妖魔是什么宴卖? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任滋将,我火速辦了婚禮,結(jié)果婚禮上症昏,老公的妹妹穿的比我還像新娘耕渴。我一直安慰自己,他們只是感情好齿兔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般分苇。 火紅的嫁衣襯著肌膚如雪添诉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天医寿,我揣著相機(jī)與錄音栏赴,去河邊找鬼。 笑死靖秩,一個(gè)胖子當(dāng)著我的面吹牛须眷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沟突,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼花颗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惠拭?” 一聲冷哼從身側(cè)響起扩劝,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎职辅,沒想到半個(gè)月后棒呛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡域携,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年簇秒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秀鞭。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趋观,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出气筋,到底是詐尸還是另有隱情拆内,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布宠默,位于F島的核電站麸恍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搀矫。R本人自食惡果不足惜抹沪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓤球。 院中可真熱鬧融欧,春花似錦、人聲如沸卦羡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欠肾,卻和暖如春瓶颠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刺桃。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工粹淋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瑟慈。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓桃移,卻偏偏與公主長得像,于是被迫代替她去往敵國和親葛碧。 傳聞我的和親對象是個(gè)殘疾皇子借杰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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