2016-08-04 43 views
1

Ich benutze SharpDX für die Entwicklung einer 3D-Modellierung Software, wo die Elemente mit Vertex-und IndexBuffers gezeichnet werden. Ich bin ein Anfänger in 3D-Grafik und DirectX, der Code ist nicht von mir geschrieben und ich versuche, es anzupassen. Aber hier ist das Problem: Alt Tabbing beim Debuggen funktioniert gut, aber beim Sperren und Entsperren des Computers oder Drücken von Strg + Alt + Del den Zustand des SharpDX.Direct3D9.Device verwende ich Änderungen an "DeviceNotReset". Ich versuche nun, das Gerät wiederherzustellen, damit das Rendern fortgesetzt werden kann.Zurücksetzen SharpDX Gerät nach Strg + Alt + Del

Erstellen Gerät:

public ModelerControl(MainViewPresenter parent) 
    { 
     PresentParameters par = new PresentParameters(); 
     par.Windowed = true; 
     par.SwapEffect = SharpDX.Direct3D9.SwapEffect.Discard; 
     par.PresentationInterval = PresentInterval.One; 
     par.AutoDepthStencilFormat = SharpDX.Direct3D9.Format.D16; 
     par.EnableAutoDepthStencil = true; 
     par.BackBufferFormat = SharpDX.Direct3D9.Format.X8R8G8B8; 
     par.BackBufferHeight = this.ClientSize.Height; 
     par.BackBufferWidth = this.ClientSize.Width; 

     if (device == null) 
     { 
      device = new SharpDX.Direct3D9.Device(new Direct3D(), 0, DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, par); 

      SC = device.GetSwapChain(0); 
     } 
     else 
     { 
      SC = new SharpDX.Direct3D9.SwapChain(device, pp); 
     } 

     this.parentPresenter = parent; 
     InitializeComponent(); 
    } 

Rendering und das Gerät zurücksetzen versuchen:

public void Render() 
    { 
     lock (this) 
     { 
      ModelerProperties properties = ProjectModel.Instance.Project.ModelerPropertyList; 
      if (properties == null) 
       return; 
      if (!properties.IsPropertySenderInited) 
      { 
       properties.PropertyChanged += new PropertyChangedEventHandler(ModelerControl_PropertyChanged); 
       properties.IsPropertySenderInited = true; 
      } 

      int index = 0; 

      if (device == null) 
       return; 
      if (clock == null) 
       return; 
      if (SC.IsDisposed) 
       return; 
      if (this.IsDisposed) 
       return; 

      SharpDX.Result result = device.TestCooperativeLevel(); 

      if(result == ResultCode.DeviceNotReset) 
      { 
       PresentParameters pp = new PresentParameters(); 
       pp.Windowed = true; 
       pp.SwapEffect = SharpDX.Direct3D9.SwapEffect.Discard; 
       pp.PresentationInterval = PresentInterval.One; 
       pp.AutoDepthStencilFormat = SharpDX.Direct3D9.Format.D16; 
       pp.EnableAutoDepthStencil = true; 
       pp.BackBufferFormat = SharpDX.Direct3D9.Format.X8R8G8B8; 
       pp.BackBufferHeight = this.ClientSize.Height; 
       pp.BackBufferWidth = this.ClientSize.Width; 

       try 
       { 
        device.Reset(pp); 
       } 
       catch { } 
      } 

      SharpDX.Direct3D9.Surface bb = SC.GetBackBuffer(0); 
      device.SetRenderTarget(0, bb); 

      device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, properties.GetBackGroundColor(), 1.0f, 0); 
      device.BeginScene(); 

      //Defining matrices 

      device.SetTransform(TransformState.World, ref mScale); 
      device.SetTransform(TransformState.View, ref mView); 
      device.SetTransform(TransformState.Projection, ref mProj); 

      device.SetRenderState(RenderState.PointSpriteEnable, true); 
      device.SetRenderState(RenderState.PointScaleA, 0f); 
      device.SetRenderState(RenderState.PointScaleB, 0f); 
      device.SetRenderState(RenderState.PointScaleC, 100f); 
      device.SetRenderState(RenderState.Lighting, true); 
      device.SetRenderState(RenderState.Ambient, System.Drawing.Color.White.ToArgb()); 
      device.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer); 
      device.SetRenderState(RenderState.NormalizeNormals, true); 
      device.SetRenderState(RenderState.CullMode, Cull.Counterclockwise); 

      device.SetRenderState(RenderState.AlphaBlendEnable, true); 
      device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add); 
      device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha); 
      device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha); 

      //Drawing elements 

      device.EndScene(); 

      try 
      { 
       SC.Present(Present.None, new SharpDX.Rectangle(), new SharpDX.Rectangle(), this.Handle); 
      } 
      catch { } 

      bb.Dispose(); 
     } 
    } 

Wenn ein Haltepunkt am Gerät Zurücksetzen Hinzufügen Drücken von Strg + Alt + Entf und Weiterbildung wird ein SharpDXException catched mit der Nachricht HRESULT: [0x8876086C], Module: [SharpDX.Direct3D9], ApiCode: [D3DERR_INVALIDCALL/InvalidCall], Message: Unknown

Doing das gleiche, aber an der Linie SC.Present(Present.None, new SharpDX.Rectangle(), new SharpDX.Rectangle(), this.Handle);, wird eine SharpDXException mit t geworfen er folgende Nachricht HRESULT: [0x88760868], Module: [SharpDX.Direct3D9], ApiCode: [D3DERR_DEVICELOST/DeviceLost], Message: Unknown

Ich denke, ich soll die Ressourcen freigeben und dann das Gerät zurücksetzen, aber die Reset-Methode wirft die Ausnahme. Oder sollte das Gerät neu erstellt werden, wenn die Ausnahme bei SC.Present() besagt, dass das Gerät verloren gegangen ist?

Antwort

2

Ich konnte das Zurücksetzen des Geräts nicht zum Arbeiten bekommen, stattdessen habe ich einen neuen SharpDX.Device mit demselben wie oben erstellt. Dann habe ich die Grafik reinitialisiert und das scheint gut zu funktionieren. Ist vielleicht nicht der effizienteste Weg, aber in diesem Fall funktioniert es.