Matrix SpriteBatch drawcalls是否由XNA挑选?

Matrix SpriteBatch drawcalls是否由XNA挑选?,matrix,xna,zooming,scale,transformation,Matrix,Xna,Zooming,Scale,Transformation,我对XNA有一个非常微妙的问题,特别是SpriteBatch。 在我的游戏中,我有一个摄影课。它可以平移视图(显然),也可以放大和缩小视图。 当我调用spritebatch实例(最后一个参数)的“开始”函数时,我将相机应用于场景 问题:当摄影机Zoomfactor大于1.0f时,spritebatch停止绘制。 我试图调试我的场景,但我找不到出错的地方 我尝试使用“Matrix.CreateScale(2.0f);”作为“Begin”的最后一个参数进行渲染。 所有其他参数都为null,并且第一个

我对XNA有一个非常微妙的问题,特别是SpriteBatch。 在我的游戏中,我有一个摄影课。它可以平移视图(显然),也可以放大和缩小视图。 当我调用spritebatch实例(最后一个参数)的“开始”函数时,我将相机应用于场景

问题:当摄影机Zoomfactor大于1.0f时,spritebatch停止绘制。 我试图调试我的场景,但我找不到出错的地方

我尝试使用“Matrix.CreateScale(2.0f);”作为“Begin”的最后一个参数进行渲染。 所有其他参数都为null,并且第一个参数为“SpriteSortMode.Immediate”,因此没有自定义着色器或其他参数。 但是SpriteBatch仍然不想画画

然后我试着只调用“DrawString”,DrawString在提供的刻度(2.0f)下工作得完美无缺

然而,通过大量的尝试和错误,我发现将ScaleMatrix与“Matrix.CreateTranslation(0,0,-1)”相乘,会以某种方式将“safe”值更改为1.1f。 因此,所有高达1.1f的比例值都有效。对于以上所有内容,SpriteBatch不会在正常的“绘制”调用中渲染单个像素。(抽绳仍然未受影响且正在工作)

为什么会这样? 我没有设置任何视口或其他矩阵。 在我看来,这可能是某种奇怪的近/远剪裁。 但我通常只从3d资料中知道这些参数


如果有任何不清楚的地方,请询问

这是近/远剪裁

您绘制的所有内容都将转换为,然后在投影空间中栅格化。该空间从屏幕左下角的(-1,-1)到右上角的(1,1)。但那只是(X,Y)坐标。在Z坐标中,它从0到1(从前到后)。本卷以外的任何内容都将被剪裁。(参考文献:,)

在3D中工作时,使用的投影矩阵将向下压缩Z坐标,以便近平面在投影空间中位于0,远平面位于1

在2D中工作时,通常会使用
Matrix.CreateOrthographic
,它具有与之完全相同的近平面和远平面参数。只是
SpriteBatch
指定了自己的矩阵,并将近平面和远平面保留为0和1

实际上,
SpriteBatch
中精灵的顶点有一个Z坐标,尽管它通常不使用。它由
layerDepth
参数指定。因此,如果将层深度设置为大于0.5,然后按2放大,则Z坐标将超出0到1的有效范围,并且不会进行渲染

(文档说明0到1是有效范围,但没有指定应用转换矩阵时会发生什么。)

解决方案非常简单:不要缩放Z坐标。使用缩放矩阵,如:

Matrix.CreateScale(2f, 2f, 1f)

这个解决方案非常有效。感谢您的深入解释,这真的很有用!