XNA:当前顶点声明不包括当前顶点着色器所需的所有元素。 Normal0缺失

嘿,我有点麻烦。 我已经和xna合作了一段时间,但我对3D完全不熟悉。 我在msdn网站上的winformsgraphicsdevice示例中逐字跟踪代码。 它有一个控件,可以将原始三角形绘制到屏幕上。 很简单,但我在这一行得到一个例外:

GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 1); 

哪个说:

"The current vertex declaration does not include all the elements required by the current vertex shader. Normal0 is missing."

我假设它与我的VertexPositionColor变量vertices 。 那段代码在这里:

 vertices = new VertexPositionColor[3]; vertices[0] = new VertexPositionColor(new Vector3(-1, -1, 0), Color.Black); vertices[1] = new VertexPositionColor(new Vector3( 1, -1, 0), Color.Black); vertices[2] = new VertexPositionColor(new Vector3(0, 1, 0), Color.Black); 

您的顶点着色器要求正常值 (用于光照计算),但VertexPositionColor结构不具备它。

你必须创建一个结构来存储顶点位置,颜色和普通数据,因为它不是XNA上的预构建类型。

您可以在这里学习如何创建它: http : //www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Terrain_lighting.php

在那里,他创建了一个名为VertexPositionColorNormal的结构,使用它代替您当前使用的VertexPositionColor

如果您不想要任何光照并且您没有使用BasicEffect ,只需从您正在使用的技术中删除您的光照变量/计算。 如果您正在使用BasicEffect尝试将LightingEnabledTextureEnabled属性设置为false。

你是如何初始化着色器的? 如果您使用的是BasicEffect,是否将VertexColorEnabled属性设置为true?

错误是说您使用的着色器/效果与您尝试绘制的图元不匹配。 它还告诉您着色器正在尝试查找Normal(用于照明)并且在提供的结构中找不到它(因为您提供的是颜色)。

如果您想要传递照明信息,请参阅此BasicEffect示例以了解如何使用它http://msdn.microsoft.com/en-us/library/bb203926.aspx