Comment puis-je configurer DirectX 9 pour que backface culling est éteint, z-buffer est activé, et les travaux d'ombrage de Gouraud, pour les maillages triangle sans données normals?

StackOverflow https://stackoverflow.com/questions/2082065

  •  21-09-2019
  •  | 
  •  

Question

I ai eu des difficultés à identifier les paramètres corrects pour les PresentParameters et DirectX dispositif, de sorte qu'il peut y avoir à la fois au niveau du sommet ombrage de Gouraud et l'utilisation d'un tampon de z. Certains triangle mailles fines de travail, d'autres ont des triangles de fond apparaissant devant des triangles qui sont plus proches à la caméra.

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

Les PresentParameters sont mis en place en ce moment comme suit. Je sais que cela est C # au lieu de C ++, mais je pense qu'il est assez descriptif et les paramètres passer par le 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 assure l'interface avec DirectX9 définit par défaut comme suit:

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;
}
Était-ce utile?

La solution

Où il retourne un appel non valide?

Edit: Je suppose dans le nouvel appel EngineDX9? Avez-vous essayé de placer une poignée de fenêtre de l'appareil dans les paramètres actuels?

Edit 2: Avez-vous activé le débogage crachent dans le panneau de commande DirectX pour voir si elle vous indique ce que l'erreur est

Edit3: Vous avez essayé de placer backbufferWidth et la hauteur à 0? Ce qui est mis à backbuffercount? Pourrait aussi être la peine d'essayer « Format.D24S8 » sur le backbuffer? Sa votre carte graphique « possibles » ne prend pas en charge 16 bits (peu probable cependant). Avez-vous vérifié dans les bouchons que le mode que vous essayez de créer est valide? J'asssume, d'ailleurs, que le langage CLR que vous utilisez définit automagiquement 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 que im un codeur C ++ natif DX9 pas un codeur SlimDX CLR ...

Edit4: Je suis sûr que son manque de poignée de fenêtre ... Je suis probablement mal mais c'est la seule chose que je peux voir vraiment mal avec votre configuration. Dispositif de DX9 fenêtré nécessite une fenêtre. BTW largeur et la hauteur fixé à 0 juste utiliser la fenêtre que vous définissez la taille de l'appareil trop ...

Edit 5: J'ai vraiment dirigeais sur la mauvaise route ici. Il n'y a rien de mal à la création du dispositif qui a produit votre appareil « incorrect ». Ne jouez pas avec les paramètres actuels, ils sont très bien. La principale raison pour laquelle vous avez des problèmes avec votre Z-buffering est que vous définissez la fonction de comparaison de toujours. Cela signifie que, peu importe ce que le z-tampon contient, pas le pixel et écrire son z dans le tampon z-ce qui est là en écrasant déjà. Je parie que c'est là votre problème Z en mémoire tampon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top