C#でツールを作る その11 -AttributeBuffer-
1つのMesh内に複数のMaterialが存在するとき、AttributeBufferを使うと便利です。
サンプル
- tool11.zip
- VC#2008EE用
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 ); }