我在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方法运行,该方法将Handle作为pWindowHandle传递给函数。
创建设备调用成功,给我FEATURE_LEVEL_11_0,但第二个printf函数始终打印错误887a0001。使用参考设备没有帮助。我链接到d3dx11.lib,d3d11.lib,dxgi.lib,dxguid.lib,d3dcompiler.lib,d3d10.lib和d3dx10.lib。 我尝试用IID_ID3D11Texture2D替换__uuidof并没有区别。 我在Windows 7和Microsoft DirectX SDK(2010年6月)上使用Visual Studio Express 2013 for Windows Desktop。所有x86和x64,调试和发布版本都存在同样的问题。我尝试启用详细调试输出也会失败;我试图通过控制面板中的DirectX属性强制它,将我的程序添加到可执行文件列表中,但在运行时没有打印任何额外的内容。
答案 0 :(得分:1)
您刚刚错误地传递了最终参数。而不是:
err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)pTex);
您应该将指针传递给接口指针,如下所示:
err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pTex);
^
|