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

简介: 在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变,如下图所示:           这是因为我们改变了窗口大小,但后缓冲大小在程序初始化时候,已经被指定,不随着窗口改变而改变,这样在视口映射下,我们所渲染的三角形就改变了形状。

     在上篇教程中,我们实现了在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

相关文章
|
存储 索引
Directx11教程39 纹理映射(9)
在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理TextureClass* m_Texture;读入一个grass的纹理,程序执行后的效果如下: 完整的代码请参考: 工程文件myTutorialD3D11_32 代码下载: http://files.
927 0
Directx11教程(33) 纹理映射(3)
现在我们在myTutorialD3D11_5的基础上,来逐步编码实现纹理映射,之所以在myTutorialD3D11_5基础上改写,是因为这个工程只是画了一个三角形,便于我们贴一个纹理上去,然后改变纹理采样状态,观察纹理贴图的变化。
840 0
Directx11教程(35) 纹理映射(5)
到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);       这行代码装入一个dds文件,而且其它选项都设置为NULL,这时系统会使用装入文件本身的格式,比如我们装入的tong.dds, 前面我们为其产生了mipmaps层,并且设置surface格式为DXT5(对应于D3D11中BC3压缩格式)。
906 0
|
索引
Directx11教程36 纹理映射(6)
本章主要是整理代码,做以下两件事情: 1、把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是返回一个单位矩阵,没任何作用。如果要使其起作用,就要对每个model类都单独设置,很麻烦,比如我要画两个颜色立方体,岂不是要建立两个model类,而只是世界坐标矩阵不同。
840 0
Directx11教程(34) 纹理映射(4)
本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化。 原始的代码是:     // 创建纹理采样描述符 samplerDesc.
895 0
|
C++ 索引
Directx11教程37 纹理映射(7)
本章是在教程35、36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理。    lighttex.vs中顶点的结构现在为: struct VertexInputType {     float4 position : POSITION; ...
903 0
Directx11教程38 纹理映射(8)
上篇日志中,我们用纹理和光照颜色调制的方式得到最终颜色,本章我们尝试用纹理采样的颜色,直接做为材质的漫反射系数Kd,并用它来做光照计算,最后再做个gamma校正,如果不做的话,效果会偏亮。      lighttex.
846 0
|
图形学
Directx11教程40 纹理映射(10)
本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如下的效果:    把这两个图像以及光照产生的颜色融合生成以下图像:   为此我们新建一个lighttex2.
1062 0
Directx11教程(31) 纹理映射(1)
在前面的例子中,我们要么是直接给顶点赋颜色值,要么是在顶点属性中设置Diffuse和Specular系数,从而根据光照参数计算得到物体表面颜色,但这样得到的颜色真实感要差很多。如果我们直接把一副图像映射到三角形面上,从而得到物体表面颜色值,效果会好很多,比如下面的两幅图,右边的图是把一副图片映射到2个三角形上。
967 0
Directx11教程41 纹理映射(11)
1、第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8.     samplerDesc.Filter =  D3D11_FILTER_ANISOTROPIC;     samplerDesc.MaxAnisotropy = 8;      第二副图我们用了常用的3线性差值滤波方式   samplerDesc.Filter =  D3D11_FILTER_MIN_MAG_MIP_LINEAR;         按道理说,对于远处的纹理贴图,第一副图要好些,但我看起来,似乎这两个效果差不多,第二副效果也还可以,对于远处的贴图,我并没有发现模糊的效果。
940 0