在调用某些设备上下文函数时,我的一些 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。
正在尝试启动 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。