我的XNA立方体出了什么问题?

时间:2014-02-25 03:23:41

标签: c# winforms 3d xna

我正在关注this sample尝试构建它。我将代码合并到我的解决方案中,这是一个Windows窗体应用程序(有点棘手w / XNA)。

当我最终得到一个立方体来绘制它最终在里面外面...或者外面...或者?亲眼看看。

该应用程序现在已有几千行,所以我无法将其粘贴到此处。我需要知道从哪里开始寻找。

知道这里有什么问题吗?

看起来双方的情况正在逐渐消失......但这应该不重要。图形引擎应该确定哪些是可见的,什么是不可见的,但它似乎是错误的。

broken box

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

在GraphicsDevice内部有一个成员struct DepthStencilState,需要配置以下属性:

  • DepthBufferEnable =真
  • DepthBufferFunction = LessThanEqual
  • DepthBufferWriteEnable =真

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

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。

答案 1 :(得分:1)

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

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

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