如何在XNA中不使用SpriteBatch绘制纹理?

时间:2012-10-23 17:06:31

标签: c# xna

所以我正在开发一个项目,我有一个基于3D立方体的世界。我得到了所有这些,我正在启动用户界面,当我开始使用spritebatch绘制我拥有的光标纹理时,我发现XNA没有正确地对所有模型进行分层,一些模型将进一步拉开,而不是模型的背后。当我拿出所有的spritebatch代码时,就是这样:

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

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

我看到它的方式,有两个解决方案,我可以找到一种方法来绘制我的光标和其他接口而不使用 SpriteBatch ,或者spriteBatch.Begin()中可能有一个参数我可以插上来修复这个问题?我不确定如何做其中任何一个,其他人遇到这个问题并知道如何解决它?

提前致谢。

2 个答案:

答案 0 :(得分:4)

这不回答问题!

我不确定你是否可以(或应该)在没有spritebatch的情况下绘制2D,但是在使用2D spritebatch时我遇到了与3D模型渲染相同的问题,solution on solution I've found on GameDev帮我解决了这个问题:

  

您的设备状态可能有误。这通常在混合时发生   2D和3D(例如SpriteBatch.Begin()的重载   不接受任何参数设置一些与之不兼容的设备状态   3D渲染。不用担心,你所要做的就是确保   以下设备状态按您希望的方式设置:

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

基本上,您首先调用SpriteBatch方法进行2D绘制,然后调用上面的代码(应确保正确的3D渲染),然后绘制3D模型。事实上,我只使用了前两行 - BlendStateDepthStencilState,它可以正常工作。

答案 1 :(得分:2)

您是否看过this overload?

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

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