Matrix SpriteBatch drawcalls是否由XNA挑选?
我对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资料中知道这些参数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,并且第一个
如果有任何不清楚的地方,请询问 这是近/远剪裁 您绘制的所有内容都将转换为,然后在投影空间中栅格化。该空间从屏幕左下角的(-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)
这个解决方案非常有效。感谢您的深入解释,这真的很有用!