国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Shader 優化相關資料整理

2019-11-14 12:44:31
字體:
來源:轉載
供稿:網友

編寫shader時的一些建議

轉自:http://www.survivalescaperooms.com/sifenkesi/p/4716791.html

1、只計算需要計算的東西

盡量減少無用的頂點數據, 比如貼圖坐標, 如果有Object使用2組有的使用1組, 那么不 要將他們放在一個vertex buffer中, 這樣可以減少傳輸的數據量;避免過多的頂點計算,比如過多的光源, 過于復雜的光照計算(復雜的光照模型);避免 VS 指令數量太多或者分支過多, 盡量減少 VS 的長度和復雜程度;

2、盡量在 VS 總計算

通常,需要渲染的像素比頂點數多,而頂點數又比物體數多很多。所以如果可以,盡量將運算從 FS 移到 VS,或直接通過 script 來設置某些固定值;

3、指令優化【Unity】

在使用Surface Shader時,可以通過一些指令讓shader優化很多。

  通常情況下,Surface shader的很多默認選項都是開啟的,以適應大多數情況,但是很多時候,你可以關閉其中的一些選項,從而讓你的shader運行的更快:  (1) apPRoxview 對于使用了 view direction 的shader,該選項會讓 view dir 的 normalize 操作 per-vertex 進行,而不是 per-pixel。這個優化通常效果明顯。  (2) halfasview 可以讓Specular shader變得快一些,使用一個介于光照方向和觀察方向之間的 half vector 來代替真正的觀察方向 viewDir 來計算光照函數。  (3) noforwardadd Forward Rende r時,完全只支持一盞方向光的 per-pixel 渲染,其余的光照全部按照 per-vertex 或 SH 渲染。這樣可以確保shader在一個pass里渲染完成。  (4) noambient 禁掉 ambient lighting 和 SH lighting,可以讓 shader 快一點兒。

4、浮點數精度相關:

  float:最高精度,通常32位  half:中等精度,通常16位,-60000到60000,  fixed:最低精度,通常11位,-2.0到2.0,1/256的精度。  盡量使用低精度。對于 color 和 unit length vectors,使用fixed,其他情況,根據取值范圍盡量使用 half,實在不夠則使用 float 。  在移動平臺,關鍵是在 FS 中盡可能多的使用低精度數據。另外,對于多數移動GPU,在低精度和高精度之間轉換是非常耗的,在fixed上做swizzle操作也是很費事的。

5、Alpha Test

  Alpha test 和 clip() 函數,在不同平臺有不同的性能開銷。  通常使用它來剔除那些完全透明的像素。  但是,在 iOS 和一些 Android 上使用的 PowerVR GPUs上面,alpha test非常的昂貴。

6、Color Mask

  在移動設備上,Color Mask 也是非常昂貴的,所以盡量別使用它,除非真的是需要。

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

作者:空明流轉鏈接:https://www.zhihu.com/question/27084107/answer/39281771來源:知乎著作權歸作者所有,轉載請聯系作者獲得授權。

1. For和If不一定意味著動態分支

在GPU上的分支語句(for,if-else,while),可以分為三類。Branch的Condition僅依賴編譯期常數此時編譯器可以直接攤平分支,或者展開(unloop)。對于For來說,會有個權衡,如果For的次數特別多,或者body內的代碼特別長,可能就不展開了,因為會指令裝載也是有限或者有耗費的額外成本可以忽略不計Branch的Condition僅依賴編譯期常數和Uniform變量一個運行期固定的跳轉語句,可預測同一個Warp內所有micro thread均執行相同分支額外成本很低Branch 的 Condition 是動態的表達式這才是真正的“動態分支”會存在一個Warp的 Micro Thread 之間各自需要走不同分支的問題

2. 跳轉本身的成本非常低

隨著IP/EP(Instruction Pointer/Execution Pointer)的引入,現代GPU在執行指令上的行為,和CPU沒什么兩樣。跳轉僅僅是重新設置一個寄存器。

3.Micro Thread 走不同分支時的處理

GPU本身的執行速度快,是因為它一條指令可以處理多個 Micro Thread 的數據(SIMD)。但是這需要多個 Micro Thread 同一時刻的指令是相同的。如果不同,現代GPU通常的處理方法是,按照每個Micro Thread的不同需求多次執行分支。
x = tex.Load();if(x == 5){    // Thread 1 & 2 使用這個路徑   out.Color = float4(1, 1, 1, 1); }else{    // Thread 3 & 4 使用這個路徑   out.Color = float4(0, 0, 0, 0);}比如在上例中,兩個分支的語句Shader Unit都會執行,只是不同的是如果在執行if分支,那么計算結果將不會寫入到thread 3 和 4的存儲中(無副作用)。這樣做就相當于運算量增加了不少,這是動態分支的主要成本。但是如果所有的線程,都走的是同一分支,那么另外一個分支就不用走了。這個時候Shader Unit也不會去傻逼一樣的執行另外一個根本不需要執行的分支。此時性能的損失也不多。并且,在實際的Shader中,除非特殊情況,大部分Warp內的線程,即便在動態分支的情況下,也多半走的是同一分支。

4. 動態分支和代碼優化難度有相關性

這一點經常被忽視,就是有動態分支的代碼,因為沒準你要讀寫點什么,前后還可能有依賴,往往也難以被優化。比如說你非要鬧這樣的語句出來:
if(x == 1){   color = tex1.Load(coord);}else if(x == 2){   color = tex2.Load(coord);}...你說編譯器怎么給你優化。說句題外話,為啥要有TextureArray呢?也是為了這個場合。TextureArray除了紋理不一樣,無論格式、大小、坐標、LoD、偏移,都可以是相同的。這樣甚至可以預見不同Texture Surface上取數據的內存延遲也是非常接近的。這樣有很多的操作都可以合并成SIMD,就比多個Texture分別來取快得多了。這就是一個通過增加了約束(紋理格式、大小、尋址坐標)把SISD優化成SIMD的例子。

定位渲染通道瓶頸的方法

轉自:http://blog.csdn.net/rabbit729/article/details/6398343

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

定位瓶頸的辦法: 1. 改變幀緩沖或者渲染目標(Render Target)的顏色深度(16 到 32 位), 如果幀速改變了, 那么瓶頸應該在幀緩沖(RenderTarget)的填充率上。2. 否則試試改變貼圖大小和貼圖過濾設置, 如果幀速變了,那么瓶頸應該是在貼圖這里。3. 否則改變分辨率.如果幀速改變了, 那么改變一下pixel shader的指令數量, 如果幀速變了, 那么瓶頸應該就是pixel shader. 否則瓶頸就在光柵化過程中。4. 否則, 改變頂點格式的大小, 如果幀速改變了, 那么瓶頸應該在顯卡帶寬上。5. 如果以上都不是, 那么瓶頸就在CPU這一邊。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金沙县| 北碚区| 北辰区| 平乡县| 平顶山市| 固安县| 江源县| 南皮县| 景德镇市| 读书| 江安县| 洛浦县| 仙游县| 高雄县| 沙雅县| 慈利县| 黄山市| 永安市| 呈贡县| 三门峡市| 湖州市| 孝昌县| 永济市| 阳春市| 长岭县| 赣榆县| 喀喇沁旗| 武胜县| 庆阳市| 扶沟县| 普定县| 广西| 双鸭山市| 商丘市| 虞城县| 右玉县| 时尚| 桦南县| 延庆县| 黑山县| 许昌县|