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

代码下载:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值