是否由XNA剔除了SpriteBatch的调用?

时间:2011-08-16 21:48:18

标签: matrix xna zoom scale transformation

我对XNA有一个非常微妙的问题,特别是SpriteBatch。 在我的游戏中,我有一个Camera类。它可以翻译视图(显然),也可以放大和缩小。 当我调用我的spritebatch实例(最后一个参数)的“Begin”功能时,我将Camera应用到场景中。

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

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

然后我尝试只调用“DrawString”,DrawString使用提供的比例(2.0f)完美地工作。

然而,通过大量的反复试验,我发现将ScaleMatrix与“Matrix.CreateTranslation(0,0,-1)”相乘也不知何故将“安全”值更改为1.1f。 所以所有Scale值都高达1.1f。对于上面的所有内容,SpriteBatch不会在正常的“Draw”调用中渲染单个像素。 (DrawString仍未受影响且正常工作)。

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

如果有什么不清楚请询问!

1 个答案:

答案 0 :(得分:2)

它是近/远剪辑。

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

当你在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)