unity3d中提供了很多api用於向shader傳值,這篇文章對比測試了兩類不同的使用方法的效能。
unity3d中,通過c#**向shader傳值有兩種方式。
一種是面向具體的material,另一種是面向所有的material。
以上兩種方式分別對應下面兩類api:
例如,現在的需求是,需要每幀向shader傳遞乙個offset、乙個scale、和乙個alpha。
普通的做法是:
在shader中新增:
float _offset;
float _scale;
float _alpha;
在c#中通過以下方式進行傳值:
shader.setglobalfloat("_offset", offset);
shader.setglobalfloat("_scale", scale);
shader.setglobalfloat("_alpha", alpha);
以上寫法可以正常工作,但是更好的方法是下面這種:
shader中:
float4 _parameter;
c#中:
vector4 parameter = new vector4(offset, scale, alpha, 0);
shader.setglobalvector("_parameter", parameter );
第二種方法在gpu暫存器的使用方面會優於第一種方法,因為不論是setfloat還是setvector,都會占用乙個暫存器。cpu和gpu通訊次數越少效能開銷也就越少。
用下面的方法做一下測試,可以發現兩種方式在cpu方面開銷變化很明顯,在我的電腦上,萬次迴圈一幀大約可以節省2ms左右。
void update()
else
}}
Unity3D開發(九) Unity3d流光效果
遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...
Unity3d時鐘指令碼
var tu1 texture2d var time1 float 0 function fixedupdate function ongui function gettime time float string var lasttime string var hour mathf.floortoi...
Unity3D 視窗裁剪
實現效果 拖動readplane 當包圍盒最小點超出blueplane的最小點時 僅做了左邊裁剪 對超出部分裁剪,當全部超出隱藏readplane 當readplane包圍盒的最大座標點大於blueplane的最小點時,顯示readplane 閱讀此文時,讀者最好具備世界座標 本地座標 bounds...