2010-01-17 20 views
1

J'ai eu de la difficulté à identifier les paramètres corrects pour les périphériques PresentParameters et DirectX, de sorte qu'il peut y avoir un ombrage Gouraud au niveau des sommets et l'utilisation d'un tampon z. Certaines mailles triangulaires fonctionnent bien, d'autres ont des triangles de fond apparaissant devant des triangles plus proches de l'appareil photo.Comment configurer DirectX 9 de manière à ce que la suppression de la face arrière soit désactivée, que le z-buffering soit activé et que l'ombrage gouraud fonctionne, pour les maillages triangulaires sans données normales?

Un exemple de ceci est trouvé ici: http://gallery.me.com/robert.perkins/100045/zBufferGone. Les données d'entrée sont une simple liste de sommets dans les facettes. L'ordre d'enroulement des sommets dans chaque facette est non déterministe (provient de diverses fonctions d'exportation de logiciels CAO) et il n'y a pas de données normales.

Les paramètres PresentParameters sont en cours de configuration comme suit. Je me rends compte que c'est C# au lieu de C++ mais je pense que c'est assez descriptif, et les paramètres passent au code C++. Cela produit l'image dans l'image; le comportement est le même sur l'appareil de référence:

   pParams = new PresentParameters() 
        { 
         BackBufferWidth = this.ClientSize.Width, 
         BackBufferHeight = this.ClientSize.Height, 
         AutoDepthStencilFormat = Format.D16, 
         EnableAutoDepthStencil = true, 
         SwapEffect = SwapEffect.Discard, 
         Windowed = true 
        }; 
      _engineDX9 = new EngineDX9(this, SlimDX.Direct3D9.DeviceType.Hardware, SlimDX.Direct3D9.CreateFlags.SoftwareVertexProcessing, pParams); 

      _engineDX9.DefaultCamera.NearPlane = 0; 
      _engineDX9.DefaultCamera.FarPlane = 10; 
      _engineDX9.D3DDevice.SetRenderState(RenderState.Ambient, false); 
      _engineDX9.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer); 
      _engineDX9.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true); 
      _engineDX9.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.Always); 
      _engineDX9.BackColor = Color.White; 
      _engineDX9.FillMode = FillMode.Solid; 
      _engineDX9.CullMode = Cull.None; 

      _engineDX9.DefaultCamera.AspectRatio = (float)this.Width/this.Height; 

Toutes mes autres tentatives d'établissement, même sur le dispositif de référence, renvoyer un code d'erreur COM ({ « D3DERR_INVALIDCALL: appel non valide (-2005530516) »}). Quels sont les paramètres de configuration corrects?

EDIT: La classe C++ qui interface avec DirectX9 définit par défaut comme ceci:

PresentParameters::PresentParameters() 
{ 
    BackBufferWidth = 640; 
    BackBufferHeight = 480; 
    BackBufferFormat = Format::X8R8G8B8; 
    BackBufferCount = 1; 

    Multisample = MultisampleType::None; 
    MultisampleQuality = 0; 

    SwapEffect = SlimDX::Direct3D9::SwapEffect::Discard; 
    DeviceWindowHandle = IntPtr::Zero; 
    Windowed = true; 
    EnableAutoDepthStencil = true; 
    AutoDepthStencilFormat = Format::D24X8; 
    PresentFlags = SlimDX::Direct3D9::PresentFlags::None; 

    FullScreenRefreshRateInHertz = 0; 
    PresentationInterval = PresentInterval::Immediate; 
} 

Répondre

1

Où il retourner un appel non valide?

Modifier: Je suppose dans le nouvel appel EngineDX9? Avez-vous essayé de définir une poignée de fenêtre de périphérique dans les paramètres actuels?

Édition 2: avez-vous activé le débogueur spew dans le panneau de contrôle DirectX pour voir s'il vous indique ce qu'est l'erreur? Edit3: Vous avez essayé de définir backbufferWidth et Height à 0? A quoi sert backbuffercount? Peut-être aussi la peine d'essayer "Format.D24S8" sur le backbuffer? Son "possible" votre carte graphique ne supporte pas 16 bits (peu probable cependant). Avez-vous vérifié dans les majuscules que le mode que vous essayez de créer est valide? J'assume, btw, que le langage CLR que vous utilisez automagiquement définit les paramètres que vous ne définissez pas à 0? Personnellement, je préfère toujours être explicite dans de tels cas ....

PS Je devine ici parce im un codeur C++ DX9 pas un codeur SlimDX CLR ...

natif

Edit4: Je suis Bien sûr, c'est le manque de poignée de fenêtre ... Je me trompe probablement mais c'est la seule chose que je peux voir vraiment mal avec votre configuration. Un périphérique DX9 fenêtré nécessite une fenêtre. Btw définir la largeur et la hauteur à 0 juste pour utiliser la fenêtre que vous définissez la taille de l'appareil ...

Éditer 5: J'ai vraiment été sur la mauvaise route ici. Il n'y a rien de mal à la création de l'appareil qui a produit votre appareil "incorrect". Ne plaisante pas avec les paramètres actuels, ils vont bien. La principale raison pour laquelle vous aurez des problèmes avec votre Z-Buffering est que vous définissez toujours la fonction de comparaison. Cela signifie que, indépendamment de ce que contient le tampon z, passez le pixel et écrivez z dans le tampon z écrasant tout ce qui existe déjà. Je parierais que votre problème de Z-buffering est là.

+0

Chaque autre configuration de PresentParameters que j'ai essayée, y compris la définition d'un handle de fenêtre de périphérique dans la structure, a renvoyé un appel non valide lors de la création de cet objet EngineDX9. Le code interne qui crée cet objet lève l'exception si CreateDevice renvoie un code de non-réussite, tel que D3DERR_INVALIDCALL.Mon problème est que je ne peux pas dire quelle combinaison de PresentParameters n'aboutit pas à D3DERR_INVALIDCALL, pour les trois fonctionnalités dont j'ai besoin. –

+0

Et, oui, en fait, j'ai le debug spew activé. Il annule au hresult D3DERR_INVALIDCALL, avec ce nombre ci-dessus, sans autre information. Je ne sais pas vraiment quoi en faire. –

+0

Je pense que le problème est que je ne suis pas aussi explicite que je le devrais. Je vais creuser dans le code de support C++ et éditer le problème pour poster les autres paramètres. Le matériel est une carte GeForce - environ 2 ans maintenant. Mais les résultats sont les mêmes lorsque je choisis le pilote de référence au lieu de matériel. –