XNA:当前顶点声明不包括当前顶点着色器所需的所有元素.Normal0不见了

本文关键字:顶点 元素 不见 Normal0 声明 不包括 XNA | 更新日期: 2023-09-27 18:24:16

嘿,我有点麻烦。我使用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);

XNA:当前顶点声明不包括当前顶点着色器所需的所有元素.Normal0不见了

顶点着色器需要法线值(用于照明计算),但VertexPositionColor结构没有。

您必须创建一个用于存储顶点位置、颜色和法线数据的结构,因为它不是XNA上的预构建类型。

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

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

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

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

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

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