Unity運用GPU代替CPU處理和計算簡單測試


http://www.manew.com/thread-110502-1-1.html
 
 
隨着游戲玩法的增強,計算的多量化,我們的CPU 並不足以迅速的處理這些問題,而Unity 給我們開放了一個接口,我們需要用它來處理大量的運算;
我們可以把大量的處理運算的邏輯放入這個Shader 中,用GPU 的並行能力來計算,這里簡單的說一說他的使用方式和如何把參數傳入和傳出。讓我們像一個方法一樣調用。
首先:在Unity 中我們可以創建一個ComputeShader
<ignore_js_op>  
打開之后會發現一個這樣的腳本:
<ignore_js_op>
簡單的介紹一下,
1 、這個#pragmakernel  Multiply  這是一個內核,  也可以稱作入口。這個至少有一個!
這個Multiply 請紅線標注,很重要,我們在代碼里需要用到它;
2 、接下來就是一個結構體,這個結構體是我們定義的一個結構體。我們用它來和外面的結構體相呼應。
3 RwStructuredBuffer<VecMatpair>dataBuffer   相當於我們聲明的一個可讀寫的變量我用C# 表示:   VecMatPair[] dataBuffer
4 、就是方法主體,跟第一條呼應,外部會調用這個類似於Main 函數的方法;可以寫一些簡單的邏輯,給上面的變量賦值:(這里值得重點一說,這個變量又當輸入又當輸出,注意!);
這里我們的ComputeShader 也就構建完成了;
下面進行C# 的編寫 ,讓其呼應,傳入和輸出;
<ignore_js_op>
1、  我們需要定義一個和Shader里面呼應的結構體。
2、  獲取這個shader,我們直接拖入就OK;
然后變量基本就完事了
我們看一下代碼主體:
<ignore_js_op> 
除去單行符號,我們一行一行解釋,千萬別亂:
1、  聲明一個長度為15的結構體,這是我們的輸入參數;(然而並用不到15個)
2、  制定一個循環,我給他了一個賦值,都是相同的值;
循環體里的內容跳過;
3、  這個很重要,還記得讓你們標紅線的地方嗎。這個就是獲取這個入口的標識;
4、  下面這個數組結構,用來最后來收取需要的5個數據;
5、  這里是測試打印跳過;
6、  ComputeBuffer 這個也很重要,你還需要聲明一個Buffer 參數需要制定這個收取的長度,和這個數組的所有占用字節(提前計算(這里就是Float=4 因為是2個Float=8 又因為是個長度為5的數組=5*8=40 ));
7、  下面就是一套流程了,對,就是走走流程;
關聯這個數據結構和Shader的變量相關聯;
SetData()把需要傳入的數據送進Shader;
接着!重點,一定要運行,第一開始我寫完發現怎么都沒變化,一定要運行Shader;Dispatch();
最后收取返回數據(我們需要接收這40個字節的數據);
打印結果附圖:
<ignore_js_op>  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM