Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建交换链失败2.0_C++_Directx - Fatal编程技术网

C++ 创建交换链失败2.0

C++ 创建交换链失败2.0,c++,directx,C++,Directx,我的D3D11CreateDevice和SwapChain()有问题。我以为我在上一个线程中得到了一个解决方案,所以我已经将它标记为已解决。[ 看来我在无意中将HRESULT作为bool返回时愚弄了自己 我整天都在解决这个问题,但还没有解决。这里有一些关于输入和输出的调试信息 1]接受建议,将UNKNOWN与非空VAAdapter一起使用: 2]通过将DX样本保留为空并使用类型硬件来跟踪DX样本: 图片可能足以让人发现问题,但如果是其他问题,代码: // This is some

我的D3D11CreateDevice和SwapChain()有问题。我以为我在上一个线程中得到了一个解决方案,所以我已经将它标记为已解决。[

看来我在无意中将HRESULT作为bool返回时愚弄了自己

我整天都在解决这个问题,但还没有解决。这里有一些关于输入和输出的调试信息

1]接受建议,将UNKNOWN与非空VAAdapter一起使用:

2]通过将DX样本保留为空并使用类型硬件来跟踪DX样本:

图片可能足以让人发现问题,但如果是其他问题,代码:

//      This is some relevant stuff [anything referenced] in the class.

Graphics(){
    selectedVAdapter=NULL;
    deviceInterface=NULL;
    deviceContext=NULL;
    swapChain=NULL;
}

bool initDevice(HWND &hWnd){
    HRESULT success=S_OK;

    D3D_FEATURE_LEVEL featureLevels[]={
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_3,
    };
    uint featuresSize=ARRAYSIZE(featureLevels);

    D3D_DRIVER_TYPE driverTypes[]={
        D3D_DRIVER_TYPE_UNKNOWN, // Needed for manual vid adapter setting
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };
    uint driversSize=ARRAYSIZE(driverTypes);

    refreshVideoAdapters();
    setVideoAdapter();

    //setSampleQuality();

    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory(&sd, sizeof(sd));
    sd.BufferCount = settings.bufferCount;
    sd.BufferDesc.Width = settings.width;
    sd.BufferDesc.Height = settings.height;
    sd.BufferDesc.Format = settings.colorDepth;
    sd.BufferDesc.RefreshRate.Numerator = settings.rateNumerator;
    sd.BufferDesc.RefreshRate.Denominator = settings.rateDenominator;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = hWnd;
    sd.SampleDesc.Count = settings.sampleCount;
    sd.SampleDesc.Quality = settings.sampleQuality;
    sd.Windowed = !settings.fullScreen;

    uint flag=0;
    #ifdef _DEBUG
        flag|=D3D11_CREATE_DEVICE_DEBUG;
    #endif

    for(uint i=0; i<driversSize; i++){ // SwapChain: http://msdn.microsoft.com/en-us/library/ff476083%28v=vs.85%29.aspx
        D3D_DRIVER_TYPE driver=driverTypes[i];
        success=D3D11CreateDeviceAndSwapChain(
            //NULL,
            selectedVAdapter, driver, NULL, flag,
            featureLevels, featuresSize, D3D11_SDK_VERSION, &sd,
            &swapChain, &deviceInterface, &selectedFeatureLevel, &deviceContext);
        if(SUCCEEDED(success)) break;
    }

    return SUCCEEDED(success);
}

//      Methods to manage video adapters
void refreshVideoAdapters(){
    IDXGIAdapter1* pAdapter;
    IDXGIFactory1* pFactory=NULL;

    uint lastID=0;
    if(selectedVAdapter){
        DXGI_ADAPTER_DESC1* desc=NULL;
        selectedVAdapter->GetDesc1(desc);
        lastID=desc->DeviceId;
        releaseVideoAdapters();
    }

    if(FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory))) return;

    for(uint i=0; pFactory->EnumAdapters1(i, &pAdapter)!=DXGI_ERROR_NOT_FOUND; i++){
        vAdapters.push_back(pAdapter);

        if(lastID){
            DXGI_ADAPTER_DESC1* desc=NULL;
            pAdapter->GetDesc1(desc);
            if(lastID==desc->DeviceId){
                selectedVAdapter=pAdapter;
                lastID=0;
            }
        }
    }

    if(pFactory) pFactory->Release();
}
void releaseVideoAdapters(){
    for(uint i=0; i<vAdapters.size(); i++){
        vAdapters[i]->Release();
        vAdapters[i]=NULL;
    }
    vAdapters.clear();
    selectedVAdapter=NULL;
}
IDXGIAdapter1* getVideoAdapter(){return selectedVAdapter;}
bool setVideoAdapter(uint num=0){
    if(num<vAdapters.size()){
        selectedVAdapter=vAdapters[num];
        return 1;
    }
    return 0;
}

