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

3

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

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
好的,我已经解决了这个问题,长话短说,在代码后面我使用了这个:pD3DImmediateContext->IASetVertexBuffers(0, 1, &pD3DSingleVertexBuffer, &stride, &offset); 而不是这个 pD3DImmediateContext->IASetVertexBuffers(0, 1, pD3DSingleVertexBuffer.GetAddressOf(), &stride, &offset); - Bartosz Boczula
1个回答

2
正如您所发现的,D3D中创建单元素数组的传统方法常常是直接使用单元素的地址运算符,但它也常用于将输出参数传递给创建方法(例如CreateDevice(&device))。由于这是更常见的用法,特别是在整个Win32 API表面上下文中,ComPtr被设计为安全地提供输出参数语义,在返回其地址之前释放包含的对象。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接