我正在DirectX11中创建一个设备和交换链,然后尝试获取回缓冲区的纹理。创建步骤似乎有效,但是GetBuffer调用总是失败的,错误DXGI_ERROR_INVALID_CALL (887a0001),不管我做什么。下面是创建设备的代码:
D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_1 };
int numFeatureLevels = sizeof(featureLevels) / sizeof(featureLevels[0]);
DXGI_SWAP_CHAIN_DESC swapChainDesc;
ID3D11Device* pDevice;
IDXGISwapChain* pSwapChain;
D3D_FEATURE_LEVEL featureLevel;
ID3D11DeviceContext* pContext;
swapChainDesc.Windowed = TRUE;
swapChainDesc.OutputWindow = (HWND)(void*)pWindowHandle;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferCount = 2;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferDesc.Width = 0;
swapChainDesc.BufferDesc.Height = 0;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 1;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 60;
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
swapChainDesc.BufferUsage = DXGI_USAGE_SHADER_INPUT|DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.Flags = 0;
err = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, featureLevels, numFeatureLevels, D3D11_SDK_VERSION,
&swapChainDesc, &pSwapChain, &pDevice, &featureLevel, &pContext);
if (!SUCCEEDED(err))
{
printf("D3D11CreateDeviceAndSwapChain failed with error %08x\n", err);
return false;
}
m_pDevice = pDevice;
m_pSwapChain = pSwapChain;
m_pDeviceContext = pContext;
m_featureLevel = featureLevel;
ID3D11Texture2D* pTex = NULL;
err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)pTex);
if (!SUCCEEDED(err))
{
printf("GetBuffer failed with error %08x\n", err);
return false;
}
这是托管C++,它被编译成DLL并从C#控件的OnCreateControl方法中运行,后者将句柄作为pWindowHandle传递到函数中。
创建设备调用成功,给出了FEATURE_LEVEL_11_0,但是第二个printf函数总是打印错误887a0001。使用参考装置没有帮助。我将链接到d3dx11.lib、d3d11.lib、dxgi.lib、dxguid.lib、d3dcompiler.lib、d3d10.lib和d3dx10.lib。我试着用__uuidof替换IID_ID3D11Texture2D,这并没有什么不同。我在Windows7上使用2013 for Windows和(2010年6月)。所有x86和x64、调试和发行版构建都面临相同的问题。我启用详细调试输出的尝试也失败了;我试图通过控制面板中的DirectX属性强制执行,将我的程序添加到可执行文件列表中,但是在运行时没有额外的输出。
发布于 2014-04-25 04:37:54
你刚刚不正确地通过了最后一个论点。而不是这样:
err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)pTex);
您应该将指针传递到接口指针,如下所示:
err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pTex);
^
|
https://stackoverflow.com/questions/23280501
复制相似问题