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

时间:2016-02-05 14:04:11

标签: c++ directx directx-11

我在映射顶点缓冲区方面遇到了麻烦。当我这样做时:

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);

没有渲染,但应用程序不会崩溃,也不会有任何错误。

你知道我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

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

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