http://www.manew.com/thread-110502-1-1.html
我們可以把大量的處理運算的邏輯放入這個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>
