2010-01-19 74 views
2

我一直沒有成功獲得一個簡單的立方體幾何圖形,並開啓了陰影以正確顯示。在DirectX 9中,如何讓zbuffer正常工作?

這是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; 

...是用於設置我的Direct3D9Device對象的PresentParameter結構中的值。

在呈現,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]]} 
+0

btw你粘貼了相同的矩陣兩次以上... – Goz 2010-01-19 12:37:29

+0

它們可能都是一樣的。 – 2010-01-19 13:18:40

回答

2

將Z緩衝區清除爲1.0f而不是10000.0f。

從SDK中清除文檔:

[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,看看它是否對你有所幫助...

+0

謝謝Goz,明白了。問題在於計算投影矩陣的Camera對象的數據結構。 – 2010-01-19 13:23:28

0

甲預感:嘗試使在Z在清除之前清除緩衝區。

+0

我試過了,另外一個訂購變體,圖像沒有任何變化。 – 2010-01-19 04:05:54