【问题标题】:XNA: Adding a Nuclex Screen to GuiManager.screen breaks 3d renderingXNA:将 Nuclex 屏幕添加到 GuiManager.screen 会中断 3d 渲染
【发布时间】:2012-09-28 16:57:05
【问题描述】:

我正在尝试设置一个极其简单的 XNA 游戏,上面有 3d 地形和一些 2d GUI 对象。我选择 Nuclex 是因为它似乎是少数几个目前活跃的 2d GUI 之一。

我的问题:在我的游戏中添加一个 Nuclex“屏幕”类会导致 3d 地形和在其上绘制的线条搞砸了——我有三层 3d 对象:地形、地形的线框轮廓和一些拥抱地形的“路线”。添加屏幕后,部分淹没在地形中的路线会完全显示在地形之上,并且线框网格会显得更粗。

这是我的 Game.Initialize 方法的结尾,按照 Nuclex GuiManager 页面上的示例制作:

    InputManager im = new InputManager();

    IGraphicsDeviceService igds = Nuclex.Graphics.GraphicsDeviceServiceHelper.MakeDummyGraphicsDeviceService(GraphicsDevice); 
    gui = new GuiManager(igds, im);
    gui.Initialize();

    Viewport vp = GraphicsDevice.Viewport; 
    Screen main_screen = new Screen(vp.Width, vp.Height);
    //main_screen.
    this.gui.Screen = main_screen; 
    main_screen.Desktop.Bounds = new UniRectangle(
        new UniScalar(0.1f, 0.0f), new UniScalar(0.1f, 0.0f), // x and y
        new UniScalar(0.8f, 0.0f), new UniScalar(0.8f, 0.0f) // width and height
    );

    LabelControl text = new LabelControl("hello");
    text.Bounds = new UniRectangle(10, 10, 200, 30);

    main_screen.Desktop.Children.Add(text);

    Components.Add(gui);

    base.Initialize();

那么,关于我做错了什么有什么想法吗?

谢谢!

【问题讨论】:

  • 会不会是 Nuclex 搞乱了你在 Render 上的渲染状态?也许确保在渲染 GUI 之前保存状态,然后在之后恢复它们?
  • 根据文档,为了进行渲染,应将 Nuclex 添加到游戏的组件中(在 Components.Add(gui) 处)——这样我就无法处理绘图命令。你是对的,它几乎肯定会弄乱传递给它的 graphicsDevice 的设置。但是,如果我删除 Components.Add 行并在我的 Game.Draw 函数中手动调用 gui.Draw,即使我将 gui.Draw 调用放在 after 所有其他元素已绘制完毕。

标签: c# xna xna-4.0


【解决方案1】:

好的,多亏了 catflier 为我指出了渲染状态的方向,我解决了这个问题: * 首先,“RenderState”是一个 XNA3 术语; XNA4 只允许在 GraphicsDevice 对象上直接使用一些状态标志。 * 问题是 Nuclex 偷偷设置 GraphicsDevice.DepthStencilState 并留下它,而不是在使用后将其恢复到以前的值(淘气!!)。 * 所以解决方案是,在 Draw 方法的顶部,像这样添加一行:

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

【讨论】:

  • 很高兴知道它有效,理想情况下,您也应该为 GraphicsDevice.BlendState 和 GraphicsDevice.RasterizerState 这样做,以确保。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
相关资源
最近更新 更多