C#でツールを作る その11 -AttributeBuffer-

1つのMesh内に複数のMaterialが存在するとき、AttributeBufferを使うと便利です。


サンプル

AttributeBuffe

  • 各FaceにMaterial番号を設定して、Meshを最適化する
  • 隣接性情報:Adjacency
    • 各Faceに隣接するFace番号
Mesh mesh = new Mesh( Face数, Vertex数, MeshFlags.SystemMemory, CustomVertex.PositionNormal.Format, device );

mesh.VertexBuffer.SetData( Vertex配列, 0, LockFlags.None );
mesh.IndexBuffer.SetData( Index配列, 0, LockFlags.None );

//AttributeBufferを取得して、各Faceの頂点番号を設定する
int[] attr = mesh.LockAttributeBufferArray( LockFlags.None );
//attr[ Face番号 ] = Material番号
attr[ 0 ] = 0;
attr[ 1 ] = 2;
attr[ 2 ] = 0;
attr[ 3 ] = 1;
attr[ 4 ] = 2;
/*...*/
mesh.UnlockAttributeBuffer( attr );

//隣接性情報を生成し、Meshを最適化する
//上記の{ 0, 2, 0, 1, 2, ... }が{ 0, 0, 1, 2, 2, ... }のようになる
int[] adj = new int[ mesh.NumberFaces * 3 ];   //Face数*3
mesh.GenerateAdjacency( float.Epsilon, adj );
mesh.OptimizeInPlace( MeshFlags.OptimizeAttributeSort, adj );

マテリアル配列

private Material[] material = null;

material = new Material[ 3 ];
material[ 0 ].Diffuse = Color.Red;
material[ 0 ].Ambient = material[ 0 ].Diffuse;
material[ 1 ].Diffuse = Color.FromArgb( 0x00, 0xff, 0x00 );
material[ 1 ].Ambient = material[ 1 ].Diffuse;
material[ 2 ].Diffuse = Color.Blue;
material[ 2 ].Ambient = material[ 2 ].Diffuse;

描画

  • Materialに対応するSubsetを描画する
for( int i = 0; i < material.Length; i ++ )
{
    device.Material = material[ i ];
    cube.DrawSubset( i );
}