我无法解决我在 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
. 不过,我仍在使用表格,这会是一个问题吗?