首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DirectX 11 IDXGISwapChain::GetBufferwithwithDXGI_ERROR_INVALID_CALL

DirectX 11 IDXGISwapChain::GetBufferwithwithDXGI_ERROR_INVALID_CALL
EN

Stack Overflow用户
提问于 2014-04-24 21:47:50
回答 1查看 4.4K关注 0票数 1

我正在DirectX11中创建一个设备和交换链,然后尝试获取回缓冲区的纹理。创建步骤似乎有效,但是GetBuffer调用总是失败的,错误DXGI_ERROR_INVALID_CALL (887a0001),不管我做什么。下面是创建设备的代码:

代码语言:javascript
运行
复制
    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属性强制执行,将我的程序添加到可执行文件列表中,但是在运行时没有额外的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-25 04:37:54

你刚刚不正确地通过了最后一个论点。而不是这样:

代码语言:javascript
运行
复制
err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)pTex);

您应该将指针传递到接口指针,如下所示:

代码语言:javascript
运行
复制
err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pTex);
                                                                    ^
                                                                    |
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23280501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档