Unity3D 降低向Shader中傳值的開銷

2022-06-22 01:48:11 字數 1009 閱讀 6171

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...