【问题标题】:In DirectX 9, how to get zbuffer to work properly?在 DirectX 9 中,如何让 zbuffer 正常工作?
【发布时间】:2010-01-19 20:38:11
【问题描述】:

我没有成功获得一个简单的立方体几何图形,并打开了阴影以正确显示。

这是 C# 代码,但值通过 SlimDX 直接传递给 C++ 代码。

            pParams.BackBufferWidth = 0;
            pParams.BackBufferHeight = 0;
            pParams.BackBufferCount = 1;
            pParams.BackBufferFormat = Format::X8R8G8B8;
            pParams.Multisample = MultisampleType::None;
            pParams.MultisampleQuality = 0;
            pParams.DeviceWindowHandle = this.Handle;
            pParams.Windowed = true;
            pParams.AutoDepthStencilFormat = Format.D24X8;
            pParams.EnableAutoDepthStencil = true;
            pParams.PresentFlags = PresentFlags.None;
            pParams.FullScreenRefreshRateInHertz = 0;
            pParams.PresentationInterval = PresentInterval.Immediate;
            pParams.SwapEffect = SwapEffect.Discard;

... 是 PresentParameter 结构中用于设置我的 Direct3D9Device 对象的值。

在渲染过程中,SetRenderState 被调用如下:

        this.D3DDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, this.BackColor, 10000.0f, 0);
        this.D3DDevice.SetRenderState(RenderState.Ambient, false);
        this.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
        this.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
        this.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.LessEqual);
        this.D3DDevice.BeginScene();

同样,这被传递给 C++ 代码,它将值编组到 C++ 程序员不会担心的调用中。

基元是漫反射彩色顶点 (D3DFVF_XYZ | D3DFVF_DIFFUSE)。线框视图如下所示: wireframe view http://gallery.me.com/robert.perkins/100045/z-fightingwireframe/web.jpg

较近的一对较大的三角形是立方体的近面。

填充后的视图如下所示: full view 1 http://gallery.me.com/robert.perkins/100045/Z-fighting/web.jpg

或者这个,在随后的渲染调用中: full view 2 http://gallery.me.com/robert.perkins/100045/zfight2/web.jpg

我不确定如何解决这个问题。我应该从哪里开始寻找?

编辑:其中一帧的相机投影矩阵看起来像这样:

{[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0] 
  [M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0] 
  [M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0] 
  [M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]}

而且,视图矩阵如下所示:

camera.ViewMatrix = {[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0] 
                      [M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0] 
                      [M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0] 
                      [M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]}

【问题讨论】:

  • 顺便说一句,您在上面粘贴了两次相同的矩阵...
  • 它们可能是一样的。

标签: directx zbuffer


【解决方案1】:

将 Z-Buffer 清除为 1.0f 而不是 10000.0f。

来自 SDK 中的 Clear 文档:

[in] Clear the depth buffer to this new z value which ranges from 0 to 1.. 

查看投影矩阵和视口设置也可能很有用...

编辑:您如何构建该投影矩阵?您已将 zNear 设置为 0 并将 zFar 设置为 1。尝试将 zNear 设置为 0.001f 并将 zFar 设置为 1000.0f,看看这是否对您有帮助...

【讨论】:

  • 谢谢 Goz,明白了。问题出在计算投影矩阵的 Camera 对象的数据结构中。
【解决方案2】:

预感:在清除之前尝试启用 Z-Buffer。

【讨论】:

  • 我尝试了那个和另一种订购变体,图像没有变化。
猜你喜欢
  • 2012-09-30
  • 2020-10-06
  • 1970-01-01
  • 2015-05-08
  • 2020-08-27
  • 2018-06-11
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多