DX11 映射顶点缓冲区为 WRL::ComPtr
DX11 Mapping vertex buffer as 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()
ing 包含的对象它的地址。
有两种方法可以解决这个问题。第一个是实际创建一个对象数组,例如ID3D11Buffer** ppBuffers[] = { pBuffer.Get() };
。第二种是利用 ComPtr::GetAddressOf
其中 returns 包含对象的地址而不更改其引用计数。在后一种情况下,注意不要在你真正使用容器作为输出参数的情况下使用它,否则你会泄漏之前持有的对象。
我在映射顶点缓冲区时遇到问题。当我这样做时:
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()
ing 包含的对象它的地址。
有两种方法可以解决这个问题。第一个是实际创建一个对象数组,例如ID3D11Buffer** ppBuffers[] = { pBuffer.Get() };
。第二种是利用 ComPtr::GetAddressOf
其中 returns 包含对象的地址而不更改其引用计数。在后一种情况下,注意不要在你真正使用容器作为输出参数的情况下使用它,否则你会泄漏之前持有的对象。