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;
}
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. –
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. –
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. –