0

我无法解决我在 DirectX 9 应用程序中看到的错误。我正在使用顶点缓冲区渲染一个三角形列表,没有剔除(无论哪种方式都显示错误)。当我从某个方向查看渲染的三角形条时,条的底部(最远的部分)将穿过应该在其上方的部分。用语言解释有点困难,所以我会尝试通过图像来展示正在发生的事情。

预期图纸

以上是我希望看到的,圆锥的尖端渲染在黑色底座之上。朝这个方向看时它起作用。

为什么底部在圆锥体上绘制!?

以上是我从不好的方向看它时得到的。注意黑色底座是如何在圆锥体中间绘制的。这太可怕了,根本不是我想要发生的。

在此处输入图像描述

有趣的是,如果你走到另一边并朝不好的方向看,它是在底座上方绘制的圆锥体,而底座应该是绘制的(如上所示)。如果使用反向剔除(逆时针),则看不到这一点。我希望这可以为有更多经验的人提供一些帮助,以找出问题所在。

无论如何,我什至不知道从哪里开始跟踪这个错误,因为我对 DirectX 还很陌生。我想可能有几个原因:

  • 深度缓冲区太不精确
  • 我没有正确设置深度缓冲
  • 我没有以正确的顺序定义我的顶点
  • 我没有正确绘制顶点缓冲区
  • ...

在这个应用程序中,没有照明设置,我使用CustomVertex.PositionTextured的是顶点。我希望有人可以帮助我缩小这个问题的范围,因为我认为(希望)这是一个相当简单的问题,但我已经坚持了几个小时了。

编辑

我的猜测是深度缓冲区尚未初始化。事实上,我没有做过。我用于初始化设备的代码是:

 presentParameters.SwapEffect = SwapEffect.Copy;

 device = new Device(0, DeviceType.Reference, this, CreateFlags.SoftwareVertexProcessing, presentParameters);

自然,这并没有设置深度缓冲区。然而,它至少显示了我所展示的内容。我尝试了以下代码来尝试设置深度缓冲区:

presentParameters.SwapEffect = SwapEffect.Copy;
presentParameters.EnableAutoDepthStencil = true;
presentParameters.AutoDepthStencilFormat = DepthFormat.D16;

device = new Device(0, DeviceType.Reference, this, CreateFlags.SoftwareVertexProcessing, presentParameters);
device.RenderState.ZBufferEnable = true;

现在模型根本不显示。这是我清除和绘制场景的方式:

device.Clear(ClearFlags.Target, Color.SlateGray, 1.0f, 0);

SetupCamera();
SetupTransformations();

//Begin scene
device.BeginScene();

Draw();

device.EndScene();
device.Present();

在设置深度缓冲区时我做错了什么?

编辑2

我注意到设备创建后出现错误:

+       RasterStatus    'device.RasterStatus' threw an exception of type 'Microsoft.DirectX.Direct3D.InvalidCallException'  Microsoft.DirectX.Direct3D.RasterStatus {Microsoft.DirectX.Direct3D.InvalidCallException}

两者都会发生这种情况。我应该提到的一件事是我在表格上绘制这个。我有另一个应用程序正在寻求帮助,将其绘制到自定义用户控件并且它没有此错误。无论如何,我不知道如何解码这个错误,谷歌一直没有帮助。

当我切换到DeviceType.Hardware. 不过,我仍在使用表格,这会是一个问题吗?

4

1 回答 1

0

问题是我忘记清除设备中的 zbuffer。清除调用:

device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.SlateGray, 1.0f, 0);

现在它可以工作了!

于 2013-07-24T23:58:54.253 回答