1

所以我正在做一个项目,我有一个基于 3d 立方体的世界。我让所有这些工作,我正在启动用户界面,当我开始使用 spritebatch 绘制我拥有的光标纹理时,我发现 XNA 并没有正确地分层所有模型,一些模型距离较远的将首先绘制,而不是在模型后面。当我取出所有 spritebatch 代码时,就是这样:

        spriteBatch.Begin();
        cursor.draw(spriteBatch);
        spriteBatch.End();

我发现问题立即得到解决。光标是一个对象,draw方法只是使用spriteBatch.draw();

在我看来,有两种解决方案,我可以找到一种不使用SpriteBatch来绘制光标和其他界面的方法,或者spriteBatch.Begin()我可以插入一个参数来解决问题?我不知道如何做这些,其他人遇到这个问题并且知道如何解决它?

提前致谢。

4

2 回答 2

4

这不回答问题!

我不确定您是否可以(或应该)在没有 spritebatch 的情况下绘制 2D,但是在使用 2D spritebatch 时,我在 3D 模型渲染方面遇到了同样的问题,我在 GameDev上找到的解决方案帮助我解决了这个问题:

您的设备状态可能是错误的。这经常发生在混合 2D 和 3D 时(例如 SpriteBatch.Begin() 的不带参数的重载设置了一些与 3D 渲染不兼容的设备状态。不过不用担心,您所要做的就是确保以下内容设备状态按照您想要的方式设置:

GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;

基本上,您首先调用SpriteBatch2D 绘制的方法,然后调用上述代码(应该确保正确的 3D 渲染),然后绘制 3D 模型。事实上,我只使用了前两行 -BlendState而且DepthStencilState它按应有的方式工作。

于 2012-10-23T21:09:02.943 回答
2

你看过这个超载吗?

您可以使用最后一个参数 layerDepth 来控制精灵的绘制顺序。如果您使用它,请务必检查sprite 排序模式(在 SpriteBatch.Begin(...) 调用中)。这是否涵盖了您需要做的事情?

编辑:另请注意,这意味着使用正确的透视矩阵,以 2D 绘制(我假设您希望光标在其他所有内容之上以 2D 显示),以及所有 3D 内容之后(很可能在例如,Z=0,使前面的物体阻挡精灵)。

于 2012-10-23T17:12:50.710 回答