XNA for WP7游戏:DrawUserIndexedPrimitives

我试图通过绘制包含线条的模型在XNA中制作3D WP7游戏,使用DrawUserIndexedPrimitives这一切都工作正常,但现在我想给每个模型自己的旋转。 目前我正在使用BasicEffect绘制所有模型。 我可以设置它的旋转,但是所有的对象都会有相同的旋转。 有没有办法为每个对象设置不同的旋转角度? 目前我已经想出了一些我可以使用的解决方案,但是我对其中的任何一个都不满意:

  • 为每个对象创建一个新的BasicEffect,使用它自己的World,然后遍历所有对象以获得其基本效果并绘制它 - 我想所有这些BasicEffects都会产生很多开销,楷模。
  • 自己计算点数(即计算旋转并将这些值传递给DrawUserIndexedPrimitives方法) - 这是相当昂贵的计算,拖慢了性能。
  • 有没有建议的路线可以带到这里?

    我不知道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

    上一篇: XNA for WP7 game: DrawUserIndexedPrimitives

    下一篇: WP7 XNA Game 'stutters' when music repeats