C# DirectX 9三角形列表通过自身绘制,如何设置深度缓冲区?

C# DirectX 9三角形列表通过自身绘制,如何设置深度缓冲区?,c#,directx-9,C#,Directx 9,我很难解决DirectX 9应用程序中出现的一个bug。我正在使用顶点缓冲区渲染一个三角形列表,没有任何剔除(无论哪种方式都会出现错误)。当我从某个方向观察渲染的三角形条带时,条带的底部(最远的部分)将穿过应该在其上方的部分。这有点难以用语言来解释,所以我将尝试通过图像来展示正在发生的事情 上面是我希望看到的,圆锥体的顶端渲染在黑色底部之上。朝这个方向看时它会起作用 以上是我从坏的方向看的结果。请注意黑色底面是如何在圆锥体的中间绘制的。这太可怕了,根本不是我想发生的 有趣的是,如果你走到另

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

上面是我希望看到的,圆锥体的顶端渲染在黑色底部之上。朝这个方向看时它会起作用

以上是我从坏的方向看的结果。请注意黑色底面是如何在圆锥体的中间绘制的。这太可怕了,根本不是我想发生的

有趣的是,如果你走到另一边,朝坏的方向看,那就是在底部上方绘制的圆锥体,而底部应该是绘制的(如上所示)。如果使用反向剔除(逆时针),则不会出现这种情况。我希望这能给有更多经验的人一点帮助,找出问题所在

不管怎样,我甚至不知道从哪里开始追踪这个bug,因为我对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();
设置深度缓冲区时,我做错了什么

EDIT2

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

+       RasterStatus    'device.RasterStatus' threw an exception of type 'Microsoft.DirectX.Direct3D.InvalidCallException'  Microsoft.DirectX.Direct3D.RasterStatus {Microsoft.DirectX.Direct3D.InvalidCallException}
这两种情况都会发生。我应该提到的一件事是,我正在表格上画这个。我有另一个应用程序,我正在寻找帮助,将其绘制到自定义用户控件,它没有这个错误。无论如何,我不知道如何破译这个错误,谷歌一直没有帮助


当我切换到
DeviceType.Hardware
时,不会发生这种情况。但我仍在使用表单,这会有问题吗?

问题是我忘记清除设备中的zbuffer。清除呼叫:

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

现在它工作了

我猜是深度缓冲。是否已启用z缓冲区?添加
device.RenderState.ZBufferEnable=true不会改变任何东西。我猜它是默认启用的?编辑:这是我用来清除屏幕的,
device.Clear(ClearFlags.Target,Color.SlateGray,1.0f,0)看起来还好吗?所以我认为你是对的@Matthew,我从来没有设置过任何类型的z缓冲区。。。