2010-01-19 13 views
2

Je n'ai pas réussi à obtenir une géométrie de cube simple avec un ombrage activé pour afficher correctement.Dans DirectX 9, comment faire fonctionner zbuffer correctement?

Il s'agit d'un code C#, mais les valeurs sont transmises directement à SlimDX au code 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; 

... sont les valeurs dans le struct PresentParameter utilisé pour configurer mon objet Direct3D9Device.

Au cours d'un rendu, SetRenderState est appelé comme suit:

 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(); 

Encore une fois, cela est passé par le code C++ qui maréchaux les valeurs pour les appels d'un programmeur C++ ne craindre.

Les primitives sont des sommets colorés diffus (D3DFVF_XYZ | D3DFVF_DIFFUSE). La vue filaire ressemble à ceci: wireframe view http://gallery.me.com/robert.perkins/100045/z-fightingwireframe/web.jpg

La plus proche paire de plus grands triangles est la face la plus proche d'un cube.

La vue remplie ressemble à ceci: full view 1 http://gallery.me.com/robert.perkins/100045/Z-fighting/web.jpg

Ou cela, un appel de rendu ultérieur: full view 2 http://gallery.me.com/robert.perkins/100045/zfight2/web.jpg

Je ne suis pas sûr de savoir comment résoudre ce problème. Où devrais-je commencer à chercher?

Edit: La matrice de projection de la caméra regarde autour comme celui-ci pour l'un des cadres:

{[[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]]} 

Et, la matrice de vue ressemble à ceci:

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 Vous avez collé la même matrice deux fois au-dessus ... – Goz

+0

Il est possible qu'ils soient tous les deux pareils. –

Répondre

2

Effacer le Z-Buffer à 1.0f et non 10000.0f.

De la documentation claires dans le SDK:

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

Il peut également être utile pour voir votre matrice de projection et les paramètres de viewport ...

Edit: Comment construire cette matrice de projection? Vous avez défini zNear à 0 et zFar à 1. Essayez de définir votre zNear à 0.001f et zFar à 1000.0f et voir si cela vous aide ...

+0

Merci Goz, c'est compris. Le problème était dans la structure de données pour l'objet Camera qui calcule la matrice de projection. –

0

Une intuition: Essayez d'activer le Z -Buffer avant de dégager.

+0

J'ai essayé cela et une autre variante de commande, sans changement dans l'image. –