Unity骨骼動畫的gpu instancing優化取代方案在iOS平臺遇到的問題小結

主要參考文章爲如下兩篇:

1. https://www.cnblogs.com/murongxiaopifu/p/7250772.html

2. https://blog.csdn.net/zsy654321/article/details/80865060

關於RGBHalf轉RGB24,上面第二篇文章已經提到了.寫代碼時在Bake的時候分別先存下最大最小值,然後對x,y,z轉換一下,再在shader裏轉回來.但是實際操作中還存在一些問題.比如如果默認生成的是asset而不是圖片格式,是沒辦法修改filter mode的,然後filter會導致在iOS平臺上(我們用的是metal)頂點顯示亂掉.因此我們需要將Texture保存下來

 

	void SaveTextureToFile(Texture2D texture, string fileName)
	{
		string path = Application.dataPath + "/Test/" + fileName + ".png";
		//Debug.Log(path);
		var bytes = texture.EncodeToPNG();
		File.WriteAllBytes(path, bytes);
	}

然後修改得到的png文件的filter mode爲point(no filter).

此外,tex2Dlod也不需要mipmap(用tex2Dlod是因爲在vertex shader當中無法用tex2D,詳細解釋看這裏https://forum.unity.com/threads/how-to-sample-a-texture-in-vertex-shader.513816/),所以關閉png文件的mipmap,還可以節省約33%的內存.

最後,需要注意如果項目總體使用了LinearSpace,需要取消勾選材質的sRGB選項,避免自動進行Gamma矯正而得到錯誤的結果.

P.S. 關於如何加入隨機播放,簡單說下,只要在shader里加一個offset並暴露出來,然後在C#裏new一個MaterialPropertyBlock,用SetPropertyBlock傳一個隨機值給這個offset就好了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章