我有一个顶点结构:
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接口”,那么我该如何实现呢?或者是否有一种更简单的方法来使用这个自定义结构?
谢谢!
答案 0 :(得分:3)
你快到了。你有什么看起来有点像XNA 3.1的旧风格。在XNA 4.0中改进了这种方法 - see this blog post。
正如错误所述,您的VertexMultitextured
需要实施IVertexType
(MSDN),这需要您实施this property。这就是看起来的样子:
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
将从您的元素数组中计算它。