代码之家  ›  专栏  ›  技术社区  ›  Rob Perkins

在directx 9中,如何使zbuffer正常工作?

  •  2
  • Rob Perkins  · 技术社区  · 16 年前

    我一直没有成功地得到一个简单的立方体几何体的阴影打开,以正确显示。

    这是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]]}
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Goz    16 年前

    清除Z缓冲区至1.0F而不是10000.0F。

    从sdk中的clear docs:

    [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,看看这是否有助于您……

        2
  •  0
  •   easeout    16 年前

    一种预感:在清除之前尝试启用z缓冲区。

    推荐文章