Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA 3.1具有不同变换矩阵的多个精灵?_C#_Matrix_Xna - Fatal编程技术网

C# XNA 3.1具有不同变换矩阵的多个精灵?

C# XNA 3.1具有不同变换矩阵的多个精灵?,c#,matrix,xna,C#,Matrix,Xna,我有两种类型的对象,一种是二维的,只会像平面图像一样直接面向前方,而另一种是三维的,它会根据不同的旋转进行缩放和倾斜。所以SpriteBatch.Begin将矩阵应用于所有内容,直到我调用End。我在某个地方读到,我应该调用Begin两次,一次用于绘制2D精灵,一次用于绘制3D对象,但我不知道如何更改矩阵以满足每个3D对象的需要,我很难过没有记住链接是什么 因此,我想知道如何在不调用每个对象上的Begin和End的情况下执行此操作,因为这将是灾难性的。正确的解决方案是不要在3D绘图中使用Spri

我有两种类型的对象,一种是二维的,只会像平面图像一样直接面向前方,而另一种是三维的,它会根据不同的旋转进行缩放和倾斜。所以
SpriteBatch.Begin
将矩阵应用于所有内容,直到我调用
End
。我在某个地方读到,我应该调用
Begin
两次,一次用于绘制2D精灵,一次用于绘制3D对象,但我不知道如何更改矩阵以满足每个3D对象的需要,我很难过没有记住链接是什么


因此,我想知道如何在不调用每个对象上的
Begin
End
的情况下执行此操作,因为这将是灾难性的。

正确的解决方案是不要在3D绘图中使用
SpriteBatch
您应该开始使用实际的3D绘图API。

SpriteBatch
只是3D API顶部的一个方便层,用于2D sprite绘图。例如,您可以编写自己的3D版本的
SpriteBatch

SpriteBatch
中,无法为每个批次指定多个变换矩阵。因此,如果必须有多个矩阵,则必须有多个批次(多个开始/结束块)

如果您真的喜欢基于
SpriteBatch
的解决方案,那么就可以这样做,这样您就可以尝试一下,看看性能如何


(你也可以做一个非常难看的破解,替换顶点着色器,以某种方式将3D变换数据打包到每个精灵中,然后在着色器中解包。难看。不要这样做。[编辑:同时覆盖
SpriteBatch
顶点着色器非常困难XNA 4.0之前版本])

为什么在每个对象上调用Begin和End都会带来灾难性后果?我还没有真正尝试过这一点,但在丢失的链接中提供解决方案的人说这是个坏主意。如果我对每个对象都这样做,每次调用Draw方法时,我会调用Begin和End多达400次,这听起来不是很好。调用Begin和End lots会触发很多Draw调用,这很糟糕。尝试并避免OP是正确的。请阅读以了解有关性能的更多信息。