Model Processing with the XNA Framework Content Pipeline
Describes the model conversion process implemented by XNA Framework Content Pipeline.
The conversion of a game asset in your project is a complex and detailed process comprised of many steps. The detailed description of the general process can be found here. However, it can also be helpful to follow the process from the perspective of a single game asset type—specifically, a model. This discussion focuses on one section (a horizontal cross-section, starting with the top asset group) of the Content DOM graphic, shown here.
Output from the Content Importer
The content pipeline content DOM represents an exported scene (from a modeling package) as a hierarchy of NodeContent objects. This means that a content importer designed to import a 3D scene or model must convert a 3D file into a NodeContent hierarchy containing a parent, a transform, and a collection of children. Some of these nodes will be of type MeshContent, derived from NodeContent. They represent the 3D objects in the scene with a mesh of triangles.
在XNA中,importer將art asset檔案轉成一個由NodeContent組成的階層。其實就是一個有節點群組成的層級結構,和Ogre的現實對象組織方式一致。這個節點包括父節點和自己點等資訊。
A MeshContent object is composed of a collection of GeometryContent objects. All triangles within a GeometryContent object have the same material applied to them. Their vertices contain the same type of per-vertex data, such as normals and texture coordinates. Since each GeometryContent collection is contained by a single MeshContent object, they share the same world transform.
1.MeshContent由GeometryContent組成。也很好理解,就是網格內容有幾何內容組成。
2.所有的幾何圖形都可以由若干三角形來組成。
3.屬於同一個MeshContent的GeometryContent都有同樣的world transform。
Each GeometryContent object contains a VertexContent object (storing the values of all per-vertex data channels, and also indices into the shared Positions collection in the parent MeshContent) and an IndexCollection Class, containing indices into the VertexContent object.
The content pipeline content DOM represents a model material by the MaterialContent class. MaterialContent has two derived classes often used by the content pipeline: BasicMaterialContent and EffectContent. Think of BasicMaterialContent as the content pipeline equivalent of BasicEffect. In the same vein, EffectContent is the content pipeline equivalent of Effect.
詳細解釋了GeometryContent的組成。以後根據需要在學習好了。
可以看出來,通過importer處理之後,一個art asset從檔案轉換成了一組XNA可以處理的對象,例如,一個model檔案會被組織成一組層級結構的NodeContent對象。這組對象將由processor進行處理。
Output from the Model Processor
The scene hierarchy (previously created by the content importer) is the input of the model processor (implemented by ModelProcessor) and is converted into a format usable by your game at run time. Optimization, such as reordering mesh triangles to maximize cache coherency, is also performed at this time. The conversion of content importer output to a run-time type or types, is the main goal of the model processor.
processor的主要目的就是將importer的輸出轉換成運行時的type。這裡面會進行一些最佳化過程。
The types output by ModelProcessor are close to the final XNA Framework run-time types. For example, the ModelProcessor output type ModelContent corresponds to the XNA Framework run-time type Model Class. This class is similar to the run-time type but stores the model data as simple managed objects, rather than GPU data types. This approach avoids the instantiation of actual GPU objects during the XNA Game Studio Content Pipeline build process.
注意,processor處理後的輸出並不似乎GPU可以處理的對象。因為XNA需要支援跨平台的開發,這裡面就包括了XBox平台。
This is essential when building graphics for the Xbox 360 platform because instantiation of these types on the Windows GPU during the build process would not be feasible.
如果直接轉換成GPU可以讀取的對象,那麼在XBox上就沒法訪問他們了。因為XBox沒有GPU來讀取。
Conversion of the scene hierarchy is broken down as follows:
The entire scene hierarchy, represented by a root NodeContent and its children, is converted to a ModelContent object.
在這個例子中,一個model的載入和處理過程如下:
1.Importer ->NodeContent
2.Processor -> ModelContent
| Note |
| Children of type NodeContent are turned into ModelBoneContent Class objects, and children of type MeshContent are turned into ModelMeshContent objects. |
All GeometryContent objects, containing the actual triangles, are converted to ModelMeshPart objects. As mentioned previously, a GeometryContent object contains a VertexContent, IndexCollection, and MaterialContent object. Although the ModelProcessor modifies the data in the IndexCollections, it does not change the type. The VertexContent object, received as input, has two corresponding output types: a VertexBufferContent Class, containing the optimized triangle data, and an array of VertexElement Structure objects, specifying the data contained in the VertexBufferContent Class.
The last step hands off any MaterialContent objects in the scene by chaining to the MaterialProcessor.