在调用某些设备上下文函数时,我的一些 D3D11 对象将自己作为 ComPtr 清空

Some of my D3D11 objects null themselves as ComPtrs when calling certain Device Context functions

正在尝试启动 DX11 项目并运行。获得了大部分需要的对象和 运行 渲染的基础知识,但是当我调用 OMSetRenderTargets 或 IASetVertexBuffers 时,我为这些函数传递的对象在函数调用后自行为 null。

我所有的 ID3D11 对象都是使用 ComPtrs 制作的,我真的不知道会发生这种情况。有什么想法吗?

我试过将它们变成普通的旧指针,并且在将它们传递给所述函数时,它们不再停止自行清零。但我真的不想要那样,因为我试图让它们都成为 ComPtrs

您使用 ComPtr 遇到的问题非常简单:您正在使用 operator&,这与调用 ReleaseAndGetAddressOf.

相同

在典型的 COM 用法中,operator& 仅在创建新实例时使用,因此映射有意义:

// wicFactory can be either a IWICFactory* or a Microsoft::WRL::ComPtr<IWICFactory>
// and the following code will work.

HRESULT hr = CoCreateInstance(
    CLSID_WICImagingFactory,
    nullptr,
    CLSCTX_INPROC_SERVER,
    IID_PPV_ARG(&wicFactory));

但是,在 Direct3D 中,有许多函数将指向 COM 指针的指针作为输入参数,这些函数 不是 对象工厂,例如您列出的那些在你的问题中。在这种情况下,您应该使用 Get 方法或 GetAddressOf 可能带有临时变量:

context->OMSetRenderTargets(1, renderTargetView.GetAddressOf(),
    depthStencilView.Get());

-或-

auto rt = renderTargetView.Get();
context->OMSetRenderTargets(1, &rt, depthStencilView.Get());

如果需要 ComPtr 中的 COM 指针数组:

ID3D11SamplerState* samplers[] = { sampler1.Get(), sampler2.Get() };
context->PSSetSamplers(0, _countof(samplers), samplers);

有关 ComPtr 的一些一般使用建议,请参阅 this wiki