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

您快到了。你所拥有的看起来有点像 XNA 3.1 的旧风格。XNA 4.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 回答