// Member vars
private:
SettingsGraphicsDevice settings;

D3D_FEATURE_LEVEL selectedFeatureLevel;

vector<IDXGIAdapter1*> vAdapters;
IDXGIAdapter1* selectedVAdapter;

ID3D11Device* deviceInterface;
ID3D11DeviceContext* deviceContext;
IDXGISwapChain* swapChain;

谢谢你的阅读。希望这次能找到解决方案。

切换到该颜色模式[DXGI_格式\u r8G8A8_UNORM]起作用。我现在没事了。如果其他颜色模式不起作用,为什么会存在?

切换到该颜色模式[DXGI_格式\u R8G8B8A8_UNORM]起作用。我现在没事了。如果其他颜色模式不起作用,为什么会存在呢?

复制并粘贴我的评论:“另外,快速浏览一下我的代码,我会使用DXGI_格式_R8G8B8A8_UNORM,尽管我目前不知道这是否是正确的模式。”。好的,现在答案是:-)

是的,格式。。。DXGI_格式是一个相当大的枚举,但在许多情况下只允许某些格式。不管是全屏还是非全屏,只允许某些格式显示,这一点也不奇怪

我从文档中得到了我使用的值(和往常一样),特别是描述中的列表。我实际上不知道我是否在创建blt块传输交换链,但我决定这些值与任何一个值一样好,尽管我不关心功能级别9,但它看起来相当安全:-)


我不知道为什么您的代码似乎在空适配器下工作;我认为这令人困惑。也许调试运行时会捕捉到它?

从我的评论中复制并粘贴:“另外,快速浏览我的代码表明我使用的是DXGI_格式\u R8G8B8A8_UNORM,尽管我目前不知道这是否是正确的模式。”。好的,现在答案是:-)

是的,格式。。。DXGI_格式是一个相当大的枚举,但在许多情况下只允许某些格式。不管是全屏还是非全屏,只允许某些格式显示,这一点也不奇怪

我从文档中得到了我使用的值(和往常一样),特别是描述中的列表。我实际上不知道我是否在创建blt块传输交换链,但我决定这些值与任何一个值一样好,尽管我不关心功能级别9,但它看起来相当安全:-)


我不知道为什么您的代码似乎在空适配器下工作;我认为这令人困惑。也许调试运行时会捕捉到它?

很抱歉听到这个消息。您忽略了MSDN中给出的另一条建议:当您使用全屏时,您应该创建一个带窗口的交换链,然后将其设置为全屏。无论哪种方式,因为您没有全屏显示:您是否尝试将刷新率值保留为0?此外,快速浏览一下我的代码,可以发现我使用的是DXGI_格式_R8G8B8A8_UNORM,尽管我目前不知道这是否是正确的模式。正在工作:-)是的,我处于窗口模式,刷新率为0。我会试试那个颜色模式。很抱歉听到这个。您忽略了MSDN中给出的另一条建议:当您使用全屏时,您应该创建一个带窗口的交换链,然后将其设置为全屏。无论哪种方式,因为您没有全屏显示:您是否尝试将刷新率值保留为0?此外,快速浏览一下我的代码,可以发现我使用的是DXGI_格式_R8G8B8A8_UNORM,尽管我目前不知道这是否是正确的模式。正在工作:-)是的,我处于窗口模式,刷新率为0。我将尝试使用color mode.DXGI格式取决于资源(纹理/缓冲区)的使用情况,因此并非所有格式都允许使用,这取决于您想使用它们做什么,检查格式支持Sdxgi格式取决于资源(纹理/缓冲区)的使用情况,因此并非所有格式都允许使用,这取决于您想使用它们做什么,检查格式支持示例显示它使用空适配器初始化。我认为它默认为第一个适配器。另外,说“适配器=视频卡”是否正确?示例显示它使用空适配器初始化。我认为它默认为第一个适配器。另外,说“适配器=视频卡”是否正确?
struct SettingsGraphicsDevice{
    uint width, height;
    bool fullScreen, vsync;
    uint rateNumerator;
    uint rateDenominator;
    uint bufferCount;
    uint sampleCount, sampleQuality;
    DXGI_FORMAT colorDepth;
    float minDist, maxDist;

    SettingsGraphicsDevice(){
        width=height=0;
        fullScreen=0;
        vsync=0;

        rateNumerator=0;
        rateDenominator=1;
        bufferCount=1;
        sampleCount=1, sampleQuality=0;
        colorDepth=DXGI_FORMAT_R8G8B8A8_UINT;

        minDist=0.1f;
        maxDist=1000.0f;
    }

};