

お世話になっております。DirectX12でスワップチェーンを生成したのですが、  
その後GetCurrentBackBufferIndexが0か1を返さない現象に遭遇しております。

使用ＯＳはwindows 10 64bit  
コンパイラは visual studio 2019です

コードは以下の通りです。

[code]

    ウインドウを生成しhwndを作成する
    void Window::CreateGameWindow( WNDCLASSEX& windowClass)
    {
        auto result = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
    
        m_windowClass.hInstance = GetModuleHandle(nullptr);
        m_windowClass.cbSize = sizeof(WNDCLASSEX);
        m_windowClass.lpfnWndProc = (WNDPROC) Windowprocedure;
        m_windowClass.lpszClassName = "DirectX12サンプル";
        RegisterClassEx(&m_windowClass);
    
        RECT wrc = {};
        wrc.left = 0;
        wrc.top = 0;
        wrc.right = window_width;
        wrc.bottom = window_height;
        AdjustWindowRect(&wrc, WS_OVERLAPPEDWINDOW, false);
    
    
        m_hwnd = CreateWindow(
            m_windowClass.lpszClassName,
            "DirectX12",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            wrc.right - wrc.left,
            wrc.bottom - wrc.top,
            nullptr,
            nullptr,
            m_windowClass.hInstance,
            nullptr
        );
    
         ShowWindow(m_hwnd, SW_SHOW);//ウィンドウ表示
    }
    
[/code]

[code]

    スワップチェーンを生成する
    DXGI_SWAP_CHAIN_DESC1 swapchainDesc = {};
       swapchainDesc.Width = window.window_width;
       swapchainDesc.Height = window.window_height;
       swapchainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
       swapchainDesc.Stereo = false;
       swapchainDesc.SampleDesc.Count = 1;
       swapchainDesc.SampleDesc.Quality = 0;
       swapchainDesc.BufferUsage = DXGI_USAGE_BACK_BUFFER;
       swapchainDesc.BufferCount = 2;
       swapchainDesc.Scaling = DXGI_SCALING_STRETCH;
       swapchainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
       swapchainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
       swapchainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
    
    
       auto result = m_dxgifactory->CreateSwapChainForHwnd(
           m_cqueue.Get(),
           hwnd,
           &swapchainDesc,
           nullptr,
           nullptr,
           (IDXGISwapChain1**)(m_swapchain.ReleaseAndGetAddressOf())
       );
    
[/code]

[code]

    　　　　//Tick処理。 バックバッファインデックスを呼び出す
            auto BbufferIndex = m_swapchain->GetCurrentBackBufferIndex();
    
[/code]

スワップチェーンの生成が失敗していると思われるのですが、生成時にS_OKを返しており、他にも要因があると思われます。

スワップチェーンが見かけ上成功したかに見えても失敗する要因があれば教えていただければ幸いです


CC BY-SA 4.0
2020-11-04T09:45:01.757
71720
2020-11-04T10:26:49.647
30635
question
c++
DirectX12 GetCurrentBackBufferIndexが0か1を返さない


`GetCurrentBackBufferIndex`は[`IDXGISwapChain3::GetCurrentBackBufferIndex`](https://docs.microsoft.com/en-
us/windows/win32/api/dxgi1_4/nf-
dxgi1_4-idxgiswapchain3-getcurrentbackbufferindex)のことでしょうか？ だとすると

>
[code]

>       auto result = m_dxgifactory->CreateSwapChainForHwnd(
>           m_cqueue.Get(),
>           hwnd,
>           &swapchainDesc,
>           nullptr,
>           nullptr,
>           (IDXGISwapChain1**)(m_swapchain.ReleaseAndGetAddressOf())
>       );
>  
[/code]

ここで無理やりC形式キャストしているのが気になります。

[code]

        ComPtr<IDXGISwapChain1> swapchain1;
        auto result = m_dxgifactory->CreateSwapChainForHwnd(
            m_cqueue.Get(),
            hwnd,
            &swapchainDesc,
            nullptr,
            nullptr,
            &swapChain1
        );
        result = swapchain1.As(&m_swapchain);
    
[/code]

ときちんと`IUnknown::QueryInterface`でキャストするとどうでしょうか？


CC BY-SA 4.0
2020-11-04T10:26:49.647
71721
2020-11-04T10:26:49.647
4236
71720
answer