MeshContent, GeometryContent and VertexContent
僅供個人學習使用,請勿轉載,勿用於任何商業用途。
相信所有第一次寫custom content pipeline的人都會被這三個類弄暈,我也一樣,這裡做一個簡單的小結。
MeshContent(MC)可以包含一系列子MeshContent和GeometryContent(GC)。MC也儲存了一系列頂點位置(MC.Positions),注意是*頂點位置*,不是*頂點*。這一系列頂點位置被它所包含的GC所共用。GC代表了一個由若干頂點組成的最小渲染單元,類似一個ModelMeshPart。GC和VertexContent(VC)是一一對應的關係,每個GC對象都有一個VC。VC的作用是把一些本屬於GC的資料單獨打包為一個對象,讓GC看起來更簡潔,邏輯更清楚。MC有如下結構:
MC
|
|------------GC1-----VC1
| |
| |---GC2 -----VC2
| |
| |---GC3---- VC3
|
|
|------------SubMC1………
| |
| |---SubMC2---……..
| |
| |---SubMC3----………
|
|----Positions
|
GC通過VC對象中的PositionIndices知道自己引用了MC.Positions中的哪些位置,也可以直接存取VC的Positions屬性活得這些所引用的位置。特別要注意的是VC.Positions中的元素可能會大於MC.Positions的元素個數,也就是說VC.Positions中可能會包含對MC.Positions中元素的重複引用。Why?? 如前所述,這裡的position只是位置,可能有2個頂點都處在同一位置,但是他們有不同的法線和紋理座標,所以他們是不同的頂點。VC.Positions中的元素個數,才是當前GC所包含的實際頂點個數。
那麼頂點的紋理和法線儲存在哪裡呢?這些資料以VertexChannel的形式,儲存在VC中。每種不同類型的資料對應一個channel,比如法線在channel1,第一組紋理座標在channel2,第二組紋理座標在channel3,等等。每個channel中的元素個數都與VC.Positions中的相同。
頂點或者說三角形索引是如何儲存的呢?索引儲存在GC. Indices,注意,這裡的索引對應的是VC.Positions中的元素,而不是MC.Position,因為只有VC中的位置才是與最終頂點一一對應的。
最後看一個例子,假設匯入一個人物模型,包含6個部分,軀幹,兩條手臂,兩條腿和頭,那麼根據在建模軟體裡的組織形式不同,content pipeline匯入之後的資料也可能有2種:
RootMC
|
|-----Positions
|
|-----GC_body---VC_body
|-----GC_head---VC_head
|-----GC_LeftHand---VC_LeftHand
|-----GC_RightHand---VC_RightHand
|…………
|………..
或者
RootMC
|
|-----Positions
|
|-----GC_body---VC_body
|
|-------MC_head--------Positions
| |
| |---GC_head---VC_body
|
|-----MC_LeftHand-----------Positions
| |
| |---GC_LeftHand—VC_LeftHand
|…………………..
|……………………
在Creator.com的眾多sample中,dude.fbx是以第一種方式匯出的,而tank.fbx則是第二種。