Model Processing with the XNA Framework Content Pipeline

XNA Game Studio 3.0
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.

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.

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.

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.

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. 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.

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.

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.

Community Additions