C# SharpDx windowResize

C# SharpDx windowResize,c#,directx-11,window-resize,sharpdx,dxgi,C#,Directx 11,Window Resize,Sharpdx,Dxgi,我正在尝试在更改窗口大小后立即对backbuffer进行更新。 所以我的物品不会被拉伸。 所以我试过这个 _renderForm.Resize += OnRenderFormOnResize; private void OnRenderFormOnResize(object sender, EventArgs args) { // Resize depth bufer ? MessageBox.Show("Width: "+_re

我正在尝试在更改窗口大小后立即对backbuffer进行更新。 所以我的物品不会被拉伸。 所以我试过这个

_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\u错误\u无效呼叫/无效呼叫


我遗漏了什么吗?

如果依赖交换链的任何视图仍处于活动状态,则不允许调整交换链的大小。因此,请确保在RenderTargetView上调用release/dispose/ShaderResourceViews(从backbuffer创建),然后在调用Resize后创建新的

还请注意,这些视图需要从管道中分离(因此,如果与SwapChain关联的RenderTargetView仍处于绑定状态,请确保在之前将其解除绑定),否则dx11运行时将在dispose之前等待它们解除连接,因此调用仍将失败

编辑: 为了确保您拥有所需的一切,最简单的方法是构建一个swapchain类,该类包含您所需的所有必要数据(请注意,在我的示例中,DX11设备也只是包装一个设备)

以下是构造函数:

    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;

    }
确保解开所有东西

请注意,如果使用大小相关的资源,还需要通知应用程序(以便重新创建临时渲染目标/深度缓冲区等元素)

因此,在这种情况下,您可以向SwapChain类添加一个调整大小的事件(并在画布上收听)。我个人不太喜欢这个,因为我经常在同一个应用程序中使用几个交换链

另一个简单的方法是添加一个方法:

 ResizeResources(int widh,int height);

进入您的canvas类,并在renderform resize事件中调用它。

我读了很多关于先处理backbuffer的内容,所以我也这么做了“\u backbuffer.Dispose()”但它没有任何效果。您想得到所有您能得到的信息吗?如果您是说如果我在Debug中而不是在Release中运行它,那么我会这样做。我是说在Debug config中构建并运行,但也要打开DirectX设备调试和“启用本机代码调试”。有关详细信息,请参阅我其他评论中的链接。因此,如果我理解正确,它将无法工作。我在一个名为canvas.cs的类中创建backBuffer、depthBuffer、depthView和renderView,我在其中创建renderForm并调用renderLoop。在我的类context.cs中,它继承了canvas.cs,我称之为“context.ClearRenderTargetView”和“context.ClearDepthStencilView”,因此当我处理画布中的所有这些内容时,它们仍然存在于导致错误的上下文中。所以我得想办法把它们联系起来,让它正常工作?问题是这是不可能的,所以我必须将这些调用粘贴到我的canvas.cs,对吗?谢谢你的解释,但我不知道这篇文章的价值。因为他们有点像,不是吗!在SwapChain构造函数中,您指的是
Device.CreateWithSwapChain(DriverType.Hardware,DeviceCreationFlags.Debug,sd,out\u Device,out this.SwapChain)
而不是
this.swapchain=新的swapchain(device.Factory,device.device,sd)对吗?不,它们明显不同。我首先创建一个设备,然后使用该设备创建交换链。(在您的图表中,这是不正确的,因为创建我的设备不是在swapchain类中完成的,而是事先完成的)。这意味着我只需实例化我的SwapChain类,就可以使用同一设备创建20个SwapChain,或者使用根本没有SwapChain的设备类(单元测试、计算中的数据处理)…@catflier为什么要处理`this.resource.Dispose();`在
Resize
方法中两次?@JeroenvanLangen好的一点,更新的答案,在这种情况下,不需要它,因为它不执行addref(并且无论如何应该使用marshal release)
    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();
 ResizeResources(int widh,int height);