所有初始化工作现在已经就绪,我们可以在屏幕中绘制正方形了。由于只使用了顶点颜色而没有应用纹理,所以在LoadContent函数中无需加载任何内容,在这里将其留空。由于目前无需更新任何内容,所以我们直接来讨论Draw函数。
像在使用精灵时一样将屏幕清空(同样使用CornflowerBlue色),不过这次所采用的绘图方法则完全不同。需要使用之前创建的BasicEffect而非SpriteBatch对象来管理图形的绘制。
每种效果都可以包含一种或多种技术(technique)。它们是包含在效果之中具体的渲染操作方法——效果可以看做是这些技术的容器。Windows Phone 7版本的XNA中每种效果都包含一种技术,因此我们无需过多地关注。这里使用了效果提供的默认技术。
最后,每种技术都包含一个或多个通道(pass),负责实际的画面渲染。如果效果的渲染需要对画面中的内容进行多重更新,则会对从技术中返回多个通道分别进行绘制。虽然BasicEffect只使用了一个通道,但是这种形式非常好,我们可以通过代码来遍历从效果返回的所有可能的通道,以减少在使用多通道效果时所产生的困惑。
牢记以上内容,渲染正方形所需的代码如代码清单6-7中所示。一旦通道确定后,就会调用它的Apply方法通知XNA来将其激活。然后,该代码调用了DrawUserPrimitives函数,告诉XNA正在渲染的基元类型,并传递待绘制内容的各种详细信息。DrawUserPrimitives函数的参数如下所示:
1)primitiveType包含了待绘制基元的类型。在本例中,我们绘制的是TriangleStrip。所有可用的基元将在下一节中详细讨论。
2)vertexData允许我们传递自己定义的顶点数组。
3)vertexOffset使用此值,可以从数组中的某一位置来获取顶点信息而非从数组首元素开始。由于我们没有使用此值,所以传入了0。
4)primitiveCount是正在绘制的基元数目。由于我们指定XNA绘制的是三角形,因此将此值设置为2表明绘制2个三角形。记住它是用来为基元计数的,而不是顶点。Draw函数的代码如代码清单6–7所示。
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
foreach (EffectPass pass in _effect.CurrentTechnique.Passes)
{
// Apply the pass
pass.Apply();
// Draw the square
GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, _vertices, 0, 2);
}
base.Draw(gameTime);
}
注意XNA对正方形内颜色渲染的处理方式。每个顶点的颜色都完全符合要求,但在不同颜色之间XNA进行了平滑的淡入淡出处理。这被称为颜色插值,很快你就会再次看到这个概念:任何顶点参数,比如不同顶点间的颜色,在XNA进行渲染时都会使用这种淡入淡出的效果。这非常有用而且极富吸引力,正如本例中所示。