D3D窗口的初始化

要初始化一个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里

注意:视口大小不一定要和后台缓冲一样,比如使用视口实现双人游戏的分屏效果。创建两个视口,各占屏幕一半。第一个玩家使用左视口渲染,第二个玩家使用右视口渲染。

原文地址:https://www.cnblogs.com/CAION/p/2809009.html