DirectX 11 学习笔记-Demo-01

前言 

这个Demo包含了《Introduction to 3D Game Programming with Directx 11》前12章的内容,我将它们都整合到同一个Demo中。学习的过程中还是建议循序渐进,按照书本的介绍进行练习。 

另外,我不会详细介绍代码的每一部分,所以如果希望学习相关内容,可以结合书本阅读源码。 

Demo源码可以在GitHub上获取 https://github.com/ZealotAlie/D11Demo0

项目配置 

首先下载书本提供的源码。由于版本问题,可能需要根据Direct3D 11 Book Demos with Windows 10 and Visual Studio 2015一文来更新Demo中的代码。Demo中主要使用了Common中的代码。我将这部分代码编成lib,从而能够在Demo中使用。另外d3dUtil中的CreateTexture2DArraySRV函数已经过时,我简单修改过这个函数,从而让它能够使用。 

另外可能需要根据使用的Visual Studio版本自行编译Effect库,如果使用的是win10,Effect的代码可以直接从GitHub上下载。此外Microsoft DirectX SDK (June 2010) 中包含了较早版本的Effects项目,可以直接编译成lib并使用。 

我的Demo中的代码相比书中的源码做了一部分修改,你可以参照学习。 

D3DApp 

主要用于初始化一个D3D的桌面应用,InitMainWindow中创建了窗口程序,InitDirect3D中完成对D3D的初始化。初始化D3D首先我们需要调用D3D11CreateDevice创建一个Device和一个DeviceContext。创建Device时可以选择适配器,驱动类型等,另外也可以指定最高支持的D3D_FEATURE_LEVEL。创建完成后,pFeatureLevels会返回Device实际支持的Level数组,按照降序排列,也就是说pFeatureLevels[0]是最高level。这里需要指出的是,如果没有特别指定Level,接口不会创建D3D_FEATURE_LEVEL_11_1,默认只创建到D3D_FEATURE_LEVEL_11_0。 

HRESULT hr = D3D11CreateDevice( 

0,                 // default adapter 

md3dDriverType, 

0,                 // no software device 

createDeviceFlags,  

0, 0,              // default feature level array 

D3D11_SDK_VERSION, 

&md3dDevice, 

&featureLevel, 

&md3dImmediateContext); 

创建完成Device和Context后,需要创建交换链。由于交换链属于底层图形接口,所以不能用Device来创建,和Device一样,需要使用IDXGIFactory来创建交换链。创建交换链的Factory必须和设备是同一个,所以这里先要获取创建设备的Factory,然后再用这个Factory创建交换链。创建交换链需要提供一个DXGI_SWAP_CHAIN_DESC参数,参数中具体的内容可以参照 MSDN。 

IDXGIDevice* dxgiDevice = 0; 

HR(md3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice)); 

       

IDXGIAdapter* dxgiAdapter = 0; 

HR(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&dxgiAdapter)); 



IDXGIFactory* dxgiFactory = 0; 

HR(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory)); 



HR(dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain)); 

设备和交换链创建完成后会调用一次OnResize来创建/修改与屏幕尺寸相关的内容,主要是交换链缓冲区大小/深度模板缓冲区大小/视口大小等。 

Camera和CamerController 

Camera实际是书本14章的内容,这里直接拿来使用。需要注意的是Camera和屏幕的长宽比是有关系的,所以在Resize的时候需要重新设置参数。 CameraController用于控制摄像头移动,这里只简单实现了一个环绕摄像头,通过鼠标左右键拖拽可以完成旋转和缩放的操作。 

D11DemoApp 

继承自D3DApp,定义了场景的光照属性,另外也定义了一个离屏的纹理,主要用于处理模糊特效使用。 

Demo中定义了一个简单的RenderObject类,用于表示场景中的元素。D11DemoApp中有一个列表用于存放场景中的RenderObject。在绘制时,D11DemoApp首先在我们定义的离屏纹理上进行渲染,RenderObject可能是透明的也可能是不透明的,所以这里每个Object都会被遍历两次,第一次调用Draw绘制不透明的部分,再调用DrawTransparency来绘制透明的部分,确保绘制顺序。 场景绘制完成后,对离屏纹理做模糊处理,最后将模糊后的纹理绘制到屏幕上即可。 

DirectX 11 学习笔记-Demo-01_第1张图片

通过鼠标左键右键拖拽可以控制摄像头,键盘的ASDW可以用于控制骷髅的位置,↑和↓用于控制高斯模糊的次数,模糊次数越多场景越模糊。

你可能感兴趣的:(DirectX,C++)