【问题标题】:What's wrong with my XNA cube?我的 XNA 立方体有什么问题?
【发布时间】:2014-02-25 03:23:40
【问题描述】:

我正在关注this sample,试图在此基础上进行构建。我将代码合并到我的解决方案中,这是一个 Windows 窗体应用程序(使用 XNA 有点棘手)。

当我最终得到一个立方体来绘制它时,它最终是由内向外……或由外向内……还是?自己看吧。

这个应用程序现在有几千行,所以我不能在这里粘贴它。我需要知道从哪里开始寻找。

知道这里有什么问题吗?

看起来两边都乱了套……但这应该没关系。图形引擎应该确定什么是可见的,什么是不可见的,但它似乎弄错了。

提前致谢。

【问题讨论】:

  • 旋转后会是什么样子?
  • 后面好像画了两条边。例如,在我附加的立方体中,当它们应该最后绘制时,首先绘制右侧和底部。我不认为他们失踪了。从任何角度来看都是如此。
  • 我以前见过这个..我不记得它叫什么..但它与您的视口有多远及其投影有关。有一个最小距离之类的……虽然我不记得是什么了! (而 Google 没有提供帮助……)
  • 我认为你是对的。那是来自不同解决方案的代码的一部分。我会尝试一些不同的设置,看看是否有什么点击。感谢您的提示。

标签: c# winforms 3d xna


【解决方案1】:

有一个名为 GraphicsDevice 的 XNA 框架类,它包含基本渲染参数的所有属性。

GraphicsDevice内部有一个成员结构DepthStencilState,需要配置如下属性:

  • DepthBufferEnable=true
  • DepthBufferFunction=LessThanEqual
  • DepthBufferWriteEnable=true

最简单的方法是简单地将其设置为静态定义的默认值。

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

如果您仍然遇到问题,请确保您要渲染到的 RenderTarget 是支持深度的纹理。示例:

finalFrameRT = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, false, SurfaceFormat.Color, DepthFormat.Depth24Stencil8, 0, RenderTargetUsage.PreserveContents);

如果您不希望看到背面的背面,则需要根据顶点索引的顺序将RasterizerState 设置为 CullClockwise 或 CullCounterClockwise。

【讨论】:

  • DepthStencilState.Default 工作!谢谢@selkathguy
【解决方案2】:

这种机制称为“背面剔除”,这意味着不会绘制顶点逆时针排列的形状。您可以通过运行以下代码来取消此操作:

RasterizerState rs = new RasterizerState();  
rs.CullMode = CullMode.None;  
GraphicsDevice.RasterizerState = rs; 

但是,这不是推荐的方法,因为它通常会导致图形设备绘制用户看不到的形状。正确的做法是更改生成顶点的代码以按顺时针顺序创建它们。

【讨论】:

  • 对象应该相对于透视图顺时针绘制还是0,0,0?
  • 观点,我相信。
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多