首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DirectX 11中的更改解决方案

DirectX 11中的更改解决方案
EN

Stack Overflow用户
提问于 2014-12-04 18:41:50
回答 1查看 4.7K关注 0票数 1

如何在DirectX 11中更改屏幕分辨率?是否有一种简单的方法可以做到这一点,或者我必须完全重新创建这个交换链,并创建一个新的后台缓冲区和呈现目标视图?

EN

回答 1

Stack Overflow用户

发布于 2014-12-06 00:00:37

DXGI自动处理调整“前缓冲区”大小的操作,即显示给用户的交换链部分。但是,应用程序负责调整“回缓冲区”的大小。当您这样做时,您还应该处理重新创建所有“windows大小依赖”的资源。

基本逻辑非常简单:

代码语言:javascript
运行
复制
// 1. Clear the existing references to the backbuffer
ID3D11RenderTargetView* nullViews [] = { nullptr };
m_d3dContext->OMSetRenderTargets(ARRAYSIZE(nullViews), nullViews, nullptr);
m_renderTargetView.Reset(); // Microsoft::WRL::ComPtr here does a Release();
m_depthStencilView.Reset();
m_d3dContext->Flush();

// 2. Resize the existing swapchain
hr = m_swapChain->ResizeBuffers(2, backBufferWidth, backBufferHeight, backBufferFormat, 0);
if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
    // You have to destroy the device, swapchain, and all resources and
    // recreate them to recover from this case. The device was hardware reset,
    // physically removed, or the driver was updated and/or restarted

在此之后,其余的步骤就是您第一次创建交换链时所做的工作。

代码语言:javascript
运行
复制
// 3. Get the new backbuffer texture to use as a render target
hr = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), &backBuffer);

hr = m_d3dDevice->CreateRenderTargetView(backBuffer.Get(), nullptr, &m_renderTargetView);

// 4. Create a depth/stencil buffer and create the depth stencil view
CD3D11_TEXTURE2D_DESC depthStencilDesc(depthBufferFormat, backBufferWidth, backBufferHeight, 1, 1, D3D11_BIND_DEPTH_STENCIL);
hr = m_d3dDevice->CreateTexture2D(&depthStencilDesc, nullptr, &depthStencil);

CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D);
hr = m_d3dDevice->CreateDepthStencilView(depthStencil.Get(), &depthStencilViewDesc, &m_depthStencilView));

// 5. Reset the rendering viewport to the new size
CD3D11_VIEWPORT viewPort(0.0f, 0.0f, static_cast<float>(backBufferWidth), static_cast<float>(backBufferHeight));
m_d3dContext->RSSetViewports(1, &viewPort);

// 6. Reset your camera's aspect ratio based on backBufferWidth/backBufferHeight

// 7. Set your render target view/depth stencil view for rendering
m_d3dContext->OMSetRenderTargets(1, m_renderTargetView.GetAddressOf(), m_depthStencilView.Get());

对于Win32桌面应用程序,诀窍是准确地知道什么时候进行这个过程。

代码语言:javascript
运行
复制
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;

    static bool s_in_sizemove = false;
    static bool s_minimized = false;

    switch (message)
    {

    ...

    case WM_SIZE:
        if (wParam == SIZE_MINIMIZED)
        {
            if (!s_minimized)
            {
                s_minimized = true;
                // Your app should probably suspend
            }
        }
        else if (s_minimized)
        {
            s_minimized = false;
            // Your app should resume
        }
        else if ( !s_in_sizemove )
            // HERE is where you'd trigger a resize based on MINIMIZE/MAXIMIZE/RESTORE
        break;

    case WM_ENTERSIZEMOVE:
        s_in_sizemove = true;
        break;

    case WM_EXITSIZEMOVE:
        s_in_sizemove = false;
        // HERE is where you'd trigger a resize based on the user resizing the window
        break;

       case WM_GETMINMAXINFO:
       {
            // You should set a minimize window size that is reasonable for your app. Here I use 320x200
           auto info = reinterpret_cast<MINMAXINFO*>(lParam);
            info->ptMinTrackSize.x = 320;
            info->ptMinTrackSize.y = 200;
        }
        break;
    }

    ...
    return DefWindowProc(hWnd, message, wParam, lParam);
}

对于Windows应用程序/Windows应用程序,VS模板具有创建设备的独特功能,另一个用于创建依赖于设备的资源,另一个用于创建窗口大小依赖的资源。最后一次调用是为了调整大小。

全屏模式有点棘手,但基本上是一样的。如果您的应用程序不支持全屏,您应该确保禁用默认的ALT+ENTER行为,方法是在第一次创建空白链并设置HWND关联时调用此行为:

代码语言:javascript
运行
复制
dxgiFactory->MakeWindowAssociation(hWnd, DXGI_MWA_NO_ALT_ENTER);

Windows应用程序/Windows应用程序不允许真正的“全屏”模式分辨率更改,因此这种情况不适用于它们。

请参阅DirectX图形基础设施:最佳实践

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27301550

复制
相关文章

相似问题

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