Unity3D從4的版本開始支持了DirectX 11。也就是說浅侨,在Unity3D中可以直接調(diào)用經(jīng)過封裝的DirextX API來使用DirectCompute進行并行計算盗扇。最近做了一段,發(fā)現(xiàn)還是挺好用的嘹裂,當然也有很多bug在其中。目前google的話摔握,單純講Unity3D中如何使用DirectCompute的文章特別少(可能本來這樣的需求就少)寄狼,有的文章又比較獨立而且沒有深度,大概介紹一個例子就完事兒盒发。邊學邊做的過程中盡管找到了合適的教程例嘱,但還是免不了很多問題。打算先把好的教程翻譯過來宁舰,這是第一篇拼卵。:)
DirectCompute tutorial for Unity 簡介 1
我使用Unity大約有兩年了。在這之前我都是用C++寫程序蛮艰,并且手動創(chuàng)建圖形上下文腋腮。我首選的圖形API是OpenGL,關于如何寫GLSL的shader積累了不少經(jīng)驗壤蚜。剛開始使用Unity的時候即寡,我選擇Cg著色語言。GLSL和Cg差別并不大袜刷,要轉換也很容易聪富。Unity雖然支持GLSL,但是用的并不多著蟹。
現(xiàn)在Unity開始支持微軟的DirectX 11墩蔓,并且?guī)в蠨irectCompute API梢莽。DirectCompute API通過寫compute shader開辟了一條使用GPU的新道路。主要問題是奸披,非常缺乏關于怎樣使用DirectCompute的教程和文檔昏名。Google搜索,微軟文檔都很少阵面,Amazon上也鮮有關于這個主題的書轻局。如果你正好知道一些好的資源,歡迎在評論的地方發(fā)個鏈接來样刷。
過去幾年我嘗試收集關于怎樣使用這個強大的API方面的信息仑扑,但是很少類似信息。所以我覺得自己寫個系列教程來介紹怎樣在Unity中使用DirectCompute颂斜。我會從為什么需要DirectCompute講起夫壁,它和傳統(tǒng)的圖形管線有什么不同拾枣,怎樣通過compute shader寫kernel函數(shù)沃疮,GPU內(nèi)部線程分塊怎樣工作,怎樣訪問紋理梅肤,怎樣使用不同類型的buffer司蔬,怎樣使用線程同步、共享內(nèi)存以及最優(yōu)化性能姨蝴。
這些教程不要求對Cg shader有任何經(jīng)驗俊啼,但是我強烈推薦在開始compute shader之前對Cg shader有一個很好的理解。主要原因是使用compute shader處理出來的數(shù)據(jù)很可能需要進行可視化左医,這時候就需要使用Cg shader了授帕。我會講到怎么去做。compute shader是使用微軟的HLSL寫的浮梢,在此教程中你不需要知道這個語言跛十,當然至少有一種shader語言的基礎最好(GLSL/Cg/HLSL)。幸運的是秕硝,HLSL和Cg很相似芥映,你設置可能感覺不出來兩者區(qū)別。首先推薦配置一下compute shader語法高亮的插件远豺,因為Monodevelop默認并沒有奈偏。
圖形管線
要理解為什么要使用DirectCompute,理解一下默認圖形管線及其歷史是很有幫助的躯护。它起始于90年代早期惊来,當時3D圖形越來越流行,GPU也逐漸成為計算機中的標配棺滞,開發(fā)者需要一個圖形API來利用這些強大的設備裁蚁。1992年内狸,OpenGL1.0發(fā)布了,它是SGI公司為其圖形工作站開發(fā)的IRIS GL厘擂。微軟最初是OpenGL ARB中的一員昆淡,該組織負責OpenGL標準的開發(fā),還包括了SGI刽严,Digital Equipment Corp昂灵,IBM,Intel舞萄。后來微軟離開了ARB眨补,開始開發(fā)自己的圖形系統(tǒng)Direct3D,作為DirectX API的一部分倒脓。后來ARB被Khronos工作組接管侄刽,現(xiàn)在的成員還有3Dlabs, ATI, Discreet, Evans & Sutherland, Intel, NVIDIA, SGI and Sun Microsystems.
開發(fā)者需要做的是把他們要渲染的幾何體送入GPU逝薪,OpenGL會把它傳入圖形管線直到最終輸出為屏幕上的像素。盡管開發(fā)者可以開關某些特定的部分,配置一些參數(shù)柠辞,但是這種管線是固定的绞惦,可以改變的并不多易核。這種情況持續(xù)了一段時間狼电,隨著開發(fā)者開始進一步推進GPU,對更高級特性的需求越來越明顯盆均,這種管線也要更加靈活塞弊。解決方案是使管線的特定部分可編程。開發(fā)這可以編寫自己的程序來執(zhí)行管線特定的部分泪姨。這些程序就被稱之為shader游沿。
新的可編程管線開啟了新的可能性,隨之而來的是更高質量的圖形肮砾,這是前一代游戲不具備的诀黍。盡管圖形管線最初是用來開發(fā)圖形,新的靈活性意味著GPU可以用來處理多種類型的算法唇敞。很多研究迅速展開蔗草,修改算法使之在多線程的GPU上執(zhí)行。物理疆柔、財經(jīng)咒精、數(shù)學、醫(yī)療等眾多領域開始使用GPU處理他們的數(shù)據(jù)旷档。GPU原始的能力并不好用模叙,因此GPGPU(General Purpose Graphical Processing Unit)編程誕生了。
General Purpose Graphical Processing Unit
GPGPU迅速成為了主流并進入行業(yè)領域鞋屈。然后還有一個問題范咨。圖形API仍然與圖形管線綁定故觅。shader的靈活性帶給你的只是圖形管線的一個階段,他們?nèi)匀皇艿焦芫€的限制渠啊。頂點shader需要輸出頂點输吏,片元shader需要輸出像素。然而大量的工作需要GPGPU必須改變替蛉。需要一個API把開發(fā)者中圖形管線的束縛中釋放出來贯溅,并且提供一個在與圖形無關的設置中使用GPU的環(huán)境。
接下來的幾年躲查,GPGPU的API開始出現(xiàn)它浅,現(xiàn)在的開發(fā)者還能夠在CUDA,OpenCL镣煮,DirectCompute中進行選擇姐霍。這些新的API開辟了使用GPU的新道路,再也不需要與傳統(tǒng)圖形管線綁定了典唇。盡管還有一些限制镊折,但是與在一個多線程環(huán)境中工作相比,太微不足道了蚓聘。
游戲產(chǎn)業(yè)最渴望使用GPU這種新能力腌乡。隨著游戲越來越真實,他們開始模擬真實世界中的物理現(xiàn)象夜牡。這些計算通常很復雜,需要很多的處理侣签。GPGPU提供的能力和靈活性可以是這些計算做的更細塘装、范圍更大。原始的圖形API為我們習以為常的3D游戲開創(chuàng)了新的世界影所,而新的GPUGPU API也在游戲行業(yè)中開辟了新紀元蹦肴。當代的游戲將會被這些API的使用所統(tǒng)治,將會有更真實的圖形和物理效果猴娩。
你需要做的就是學會如何使用它們阴幌。下一篇將會告訴你怎樣建立kernel函數(shù)以及線程塊是怎樣工作的。