gpt4 book ai didi

c# - ResizeBuffers 时 DirectX 无效调用

转载 作者:行者123 更新时间:2023-11-30 16:21:49 24 4
gpt4 key购买 nike

我正在编写一个非常简单的建模软件,这比其他任何事情都更像是一个挑战。大约 3 周前,我对 SwapChain.ResizeBuffers() 函数没有真正的问题。

我换了 PC,切换到 Visual Studio Express 2012(从 Pro 9),并将我的解决方案切换到具有相应 SlimDX.dll 的 x64。

它仍然运行良好,但是当我调整承载视口(viewport)的窗口大小时,它得到:DXGI_ERROR_INVALID_CALL (-2005270527)。

在谷歌上的快速搜索告诉我战地风云 3 也可能存在某些特定驱动程序的问题。可能吗?

我已经阅读了我能找到的有关该功能的所有内容,但不知何故我无法找到现在正在搞砸的更改。希望有人能看到我做错了什么。

    // Form we are attached to.
private Dockable dock;

// Rendering stuff.
private Device device;
private Viewport viewport;
private SwapChain swapChain;
private RenderTargetView renderView;
private DepthStencilView depthView;

public Renderer(Dockable form)
{
if (form == null)
return;

dock = form;

CreateSwapchain();
Resize();
}

private void CreateSwapchain()
{
// Swap Chain & Device
SwapChainDescription description = new SwapChainDescription()
{
BufferCount = 1,
Usage = Usage.RenderTargetOutput,
OutputHandle = dock.Handle,
IsWindowed = true,
ModeDescription = new ModeDescription(dock.ClientSize.Width, dock.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm),
SampleDescription = new SampleDescription(1, 0),
Flags = SwapChainFlags.AllowModeSwitch,
SwapEffect = SwapEffect.Discard
};

Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, description, out device, out swapChain);
}

private void CreateRenderView()
{
// Dispose before resizing.
if (renderView != null)
renderView.Dispose();

if (depthView != null)
depthView.Dispose();

swapChain.ResizeBuffers(0, 0, 0, Format.Unknown, 0); // ERROR : DXGI_ERROR_INVALID_CALL when resizing the window, but not when creating it.
renderView = new RenderTargetView(device, Resource.FromSwapChain<Texture2D>(swapChain, 0));

Texture2DDescription depthBufferDesc = new Texture2DDescription()
{
ArraySize = 1,
BindFlags = BindFlags.DepthStencil,
CpuAccessFlags = CpuAccessFlags.None,
Format = Format.D16_UNorm,
Height = dock.ClientSize.Height,
Width = dock.ClientSize.Width,
MipLevels = 1,
OptionFlags = ResourceOptionFlags.None,
SampleDescription = new SampleDescription(1, 0),
Usage = ResourceUsage.Default
};

depthView = new DepthStencilView(device, new Texture2D(device, depthBufferDesc));
}

public void Resize()
{
CreateRenderView();

viewport = new Viewport(0.0f, 0.0f, dock.ClientSize.Width, dock.ClientSize.Height);
device.ImmediateContext.Rasterizer.SetViewports(viewport);
device.ImmediateContext.OutputMerger.SetTargets(depthView, renderView);
}

最佳答案

在调整它的大小之前,您需要释放与您的交换链关联的所有资源。

因此这包括渲染 View (您所做的),但是您在创建渲染目标 View 时对资源执行了 addref。

Resource.FromSwapChain<Texture2D>(swapChain, 0)

向纹理添加一个引用计数器。由于您不缓存它,因此无法释放它。

所以你需要做:

Texture2D resource = Texture2D.FromSwapChain<Texture2D>(swapChain, 0);
renderView = new RenderTargetView(device, resource);

然后在调用调整大小之前:

if (resource != null) { resource.Dispose(); }

刚刚在我的引擎上对其进行了测试并且它可以工作(而且你使用 0 是正确的,它也可以工作)。

关于c# - ResizeBuffers 时 DirectX 无效调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12910821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com