• Directx11教程(6) 画一个简单的三角形(2)


         在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变,如下图所示:

    image

        

         这是因为我们改变了窗口大小,但后缓冲大小在程序初始化时候,已经被指定,不随着窗口改变而改变,这样在视口映射下,我们所渲染的三角形就改变了形状。

    下面我们将对程序进行一些小的改动,从而实现改变窗口大小,而渲染的图形形状不变。

        首先是SystemClass.cpp,主要是增加了WM_SIZE消息的处理,当窗口大小改变时候,我们重新调用GraphicsClass的初始化函数,该函数中将会重新生成创建D3DClass,从而从新产生swapchain等等。主要改动代码如下:

    LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
        {

        case WM_KEYUP:
            {
            m_Input->KeyUp((unsigned int)wparam);
            return 0;
            }
            //任何其它消息发送到windows缺省处理.
        case WM_SIZE:
            {
            int screenWidth = 0, screenHeight = 0;
            screenWidth  = LOWORD(lparam);
            screenHeight = HIWORD(lparam);
            // 窗口大小改变时,重新初始化图形对象
            if(m_Graphics)
                {
                bool result = m_Graphics->Initialize(screenWidth, screenHeight, m_hwnd);
                if(!result)
                    {
                    return false;
                    }
                }

            return 0;
            }
        default:
            {
            return DefWindowProc(hwnd, umsg, wparam, lparam);
            }
            }
        }

    GraphicsClass.cpp的初始化函数也进行了小小的改动,就是在函数的开始,先调用Shutdown()函数。

    bool GraphicsClass:: Initialize(int screenWidth, int screenHeight, HWND hwnd)
        {
        bool result;

        //如果对象已经存在,先释放掉它们
        Shutdown();

        // 创建一个D3DClass对象.

    … 
        }

         第三个小改动是在D3CClass的初始化函数中,定义numerator和denominator这两个刷新率相关变量时候,要赋初值。如果不赋初值的话,当改变窗口大小时候,可能超找不到合适的刷新率,引起程序异常。

    代码如下:

    //Initialize函数包含完成D3D设置的所有代码。
    bool D3DClass::Initialize(int screenWidth, int screenHeight, bool vsync, HWND hwnd, bool fullscreen,
        float screenDepth, float screenNear)
        {
        HRESULT result;
        IDXGIFactory* factory;
        IDXGIAdapter* adapter;
        IDXGIOutput* adapterOutput;
        unsigned int numModes, i, numerator=0, denominator=1, stringLength;
        DXGI_MODE_DESC* displayModeList;
        DXGI_ADAPTER_DESC adapterDesc;
        int error;

    }

    程序运行后,现在我们再更变窗口大小,则三角形的形状不会改变。

    image

     

    完整的代码请参考:

    工程文件myTutorialD3D11_5

    代码下载:

    https://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip

  • 相关阅读:
    Teamwork——Week4 团队分工和预估项目时间
    Team Homework #3 软件工程在北航——IloveSE
    《DWZ笔记一》<select>动态联动菜单
    asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现
    经典SQL语句基础50题
    打垮美国发起的这场经济战争[转自由凤凰论坛]
    为什么要删我贴呢?
    5年,从5元到500万,我的创业经历(转自VFP精英站,未完)
    发现大家对销售感兴趣,再来两则(二)
    你们知道美国是怎么报道别人的灾难吗?
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2390018.html
Copyright © 2020-2023  润新知