本文介绍了DrawUserPrimitives 无效操作异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 XNA 中使用此代码绘制一个三角形:

I'm trying to draw a triangle using this code in XNA:

VertexPositionColor[] vertices = new VertexPositionColor[3];
vertices[0].Position = new Vector3(-0.5f, -0.5f, 0f);
vertices[0].Color = Color.Red;
vertices[1].Position = new Vector3(0, 0.5f, 0f);
vertices[1].Color = Color.Green;
vertices[2].Position = new Vector3(0.5f, -0.5f, 0f);
vertices[2].Color = Color.Yellow;
GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, vertices, 0, 1);

但是,一旦我运行它,应用程序就会关闭,并抛出 InvalidOperationException.这是WP7应用程序.我错过了什么吗?提前感谢您的帮助.

However, as soon as I run it, application closes, and InvalidOperationException is thrown. It's WP7 application. Am I missing something? Thanks for your help in advance.

推荐答案

文档DrawUserPrimitives 在以下情况下抛出 InvalidOperationException:

The documentation says that DrawUserPrimitives throws InvalidOperationException when:

在调用 DrawUserPrimitives 之前未设置有效的顶点着色器和像素着色器.在执行任何绘制操作之前,必须在设备上设置有效的顶点着色器和像素着色器(或有效的效果).

(它还说如果你的顶点无效,它会抛出 - 但对我来说它们看起来没问题.)

(It also says it will throw if your vertices are invalid - but they look ok to me.)

您需要在图形设备上设置Effect.具体来说,您需要在调用 DrawUserPrimitives 之前调用 EffectPass.Apply.一个简单的方法是使用 BasicEffect.下面是一些代码,适合放在 Draw 方法中,以说明这一点:

You need to set an Effect on the graphics device. Specifically you need to call EffectPass.Apply before you call DrawUserPrimitives. An easy way to start is with BasicEffect. Here is some code, suitable to put in the Draw method, to illustrate this:

// These three lines are required if you use SpriteBatch, to reset the states that it sets
GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;

// Transform your model to place it somewhere in the world
basicEffect.World = Matrix.CreateRotationZ(MathHelper.PiOver4) * Matrix.CreateTranslation(0.5f, 0, 0); // for sake of example
//basicEffect.World = Matrix.Identity; // Use this to leave your model at the origin
// Transform the entire world around (effectively: place the camera)
basicEffect.View = Matrix.CreateLookAt(new Vector3(0, 0, -3), Vector3.Zero, Vector3.Up);
// Specify how 3D points are projected/transformed onto the 2D screen
basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45),
        (float)GraphicsDevice.Viewport.Width / (float)GraphicsDevice.Viewport.Height, 1.0f, 100.0f);

// Tell BasicEffect to make use of your vertex colors
basicEffect.VertexColorEnabled = true;
// I'm setting this so that *both* sides of your triangle are drawn
// (so it won't be back-face culled if you move it, or the camera around behind it)
GraphicsDevice.RasterizerState = RasterizerState.CullNone;

// Render with a BasicEffect that was created in LoadContent
// (BasicEffect only has one pass - but effects in general can have many rendering passes)
foreach(EffectPass pass in basicEffect.CurrentTechnique.Passes)
{
    // This is the all-important line that sets the effect, and all of its settings, on the graphics device
    pass.Apply();

    // Here's your code:
    VertexPositionColor[] vertices = new VertexPositionColor[3];
    vertices[0].Position = new Vector3(-0.5f, -0.5f, 0f);
    vertices[0].Color = Color.Red;
    vertices[1].Position = new Vector3(0, 0.5f, 0f);
    vertices[1].Color = Color.Green;
    vertices[2].Position = new Vector3(0.5f, -0.5f, 0f);
    vertices[2].Color = Color.Yellow;
    GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, vertices, 0, 1);
}

这篇关于DrawUserPrimitives 无效操作异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-25 09:31