GPU Cache不能編輯頂點的真相解密_第1頁
GPU Cache不能編輯頂點的真相解密_第2頁
GPU Cache不能編輯頂點的真相解密_第3頁
GPU Cache不能編輯頂點的真相解密_第4頁
GPU Cache不能編輯頂點的真相解密_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

GPUCache不能編輯頂點的真相解密這篇文章屬于典型的剝洋蔥文,由表及里,逐步引入新的知識點,挖掘最本質(zhì)的原因。這篇文的邏輯是先假設(shè)再證明,按照這個思路去閱讀會比較輕松。Maya里的GPUCache導(dǎo)入的幾何體為什么不能編輯頂點?這可以算是一個高頻問題了,這個問題可以轉(zhuǎn)換為:GPUCache導(dǎo)入的幾何體為什么不能編輯Mesh(不僅不能編輯頂點,為它添加bevel一類的節(jié)點也不可以)?實際上這個問題在Maya的幫助文檔中是有明確答案的。我們來看看官方是如何解釋的:GPUcachesareAlembic-basedfilesthatareoptimizedforfastplaybackperformanceinMaya.TheseperformancegainscomefromthewayGPUcachefilesareevaluated.TheGPUcachenoderoutescacheddatadirectlytothesystemgraphicscardforprocessing,bypassingMayadependencygraphevaluation.GPUcache是由Alembic文件派生出來的一種文件格式,為獲取Maya中快速播放的性能專門做了優(yōu)化。這些性能的提升來自于GPUcache文件求值的方式。GPUcache節(jié)點會避開Maya的dependencygraph求值機(jī)制,把緩存數(shù)據(jù)直接發(fā)送到系統(tǒng)的圖形卡接口進(jìn)行處理?,F(xiàn)今的圖形卡都有著比cpu夸張很多的線程數(shù)量,在并行計算的應(yīng)用上有著極大優(yōu)勢,而圖形處理的計算幾乎都是線性計算,與圖形卡的多線程簡直是天作之合,GPUcache利用了圖形卡的優(yōu)勢,把GPUcache文件中的緩存數(shù)據(jù)直接發(fā)送給圖形卡進(jìn)行計算,效率自然與基于傳統(tǒng)計算框架cpu《--》memory的DG(dependencygraph)機(jī)制不可同日而語。但仔細(xì)一想,這段話有一個漏洞:雖然GPUcache導(dǎo)入的geometry無法編輯頂點,但整體移動還是可以的。這就與官方的解釋相悖了,說好了會避開DG求值機(jī)制呢?為了在這個問題上做更深層次的分析,我們插播一個DAG的小廣告,快速的了解一下DAG的概念:InMaya,adirectedacyclicgraph(DAG),defineselementssuchastheposition,orientation,andscaleofgeometry.TheDAGiscomposedoftwotypesofDAGnodes,transformsandshapes.Maya‘sDirectedAcyclicGraph(DAG)scenearchitecture,organizedasatreeoftransformnodesandshapenodes.在Maya中,有向非循環(huán)圖(DirectedAcyclicGraph,DAG),定義了諸如幾何體的位置、方向和大小等元素。有向非循環(huán)圖由兩種DAG節(jié)點構(gòu)成,分別是Transform和Shape。Maya的有向非循環(huán)圖(DirectedAcyclicGraph,DAG)場景結(jié)構(gòu)就是由transform和shape節(jié)點組成的一顆層級樹。ADAGnodeissimplyanentityintheDAG.Itmayhaveandknowaboutparents,siblings,andchildren,butitdoesnotnecessarilyknowabouttransformationsorgeometry.TransformsandShapesaretwotypesofnodesderivedfromaDAGnode.AtransformnodeisatypeofDAGnodewhichhandlestransformations(translate,rotate,andscale),whileashapenodeisatypeofDAGnodewhichhandlesgeometry.Ashapenodedoesnotmaintaintransformationinformation,andgeometrycannotbehungbelowatransformnode.ThismeansthatanypieceofgeometryrequirestwoDAGnodesaboveit,ashapenodeimmediatelyaboveit,andatransformnodeabovetheshapenode.DAG節(jié)點就是有向非循環(huán)圖中的實體,該節(jié)點有且知道有哪些父節(jié)點、鄰節(jié)點和子節(jié)點,但它并不必需要知道相關(guān)的transform信息和幾何體信息。Transform和Shape是兩種派生自DAG節(jié)點的節(jié)點,Transform節(jié)點是一種能處理transformation(譯作變換,屬于線性計算,包含translate、rotate、scale信息)信息的DAG節(jié)點,Shape節(jié)點是一種能處理geometry(幾何體)信息的DAG節(jié)點。Shape節(jié)點不會維護(hù)transformation信息,geometry也不能放在Tranform節(jié)點下面。這意味著任意一片geometry都需要有兩個DAG節(jié)點放在它的層級之上,Shape節(jié)點放置在geometry上面,transform放置在Shape節(jié)點上面,通過這種方式構(gòu)造出一個層級關(guān)系樹,供DAG使用。Geometry層級示例:TransformNode--》處理transformation信息|ShapeNode--》處理下方Geometry信息|GeometryData--》可能存放在內(nèi)存中,也可能存放在GPU顯存中根據(jù)DAG的概念,我們可以推論:對于GPUcache導(dǎo)入進(jìn)來的geometry來說,必然會為它創(chuàng)建兩個DAG節(jié)點,一個是TransformNode,一個是ShapeNode。其中Tramsform節(jié)點中的tramsformation信息是可以編輯的,可以接受外部的位移操作,而Shape節(jié)點持有的geometry信息是不可編輯的。但現(xiàn)在這個推論還是不夠深入,為什么AlembicCache既能編輯transformation又能編輯geometry信息,唯獨GPUcache只能編輯transformation?下面我們再引入DG(dependencygraph)的概念,更進(jìn)一步的,去Maya的底層找答案。ThedependencygraphliesattheheartofMaya.Itmaintainstheconstructionhistoryofthescene:arecordofwhatoperationsyouhaveappliedinwhatorder.Thegraphismadeupofaseriesofinterconnectednodes,eachofwhichencapsulatesasingleoperationorasinglesetofcalculations.Eachnodeacceptsalimitedsetofwell-definedinputdata,performsitscalculationsbasedonthatdata,andproducesoneormoreoutputvalues.Dependencygraph(依賴圖)位于Maya核心,它維護(hù)著場景的構(gòu)造歷史,在這里,構(gòu)造歷史指的是你以某種順序應(yīng)用的操作記錄。該圖由一系列相互連接的節(jié)點組成,每一個節(jié)點封裝一個操作或一組計算。每個節(jié)點接受有限的一組定義好的輸入數(shù)據(jù),再根據(jù)該數(shù)據(jù)執(zhí)行計算,并生成一個或多個輸出值。MostobjectsinMayaaredependencygraphnodes,ornetworksofnodes(severalnodesconnectedtogether)。Forexample,DAGnodesaredependencygraphnodes,andshadersarenetworksofnodes.Maya中的大多數(shù)對象都是依賴圖節(jié)點或是由多個節(jié)點連接到一起構(gòu)成的子網(wǎng)絡(luò)。例如,DAG節(jié)點是依賴圖節(jié)點,著色器是節(jié)點網(wǎng)絡(luò)。Certaineventscausethedependencygraphtore-evaluateitself,examplesbeingscreenrefresh,andanimationplayback.Duringarefreshforexample,thesystemwillwalkdowntheDAGandforeachDAGnodechecktoseewhetheritneedstobere-evaluated.某些事件會觸發(fā)依賴圖重新對自己求值,例如屏幕刷新和動畫回放。在屏幕刷新期間,Maya底層將遍歷DAG層級結(jié)構(gòu),并檢查每一個經(jīng)過的DAG節(jié)點是否需要重新求值。由上可知,Transform和Shape節(jié)點實際上就是DG節(jié)點的一種,我們可以猜測,“TheGPUcachenoderoutescacheddatadirectlytothesystemgraphicscardforprocessing,bypassingMayadependencygraphevaluation.”這句話指的是,在viewport顯示geometry的時候,GPUcache構(gòu)造的Shapenode所持有的geometry數(shù)據(jù)會直接發(fā)送到系統(tǒng)的圖形卡接口進(jìn)行直接處理,避開DG的求值;而GPUcache構(gòu)造的Transformnode則依然會進(jìn)入DG的求值機(jī)制,用戶可以像使用Polygon一樣,在Transformnode上添加歷史節(jié)點,比如Timenode來key關(guān)鍵幀。實際上,在GPUcache的開發(fā)文檔中還提到了這樣一句:ThegpuCachenodeisaShapenodethatholdsbakedanimatedgeometryinmemory.ThenodecanstreamtheanimatedgeometrytotheviewportwithouttriggeringanyDGevaluationofgeometryattributes(mesh,nurbsorsubdsurfacedata)。gpuCache節(jié)點是一個在內(nèi)存中持有幾何體數(shù)據(jù)的Shape節(jié)點,當(dāng)然這個幾何體數(shù)據(jù)是烘焙后的、有動畫的幾何體數(shù)據(jù)。gpuCahe節(jié)點可以把幾何體數(shù)據(jù)傳遞給viewport(就是hardwarerenderer或者viewport2.0),而不會觸發(fā)任何幾何體屬性的DG求值行為。這條說明就充分佐證了我們的猜測,這個解釋無疑比文章最開始的答案要更深入。但我們依然還有一個疑惑,這種特性是如何實現(xiàn)的呢?為什么AlembicCache導(dǎo)入abc文件可以編輯頂點,GPUCache就不行?下面我們打破砂鍋問到底,去GPUCache的源碼里尋找答案。GPUcache的源碼是公開的,你可以通過下載對應(yīng)Maya版本的devkit來獲取,附個鏈接:Maya2017devkit下載地址?,F(xiàn)在我們閱讀GPUcache的源碼來驗證這個猜測是否為真。首先,在doGpuCacheExportArgList.mel中有這樣一段代碼可以展示GPUcache創(chuàng)建DAG節(jié)點的過程:3string$xformNode=`createNodetransform-name$nodeName`;createNodegpuCache-name($nodeName+“Shape”)-parent$xformNode;setAttr“.cacheFileName”-type“string”$fileFullPath;其中第一行創(chuàng)建transform節(jié)點;第二行創(chuàng)建gpuCache節(jié)點,gpuCache節(jié)點就是shape節(jié)點,下面會講到;第三行為gpuCache節(jié)點制定abc文件路徑。這就印證了我們在DAG環(huán)節(jié)的推論,GPUcache導(dǎo)入abc數(shù)據(jù)時會分別創(chuàng)建一個transform節(jié)點,一個shape節(jié)點。而transform節(jié)點就是Maya內(nèi)置的transform節(jié)點,所以當(dāng)然可以提供位移、旋轉(zhuǎn)、縮放等操作。我們再看下一段代碼,在gpuCacheShapeNode.cpp中有如下定義:這段代碼這足以證明gpuCache是一個標(biāo)準(zhǔn)的Shapenode。倒數(shù)第一行意為ShapeNode的類型名是“gpuCache”,倒數(shù)第二行意為ShapeNode繼承自MPxSurfaceShape。這這里簡單介紹一下MPxSurfaceShape,該類主要用于實現(xiàn)新的shape,并且有可選、可操作的組件,還有與Maya中默認(rèn)shape相似的行為。也就是說,ShapeNode是可以提供與默認(rèn)Shape相似功能的,比如,在viewport2.0中能顯示并編輯點線面,能添加bevel一類的歷史節(jié)點。但顯然gpuCache并沒有顯示頂點,在被選中時,顯示的邊緣也是dashedline,不是正常的實線。在這里我們應(yīng)該去查看MPxSurfaceShapeUI類,MPxSurfaceShape和MPxSurfaceShapeUI是需要一并實現(xiàn)的,MPxSurfaceShape主要用于操作幾何體數(shù)據(jù),MPxSurfaceShapeUI則用于顯示幾何體。在gpuCache中這兩個類分別由ShapeNode、ShapeUI實現(xiàn)。在ShapeNode中沒有實現(xiàn)setInternalValue()方法,而MPxSurfaceShape類中對頂點的編輯都是通過setInternalValue()來處理的,顯然ShapeNode不具備編輯頂點的接口,自然gpuCache也就無法編輯頂點了;在ShapeUI只有drawBoundingBox()、drawWireframe()、drawShaded()三個繪制函數(shù),分別繪制boundingbox、模型線框及表面。在這個類里并沒有找到繪制頂點的函數(shù),這就是你在Viewport2.0中無法看到gpuCache頂點的原因,無法看到頂點,自然也無法操作頂點。另外drawWireframe()函數(shù)中也指定了線框的繪制方式:kLineStippleShortDashed,強(qiáng)制Maya以虛線的方式繪制線框??梢詳喽?,gpuCache的源碼中一定重寫相關(guān)方法。繼續(xù)閱讀源碼能夠看到在gpuCacheSubSceneOve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論