天天看點

編寫Shader時的一些性能考慮

編寫shader時的一些建議:

1、隻計算需要計算的東西;

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

3、在使用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 Render時,完全隻支援一盞方向光的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。

  在移動平台,關鍵是在fragment shader中盡可能多的使用低精度資料。另外,對于多數移動GPU,在低精度和高精度之間轉換是非常耗的,在fixed上做swizzle操作也是很費事的。

5、Alpha Test

  Alpha test和clip()函數,在不同平台有不同的性能開銷。

  通常使用它來cull那些完全透明的像素。

  但是,在ios和一些android上使用的PowerVR GPUs上面,alpha test非常的昂貴。

 6、Color Mask

  在移動裝置上,Color Mask也是非常昂貴的,是以盡量别使用它,除非真的是需要。

繼續閱讀