標籤:核心 height mat span 簡單 get 標識 迴圈 入參
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> |
Unity運用GPU代替CPU處理和計算簡單測試