2016-08-04 4 views
1

私はSharpDXを使用して、3Dモデリングソフトウェアを開発しています。ここで、要素はVertex-とIndexBuffersで描画されます。私は3DグラフィックスとDirectXの初心者です。コードは私によって書かれたものではなく、私はそれを適応させようとしています。 しかし、ここに問題があります:デバッグがうまく動作しても、コンピュータのロックとロック解除、またはCtrl + Alt + Delキーを押したときのAltタブでは、「DeviceNotReset」の変更を使用しているSharpDX.Direct3D9.Deviceの状態です。私は今レンダリングを続けることができるようにデバイスを回復しようとしています。ctrl + alt + delの後にSharpDXデバイスをリセットする

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(); 
    } 

レンダリングとデバイスをリセットしようとしている:

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(); 
     } 
    } 

SharpDXExceptionがcatchedされ、Ctrl + Alt + Delキーと継続を押すと、デバイスのリセットにブレークポイントを追加するデバイスを作成する

メッセージ付きでHRESULT: [0x8876086C], Module: [SharpDX.Direct3D9], ApiCode: [D3DERR_INVALIDCALL/InvalidCall], Message: Unknown

同じことをしているのに、SC.Present(Present.None, new SharpDX.Rectangle(), new SharpDX.Rectangle(), this.Handle);行でSharpDXExceptionがスローされます彼に続くメッセージHRESULT: [0x88760868], Module: [SharpDX.Direct3D9], ApiCode: [D3DERR_DEVICELOST/DeviceLost], Message: Unknown

リソースを解放してデバイスをリセットすると思いますが、リセットメソッドが例外をスローしています。または、デバイスが失われたという例外がSC.Present()で発生した場合、デバイスを再作成する必要がありますか?

答えて

2

私はデバイスをリセットすることができませんでしたが、代わりに上記と同じPresentParametersの新しいSharpDX.Deviceを作成しました。その後、グラフィックスを再初期化しただけでうまくいくようです。最も効率的な方法ではないかもしれませんが、この場合はうまくいきます。

関連する問題