要初始化一个D3D窗口需要以下步骤
1.填充一个DXGI_SWAP_CHAIN_DESC结构体 也就是用来描述你所要创建的交换链的特性。
(交换链的特性有:
BufferDesc:描述了后台缓冲区的宽、高、像素格式等属性。
SampleDesc:描述了多重采样数量的质量级别,在龙书中统一设为1,0。
BufferUsage:设为DXGI_USAGE_RENDER_TARGET_OUTPUT,表示为将场景渲染到后台缓冲区。
BufferCount:交换链中后台缓冲区数量,一般只用一个后台缓冲区实现双缓存。
OutputWindow:将要渲染到的窗口句柄。
SwapEffect:设为DXGI_SWAP_EFFECT_DISCARD,让显卡驱动自己选择最高效的显示模式。
Flags:如果设为DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH,当应用切换到全屏时,D3D会自动选择与当前后台缓冲区设置最匹配的显示模式。等于0则默认当前桌面显示模式。)
2.使用D3D10CreatDeviceAndSwapChain函数 创建 ID3D10Device接口和ID3DGISwapChain接口
D3D10CreatDeviceAndSwapChain的各个参数意义;
第一个参数:表示要使用的显卡。为空值时默认为主显卡
第二个参数:总是设为D3D10_DRIVER_TYPE_HARDWARE表示使用3D硬件加快渲染速度,D3D10_DRIVER_TYPE_REFERENCE表示使用引用设备
第三个参数:一般设为空值。
第四个参数:当以release模式 生成程序时,应填0。当用debug模式时,应是D3D10_CREATE_DEVICE_DEBUG以激活调试层
第五个参数:在DX10中始终设为D3D10_SDK_VERSION
第六个参数:指向1.中创建的DXGI_SWAP_CHAIN_DESC结构体,用于描述交换链
第七个参数:返回创建的交换链对象
第八个参数:返回创建的设备对象
3.为交换链后台、深度/模板缓冲区创建相关的视图
1.为后台缓冲区建立渲染目标视图
使用mSwapChain->GetBuffer()和md3dDevice->CreatRenderTargerView()方法完成这部分工作,最后要releaseCOM()
GetBuffer()
第一个参数表示要获取的后台缓冲区的索引值。由于龙书只有一个后台缓冲所以这里都填0。
第二个参数是缓冲区的接口类型,通常是一个2D纹理(ID3D10Texture2D)
第三个参数是返回的后台缓冲的指针
CreatRenderTargetView
第一个参数指定将要作为渲染目标的资源,比如后台缓冲区作为渲染目标
第二个参数是一个指向D3D10_RENDER_TARGET_VIEW_DESC结构体的指针,描述了资源中元素的数据类型。分为(为空表示)资源自身的格式作为视图格式,强类型格式,弱类型格式。
第三个参数返回创建后的渲染目标对象
2.创建深度/模板缓冲区及其视图(其实深度缓冲区就是一个储存了深度信息的2D纹理)
首先填充一个D3D10_TEXTURE2D_DESC结构体描述要创建的纹理参数
然后调用ID3D10Device::CreatTexture2D方法
下面是一个例子
(图片传不上,在龙书中对应章节有)
4.将以上创建的视图绑定到渲染管线的输出合并器阶段,使他们可以被Direct3D使用
具体操作为:md3dDevice->OMSetRenderTargets(1, &mRenderTargetView,mDepthStencilView);
第一个参数是将要绑定的渲染目标的数量,可以为1也可以为多(高级技术)。第二个参数是将要绑定的渲染目标视图数组中第一个元素的指针。第三个参数是将要绑定到管线的深度/模板视图。(只能有一个)
5.设置视口
首先填充D3D10_VIEWPORT结构体,描述了视口的位置及大小深度(一般为0-1)等参数
之后使用md3dDevice->RSSetViewports(1, &vp);设置到D3D里
注意:视口大小不一定要和后台缓冲一样,比如使用视口实现双人游戏的分屏效果。创建两个视口,各占屏幕一半。第一个玩家使用左视口渲染,第二个玩家使用右视口渲染。