DirectCompute tutorial for Unity 簡介 1

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,關(guān)于如何寫GLSL的shader積累了不少經(jīng)驗。剛開始使用Unity的時候,我選擇Cg著色語言。GLSL和Cg差別并不大,要轉(zhuǎn)換也很容易。Unity雖然支持GLSL,但是用的并不多。

現(xiàn)在Unity開始支持微軟的DirectX 11,并且?guī)в蠨irectCompute API。DirectCompute API通過寫compute shader開辟了一條使用GPU的新道路。主要問題是,非常缺乏關(guān)于怎樣使用DirectCompute的教程和文檔。Google搜索,微軟文檔都很少,Amazon上也鮮有關(guān)于這個主題的書。如果你正好知道一些好的資源,歡迎在評論的地方發(fā)個鏈接來。

過去幾年我嘗試收集關(guān)于怎樣使用這個強大的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語言的基礎(chǔ)最好(GLSL/Cg/HLSL)。幸運的是,HLSL和Cg很相似,你設(shè)置可能感覺不出來兩者區(qū)別。首先推薦配置一下compute shader語法高亮的插件,因為Monodevelop默認并沒有。

圖形管線

要理解為什么要使用DirectCompute,理解一下默認圖形管線及其歷史是很有幫助的。它起始于90年代早期,當時3D圖形越來越流行,GPU也逐漸成為計算機中的標配,開發(fā)者需要一個圖形API來利用這些強大的設(shè)備。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ā)者可以開關(guān)某些特定的部分,配置一些參數(shù),但是這種管線是固定的,可以改變的并不多。這種情況持續(xù)了一段時間,隨著開發(fā)者開始進一步推進GPU,對更高級特性的需求越來越明顯,這種管線也要更加靈活。解決方案是使管線的特定部分可編程。開發(fā)這可以編寫自己的程序來執(zhí)行管線特定的部分。這些程序就被稱之為shader。

新的可編程管線開啟了新的可能性,隨之而來的是更高質(zhì)量的圖形,這是前一代游戲不具備的。盡管圖形管線最初是用來開發(fā)圖形,新的靈活性意味著GPU可以用來處理多種類型的算法。很多研究迅速展開,修改算法使之在多線程的GPU上執(zhí)行。物理、財經(jīng)、數(shù)學、醫(yī)療等眾多領(lǐng)域開始使用GPU處理他們的數(shù)據(jù)。GPU原始的能力并不好用,因此GPGPU(General Purpose Graphical Processing Unit)編程誕生了。

General Purpose Graphical Processing Unit

GPGPU迅速成為了主流并進入行業(yè)領(lǐng)域。然后還有一個問題。圖形API仍然與圖形管線綁定。shader的靈活性帶給你的只是圖形管線的一個階段,他們?nèi)匀皇艿焦芫€的限制。頂點shader需要輸出頂點,片元shader需要輸出像素。然而大量的工作需要GPGPU必須改變。需要一個API把開發(fā)者中圖形管線的束縛中釋放出來,并且提供一個在與圖形無關(guān)的設(shè)置中使用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è)中開辟了新紀元。當代的游戲?qū)贿@些API的使用所統(tǒng)治,將會有更真實的圖形和物理效果。

你需要做的就是學會如何使用它們。下一篇將會告訴你怎樣建立kernel函數(shù)以及線程塊是怎樣工作的。

dx11_pipeline

原文鏈接

  1. http://scrawkblog.com/2014/06/24/directcompute-tutorial-for-unity-introduction/ 感謝作者的博文:)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容