如何使用自定义顶点结构创建顶点扣



我有一个顶点结构:

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), VertexDeclaration

我遇到了一个错误,即我的结构"不实现IverTexType接口",那么我该如何实现?还是只是使用此自定义结构的一种更简单的方法?

谢谢!

你快到了。您到达那里的东西看起来有点像XNA 3.1的旧样式。XNA 4.0中改进了此操作的方法 - 请参阅此博客文章。

就像错误所说的那样,您的VertexBuffer需要实现VertexElement(MSDN),这需要您实现此属性。这就是外观:

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,然后将其传递给VertexDeclaration的另一个构造函数。)

您不再需要对CC_11数组的引用 - 您只需将其传递给CC_12的构造函数而忘记它即可。您也不需要跟踪大小,CC_13也会从您的元素数组中计算出来。

最新更新