2011-06-23 3 views
2

Je rencontre un problème avec le SDK MarchDX de SlimDX (pour le DXSDK11 de juin 2010, je crois). Le problème est que chaque fois que je tourne le lien de la vue de profondeur à l'état de fusion de sortie, je ne reçois aucune sortie sur l'écran. J'ai comparé mon code avec des samples DX11 et cela semble correct. J'ai essayé toutes sortes de drapeaux et de formats pour le test de profondeur (y compris en passant toujours etc.) mais rien ne semble fonctionner. J'apprécierais si quelqu'un peut repérer une erreur. Voici le code. Voici les étapes:Problèmes de mémoire tampon SlimDX 11

  1. Initialiser le tampon de retour:

     D3DDevice device; 
        SwapChain swapChain; 
    
        /// Create the swap chain 
        SwapChainDescription desc = new SwapChainDescription() 
        { 
         BufferCount = 1, 
         ModeDescription = new ModeDescription 
         { 
          Width = ContextSettings.Width, 
          Height = ContextSettings.Height, 
          RefreshRate = new SlimDX.Rational(ContextSettings.RefreshRate, 1), 
          Format = ContextSettings.BufferFormat, 
         }, 
         IsWindowed = !ContextSettings.FullScreen, 
         OutputHandle = WindowHandle, 
         SampleDescription = new SampleDescription(1, 0), 
         SwapEffect = SwapEffect.Discard, 
         Usage = Usage.RenderTargetOutput, 
        }; 
    
        FeatureLevel[] featureLevels = new FeatureLevel[] { FeatureLevel.Level_11_0, FeatureLevel.Level_10_1 }; 
        DriverType driverType = DriverType.Hardware; 
    
        D3DDevice.CreateWithSwapChain(driverType, DeviceCreationFlags.Debug, featureLevels, desc, out device, out swapChain); 
    
        Device = device; 
        SwapChain = swapChain; 
    
        /// Setup window association 
        Factory factory = swapChain.GetParent<Factory>(); 
        factory.SetWindowAssociation(WindowHandle, WindowAssociationFlags.IgnoreAll); 
    
        /// Setup back buffers and render target views 
        RenderBuffer = DXTexture2D.FromSwapChain<DXTexture2D>(swapChain, 0); 
        RenderView = new RenderTargetView(Device, RenderBuffer); 
    
  2. initialisez la mémoire tampon de profondeur:

     Format depthFormat = Format.D32_Float; 
        Texture2DDescription depthBufferDesc = new Texture2DDescription 
        { 
         ArraySize = 1, 
         BindFlags = BindFlags.DepthStencil, 
         CpuAccessFlags = CpuAccessFlags.None, 
         Format = depthFormat, 
         Height = width, 
         Width = height, 
         MipLevels = 1, 
         OptionFlags = ResourceOptionFlags.None, 
         SampleDescription = new SampleDescription(1, 0), 
         Usage = ResourceUsage.Default 
        }; 
    
        DepthBuffer = new DXTexture2D(Device, depthBufferDesc); 
    
        DepthStencilViewDescription dsViewDesc = new DepthStencilViewDescription 
        { 
         ArraySize = 0, 
         Format = depthFormat, 
         Dimension = DepthStencilViewDimension.Texture2D, 
         MipSlice = 0, 
         Flags = 0, 
         FirstArraySlice = 0 
        }; 
    
        DepthView = new DepthStencilView(Device, DepthBuffer, dsViewDesc); 
    
        DepthStencilStateDescription dsStateDesc = new DepthStencilStateDescription() 
        { 
         IsDepthEnabled = true, 
         IsStencilEnabled = false, 
         DepthWriteMask = DepthWriteMask.All, 
         DepthComparison = Comparison.Less, 
        }; 
    
        DepthState = DepthStencilState.FromDescription(Device, dsStateDesc); 
    
  3. Configuration des cibles rendu:

    DeviceContext.OutputMerger.DepthStencilState = DepthState; 
        DeviceContext.OutputMerger.SetTargets(DepthView, RenderView); 
        DeviceContext.Rasterizer.SetViewports(new Viewport(0, 0, ContextSettings.Width, ContextSettings.Height, 0.0f, 1.0f)); 
    
        Clear(); 
    

Dès que je supprime DepthView de OutputMerger.SetTargets je commence à voir des images sur l'écran (sans le test de profondeur bien sûr) et vice-versa sinon.

+0

Avez-vous regardé la sortie de débogage que DirectX vous donnera pour voir s'il y a des erreurs ou des avertissements répertoriés? Essayez aussi de regarder en utilisant PIX pour voir exactement ce qui se passe avec votre géométrie. – MikeP

+0

Vous initialisez l'affichage du pochoir en profondeur exactement de la même manière que je le fais. La seule différence est que le format que j'utilise est Format.D24_UNorm_S8_UInt. Pourriez-vous essayer cela et voir si cela fonctionne? EDIT: Oh, et je n'utilise pas du tout DepthStencilState. Pouvez-vous essayer de commenter cela pour voir si c'est là que le problème se produit? –

Répondre

0

Il s'est avéré que dans le depthBufferDesc, je passais la largeur à la variable Height et la hauteur à la largeur. Cela créait les deux cibles de rendu avec des dimensions différentes qui le décomposaient.