gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:32:10 25 4
gpt4 key购买 nike

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

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 返回包含对象的地址而不更改其引用计数。在后一种情况下,请注意不要在您真正使用容器作为输出参数的情况下使用它,否则您将泄漏之前保存的对象。

关于c++ - DX11 将顶点缓冲区映射为 WRL::ComPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35226122/

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