1

私は頂点構造を持っています:

public struct VertexMultitextured
{
    public Vector3 Position;
    public Vector3 Normal;
    public Vector4 TextureCoordinate;
    public Vector4 TexWeights;

    public static int SizeInBytes = (3 + 3 + 4 + 4) * sizeof(float);
    public static VertexElement[] VertexElements = new VertexElement[]
 {
     new VertexElement( 0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0 ),
     new VertexElement( sizeof(float) * 3, VertexElementFormat.Vector3, VertexElementUsage.Normal, 0 ),
     new VertexElement( sizeof(float) * 6, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 0 ),
     new VertexElement( sizeof(float) * 10, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 1 ),
 };
}

それを使ったを作りたいVertexBufferです。この行を使用する場合:

terrainVertexBuffer = new VertexBuffer(device, typeof(VertexMultitextured), vertices.Length, BufferUsage.WriteOnly);

構造が「IVertexTypeインターフェースを実装していない」というエラーが表示されます。それを実装するにはどうすればよいですか?または、このカスタム構造体を使用する簡単な方法はありますか?

ありがとう!

4

1 に答える 1

3

もうすぐです。そこにあるものは、XNA3.1の古いスタイルに少し似ています。これを行う方法はXNA4.0で改善されました-このブログ投稿を参照してください

エラーが示すように、VertexMultitextured実装する必要がありますIVertexTypeMSDN)。これには、このプロパティを実装する必要があります。これは次のようになります。

public struct VertexMultitextured : IVertexType
{
    // ... all your data members ...

    static readonly VertexDeclaration MyVertexDeclaration
            = new VertexDeclaration(new VertexElement[] {
                // ... your vertex element array ...
            });

    public VertexDeclaration VertexDeclaration
    {
        get { return MyVertexDeclaration; }
    }
}

(インターフェースを実装する代わりに、VertexDeclarationどこでも作成し、それを他のコンストラクターに渡すこともできますVertexBuffer。)

配列への参照を保持する必要はもうありません。VertexElement配列のコンストラクターに渡すだけでVertexDeclaration、忘れることができます。サイズを追跡する必要もありませんVertexDeclaration。要素の配列からサイズを計算します。

于 2012-10-19T06:33:09.193 に答える