DX11 将顶点缓冲区映射为 WRL::ComPtr



我在映射顶点缓冲区时遇到问题。当我这样做时:

ID3D11Buffer* pD3DSingleVertexBuffer;
...
pD3DImmediateContext->Map(pD3DSingleVertexBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &mappedSubresource);

一切正常,所有帧都正常工作。但是,当我做这样的事情时:

Microsoft::WRL::ComPtr<ID3D11Buffer> pD3DSingleVertexBuffer;
...
pD3DImmediateContext->Map(pD3DSingleVertexBuffer.Get(), NULL, D3D11_MAP_WRITE_DISCARD, NULL, &mappedSubresource);

不会呈现任何内容,但应用程序不会崩溃,也没有任何错误。

你知道我做错了什么吗?

正如您所发现的,虽然创建 D3D 中常用的单元素数组的经典方法是只在单个元素上使用 address-of 运算符,但它也通常用于将输出参数传递给创建方法(例如 CreateDevice(&device))。 由于这是更常见的用法,尤其是在整个 Win32 API 图面的上下文中,因此ComPtr旨在安全地提供输出参数语义,在返回其地址之前Release()包含的对象。

有两种

方法可以解决此问题。 第一种是实际创建一个对象数组,例如 ID3D11Buffer** ppBuffers[] = { pBuffer.Get() }; .第二种是利用ComPtr::GetAddressOf返回所包含对象的地址而不更改其引用计数。 在后一种情况下,请注意不要在确实使用容器作为输出参数的情况下使用它,否则会泄漏先前持有的对象。

最新更新