gpt4 book ai didi

c++ - 使用 D3D12Device 调用 DuplicateOutput 失败并显示 E_NOINTERFACE

转载 作者:可可西里 更新时间:2023-11-01 11:47:44 37 4
gpt4 key购买 nike

我一直在尝试制作一个利用桌面复制 api 的应用程序,但没有使用 directx 的经验,结果证明这是一个相当大的挑战。似乎一切正常,直到我调用 output1->DuplicateOutput(),此时它返回 E_NOINTERFACE。 msdn 文档中未定义此错误,因此我无法诊断问题。我认为这段代码应该可以工作,但我一定遗漏了一些东西。

#include <windows.h>
#include <d3d12.h>
#include <dxgi1_5.h>

int main()
{
HRESULT hr;
ID3D12Debug *debug;
hr = D3D12GetDebugInterface(IID_PPV_ARGS(&debug));
debug->EnableDebugLayer();
IDXGIFactory1 *factory;
hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
IDXGIAdapter1 *adapter;
hr = factory->EnumAdapters1(0, &adapter);
factory->Release();
IDXGIOutput *junkput;
hr = adapter->EnumOutputs(0, &junkput);
IDXGIOutput1 *output1;
hr = junkput->QueryInterface(IID_PPV_ARGS(&output1));
junkput->Release();
ID3D12Device *device;
hr = D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));
IDXGIOutputDuplication *dupl;
hr = output1->DuplicateOutput(device, &dupl);
return 0;
}

在调试窗口中,我注意到调用 output1->DuplicateOutput 时出现两个 _com_errors。

更新:

我将问题缩小到我使用的是 ID3D12Device 而不是 ID3D11Device。这段代码有效的事实证明了这一点:

ID3D11Device *device;
D3D_FEATURE_LEVEL reallevel;
ID3D11DeviceContext *context;
hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, NULL, featurelevels, ARRAYSIZE(featurelevels), D3D11_SDK_VERSION, &device, &reallevel, &context);
IDXGIOutputDuplication *dupl;
hr = output1->DuplicateOutput(device, &dupl);

我不明白为什么这是个问题。桌面复制 api 是否与 directx 12 兼容?

最佳答案

DXGI DuplicateOutput 尚不支持 DirectX 12 设备。由于您没有使用 DirectX 的经验,无论如何您都应该使用 DirectX 11。 DirectX 12 是为假定已经非常熟悉 DirectX 11 的图形专家设计的 API。

Note that D3D11On12CreateDevice devices should work with DXGI DuplicateOutput, but I've not tried it myself.

关于c++ - 使用 D3D12Device 调用 DuplicateOutput 失败并显示 E_NOINTERFACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40165786/

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