XNA 4.0自定义顶点声明

3

我目前正在尝试制作自定义顶点声明。

其中位置、颜色和整数被传递到效果中。我遇到了问题,无法确定传递整数时应使用哪个 VertexElementUsage 枚举,并且在声明 VertexElements 时如何确定偏移量?

public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration
{
    new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
    new VertexElement(12, VertexElementFormat.Color, VertexElementUsage.Color, 0),
    new VertexElement(?, VertexElementFormat.Byte4, ?, 0)
};

(请注意最后一个VertexElement中的?)
1个回答

3

它的大小将是Vector2的大小加上颜色的大小。 基本上可以这样想,
在普通数组中,只有一种类型的对象,因此知道要跳多少才能到达下一个项目。
这里不同,因为它们都有不同的大小。
使用sizeof()就可以了,所以它会像这样:

public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration
{
    new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
    new VertexElement(sizeof(Vector3), VertexElementFormat.Color, VertexElementUsage.Color, 0),
    new VertexElement(sizeof(Vector3)+sizeof(Color), VertexElementFormat.Byte4, ?, 0)
};

或类似的。

否则,您可以找到颜色对象的大小,并将其添加到Vector3对象的大小中(这将是偏移量)。


顶点元素用途是什么? - William
在你的HLSL效果中,数据可以通过你所说的用法进行访问。 - user1241335
例如,VertexElementUsage.Position 表示您可以通过 "POSITION0"(或类似的方式,我不太使用 HLSL,但这就是使用部分的全部意义)从您的效果中获取其中包含的数据。 - user1241335
sizeof 对我来说行不通:"'Microsoft.Xna.Framework.Vector3' 没有预定义的大小,因此 sizeof 只能在不安全的上下文中使用(考虑使用 System.Runtime.InteropServices.Marshal.SizeOf)"。 - lampak
@lampak 首先,sizeof() 与 Vector3 完美地配合使用,正如 OP 接受答案所示(它有效)。其次,请注意此线程已有两个月之久。Marshal.SizeOf() 是一个不错的 .NET 解决方案,但速度较慢。如果 sizeof() 最终出现问题,或者 OP 表示 sizeof() 存在问题,我会建议使用 Marshal.SizeOf()。在大多数情况下,sizeof() 的使用是可以接受的,速度更快,而且经过时间的考验。sizeof() 在 C 中就已经存在,并且仍然以类似的方式工作。它只是计算每个 Vector3 组件的大小,以获取该对象的大小。 - user1241335

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接