스왑 체인에 따라 뷰가 여전히 활성 상태 인 경우 스왑 체인의 크기를 조정할 수 없습니다. 그래서 당신이 당신의 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에 전화 :
또 다른 간단한 방법은, 방법을 추가하는 것입니다.
backbuffer 처분에 대해 많이 읽었으므로 "_backbuffer.Dispose()"도 수행했지만 효과가 없습니다. – Rey
[디버그 모드에서 실행 중입니까?] (http://sharpdx.org/forum/4- 일반/1774-how-to-debug-a-sharpdxexception) 할 수있는 모든 정보를 얻으려고합니까? – shoelzer
릴리스 대신 디버그에서 실행하는 경우 그렇습니다. – Rey