XNA for WP7游戏:DrawUserIndexedPrimitives
我试图通过绘制包含线条的模型在XNA中制作3D WP7游戏,使用DrawUserIndexedPrimitives这一切都工作正常,但现在我想给每个模型自己的旋转。 目前我正在使用BasicEffect绘制所有模型。 我可以设置它的旋转,但是所有的对象都会有相同的旋转。 有没有办法为每个对象设置不同的旋转角度? 目前我已经想出了一些我可以使用的解决方案,但是我对其中的任何一个都不满意:
有没有建议的路线可以带到这里?
我不知道DrawUserIndexedPrimitives是否是最好的使用方法,我只想绘制线条并给它们旋转。 如果有更好的方法来做到这一点,请告诉我:)
我目前的解决方案
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
foreach (var model in _models)
{
foreach (var pass in model.Effect.CurrentTechnique.Passes)
{
pass.Apply();
model.Effect.World = _model.GetWorld();
var points = model.GetPoints();
GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.LineList, points, 0, points.Length, model.Lines, 0, model.Lines.Length / 2);
_models[0].Draw(GraphicsDevice);
}
}
base.Draw(gameTime);
}
model.GetWorld()返回一个矩阵,其中包含对象的旋转,平移和缩放,model.GetPoints()包含点和模型的列表.Lines是一个列表,其中包含连接点的索引
您通常只需要任何类型的效果之一(如BasicEffect)。 原因是因为效果由两个主要部分组成:为GPU编写的代码(光照等)以及它暴露的参数(如Effect.World,世界矩阵)。 因为每次都是相同的,所以编译GPU代码不会有太多的意义,所以我们唯一需要考虑的就是参数。
注意调用pass.Apply()。 实际做的是每次在绘制之前将所有在效果上设置的参数上传到GPU。 希望应该告诉你的是,你应该能够在每次绘制之前在单个效果上设置旋转并调用Apply,而不是通过单独设置旋转来创建一组效果。 而且,设置Effect.World实际上应该在pass.Apply()之前。
要回答第二个要点,你是完全正确的。 GPU被做成具有大量并行性的点,所以最好不要自己尝试,因为它会很慢。
至于DrawUserIndexedPrimitives,我不是图形爱好者,但通常这个调用是为顶点不断变化的情况保留的(比如柔体或Blob),基本上无法通过翻译来描述网格,旋转和尺度。 GPU公开了称为VertexBuffer的特殊原语,其全部目标是在GPU内存中存储一堆点(这使得它们非常快速地访问)。 从那里开始,如果你想要移动它,GPU将会转换每一点(但是要注意,你需要通过的就是翻译,旋转和缩放以及它的好处)。 使用DrawUserIndexedPrimitives实际上必须将所有点发送到GPU每帧,这是较慢(多少,谁知道没有测试这些天)。
幸运的是,显卡实际上实现了一种称为“线框”的特殊绘图模式,而不是绘制三角形,而是将三角形的边缘绘制为线条。 要设置线框模式,请在调用Draw之前执行此操作:
this.GraphicsDevice.RasterizerState.FillMode = FillMode.WireFrame;
现在就应用自己的旋转而言,您实际需要做的就是将世界矩阵乘以旋转矩阵(使用类似Matrix.CreateRotationX(yourAngle)的东西)。
你目前的解决方案没问题,但我会在pass之前做全球分配.Apply()
如果你有几个模型,你可以传递给着色器和变换阵列,并添加到你的顶点结构中一个索引到这个数组。
这样你就可以一次画出你的所有模型。
链接地址: http://www.djcxy.com/p/22769.html