【问题标题】:How can I draw a Texture without using SpriteBatch in XNA?如何在 XNA 中不使用 SpriteBatch 绘制纹理?
【发布时间】:2012-10-23 17:06:30
【问题描述】:

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

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

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

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

提前致谢。

【问题讨论】:

  • 我不肯定,但你不能只启用普通鼠标光标,然后如果你想改变它的外观,我认为有 Windows api 调用可以做到这一点。但我不确定。
  • 我只是使用鼠标启动,稍后我将添加一些HUD用于游戏。因此,如果我找到了一种在保持模型正确绘制的同时绘制鼠标的方法,那么我可以继续使用界面。

标签: c# xna


【解决方案1】:

这不能回答问题!

我不确定您是否可以(或应该)在没有 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 并且它可以正常工作。

【讨论】:

    【解决方案2】:

    你看过this overload?

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 2014-05-10
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多