Issue with VertexBuffer.SetData

Huh, that is very interesting. After posting, I tracked down the VertexDeclaration for the vertices, and it was

private static VertexElement[] GenerateVertexElements()
        {
            VertexElement[] decl = new VertexElement[]
                {
                    // Construct new vertex declaration with tangent info
                    // First the normal stuff (we should already have that)
                    new VertexElement(0, VertexElementFormat.Vector3,
                        VertexElementUsage.Position, 0),
                    new VertexElement(0, VertexElementFormat.Vector2,
                        VertexElementUsage.TextureCoordinate, 0),
                    new VertexElement(0, VertexElementFormat.Vector3,
                        VertexElementUsage.Normal, 0),
                    // And now the tangent
                    new VertexElement(0, VertexElementFormat.Vector3,
                        VertexElementUsage.Tangent, 0),
                };
            return decl;
        }

Notice that all of the elements have an offset of 0?

Changing this to:

private static VertexElement[] GenerateVertexElements()
        {
            VertexElement[] decl = new VertexElement[]
                {
                    // Construct new vertex declaration with tangent info
                    // First the normal stuff (we should already have that)
                    new VertexElement(0, VertexElementFormat.Vector3,
                        VertexElementUsage.Position, 0),
                    new VertexElement(sizeof(float)*3, VertexElementFormat.Vector2,
                        VertexElementUsage.TextureCoordinate, 0),
                    new VertexElement(sizeof(float)*5, VertexElementFormat.Vector3,
                        VertexElementUsage.Normal, 0),
                    // And now the tangent
                    new VertexElement(sizeof(float)*8, VertexElementFormat.Vector3,
                        VertexElementUsage.Tangent, 0),
                };
            return decl;
        }

allowed it to work. Now, I have a whole other issue, but I will hopefully track that down soon.

Why would this have worked on XNA but not MonoGame? It seems that MonoGame likely has the correct behavior, but I know that this game did indeed work on XNA.

2 Likes