2013-09-06 5 views
2

내 창 크기가 변경되는 즉시 backbuffer에 대한 업데이트를 구현하려고합니다. 내 개체가 너무 늘어나지 않습니다. 그래서 나는 즉시 창 크기가 변경되었습니다로이 오류가이SharpDx windowResize

_renderForm.Resize += OnRenderFormOnResize; 
private void OnRenderFormOnResize(object sender, EventArgs args) 
     { 
      // Resize depth bufer ? 
      MessageBox.Show("Width: "+_renderForm.ClientSize.Width.ToString() +" | Height: "+ _renderForm.ClientSize.Height.ToString()); 

      _swapChain.ResizeBuffers(_desc.BufferCount, _renderForm.ClientSize.Width, _renderForm.ClientSize.Height, Format.Unknown, SwapChainFlags.None); 
      DoResize(); 
     } 

을 시도했다.

DXGI_ERROR_IVALID_CALL/InvalidCall

내가 뭔가를 놓치고 있습니까?

+0

backbuffer 처분에 대해 많이 읽었으므로 "_backbuffer.Dispose()"도 수행했지만 효과가 없습니다. – Rey

+0

[디버그 모드에서 실행 중입니까?] (http://sharpdx.org/forum/4- 일반/1774-how-to-debug-a-sharpdxexception) 할 수있는 모든 정보를 얻으려고합니까? – shoelzer

+0

릴리스 대신 디버그에서 실행하는 경우 그렇습니다. – Rey

답변

2

스왑 체인에 따라 뷰가 여전히 활성 상태 인 경우 스왑 체인의 크기를 조정할 수 없습니다. 그래서 당신이 당신의 backbuffer에서 생성 된 RenderTargetView/ShaderResourceViews에서 release/dispose를 호출 한 다음 Resize가 호출되면 새로운 것을 생성하십시오.

파이프 라인에서 뷰를 분리해야하므로 (예 : SwapChain과 연결된 RenderTargetView가 여전히 바인딩되어있는 경우 이전에 바인딩을 해제했는지 확인하십시오.) 그렇지 않으면 dx11 런타임은 처리하기 전에 연결이 끊길 때까지 기다렸다가, 따라서 호출은 여전히 ​​실패합니다.

EDIT : 필요한 것을 모두 가지고 있는지 확인하기 위해 가장 필요한 방법은 필요한 모든 데이터가 들어있는 스왑 체인 클래스를 만드는 것입니다 (제 경우의 DX11Device는 단순히 장치를 래핑하는 것입니다) .

public DX11SwapChain(DX11Device device, IntPtr handle, Format format, SampleDescription sampledesc) 
    { 
     this.device = device; 
     this.handle = handle; 

     SwapChainDescription sd = new SwapChainDescription() 
     { 
      BufferCount = 1, 
      ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), format), 
      IsWindowed = true, 
      OutputHandle = handle, 
      SampleDescription = sampledesc, 
      SwapEffect = SwapEffect.Discard, 
      Usage = Usage.RenderTargetOutput | Usage.ShaderInput, 
      Flags = SwapChainFlags.None 
     }; 

     this.swapchain = new SwapChain(device.Factory, device.Device, sd); 

     this.resource = Texture2D.FromSwapChain<Texture2D>(this.swapchain, 0); 
     this.TextureDesc = this.resource.Description; 

     this.RenderView = new RenderTargetView(device.Device, this.resource); 
     this.RenderViewDesc = this.RenderView.Description; 

    } 

그리고 크기 조정 방법 : 여기

public class DX11SwapChain : IDX11RenderTarget 
{ 
    private DX11Device device; 
    private IntPtr handle; 
    private SwapChain swapchain; 

    public RenderTargetView RenderView { get; protected set; } 
    public RenderTargetViewDescription RenderViewDesc { get; protected set; } 

    public Texture2DDescription TextureDesc { get; protected set; } 
    private Texture2D resource; 


    public IntPtr Handle { get { return this.handle; } } 
} 

생성자입니다 또한

public void Resize() 
    { 
     this.Resize(0, 0); 
    } 

    public void Resize(int w, int h) 
    { 
     if (this.RenderView != null) { this.RenderView.Dispose(); } 
     this.resource.Dispose(); 

     this.swapchain.ResizeBuffers(1,w, h, SharpDX.DXGI.Format.Unknown, SwapChainFlags.AllowModeSwitch); 

     this.resource = Texture2D.FromSwapChain<Texture2D>(this.swapchain, 0); 

     this.TextureDesc = this.resource.Description; 
     this.RenderView = new RenderTargetView(device.Device, this.resource); 
    } 

, 단지 크기를 호출하기 전에, 당신도 할 결국 수 있습니다 (문의하는 것이 좋다 작은 플러시) :

device.ImmediateContext.ClearState(); 

모든 것을 묶어 버리기 위해.

크기에 의존하는 리소스를 사용하는 경우 임시 렌더링 대상/깊이 버퍼와 같은 요소를 다시 만들려면 응용 프로그램에 알려야합니다.

그래서이 경우 Resized 이벤트를 SwapChain 클래스에 추가하거나 캔버스에서들을 수 있습니다. 나는 종종 같은 애플리케이션에서 여러 SwapChains를 사용하기 때문에 개인적으로 큰 팬이 아닙니다. 캔버스 클래스로

ResizeResources(int widh,int height); 

및 이벤트의 크기를 조정하여 renderform에 전화 :

또 다른 간단한 방법은, 방법을 추가하는 것입니다.

+0

그렇다면 제대로 이해하면 작동하지 않습니다. 은 내가 또한 renderForm과 renderLoop를 호출이 생성라는 클래스 canvas.cs에서 백 버퍼, depthBuffer, depthView 및 renderView을 만들 수 있습니다. 나는 그들이 여전히 오류가 발생할 맥락에서 기존의 캔버스에있는 모든 사람들을 폐기하고있어 그래서 때 "context.ClearRenderTargetView"와 "context.ClearDepthStencilView" 전화 canvas.cs에서 유산 내 클래스 context.cs에서 . 그래서 나는 그것을 잘 작동되도록하려면 어떻게 든 그들을 연결하는 방법을 찾아야했습니다? 것은 그것은 불가능하다, 그래서 나는 바로 내 canvas.cs 호출에 사람들을 붙여했습니다? – Rey

+0

편집 된 답변을 설명 할 코드가 있습니다. – catflier

+0

이 설명을 주셔서 감사하지만이 성분의 값을 얻을니까. 그들은 동일하기 때문에 그들은 동일하지 않습니까? ! [비교] (http://abload.de/img/composition2ksfm.png) 당신이 Device.CreateWithSwapChain (DriverType.Hardware, DeviceCreationFlags.Debug, SD, _device 밖으로, 밖으로 this.swapchain'의미 당신의 SwapChain 생성자 내에서 ) '대신에'= this.swapchain 새로운 SwapChain (device.Factory, device.Device, SD) 중, 오른쪽 '? – Rey