DirectX11 Direct3D初始化

Direct3D初始化
1. Direct3D初始化步骤
下面将讲解如何初始化Direct3D。我们将Direct3D的初始化过程分为如下几个步骤:

1.使用D3D11CreateDevice方法创建ID3D11Device和ID3D11DeviceContext。
2.使用ID3D11Device::CheckMultisampleQualityLevels方法检测设备支持的4X多重采样质量等级。
3.填充一个IDXGI_SWAP_CHAIN_DESC结构体,该结构体描述了所要创建的交换链的特性。
4.查询IDXGIFactory实例,这个实例用于创建设备和一个IDXGISwapChain实例。
5.为交换链的后台缓冲区创建一个渲染目标视图。
6.创建深度/模板缓冲区以及相关的深度/模板视图。
7.将渲染目标视图和深度/模板视图绑定到渲染管线的输出合并阶段,使它们可以被Direct3D使用。
8.设置视口。

2. 创建设备(Device)和上下文(Context)
要初始化Direct3D,首先需要创建Direct3D 11设备(ID3D11Device)和上下文(ID3D11DeviceContext)。它们是是最重要的Direct3D接口,可以被看成是物理图形设备硬件的软控制器;也就是说,我们可以通过该接口与硬件进行交互,命令硬件完成一些工作(比如:在显存中分配资源、清空后台缓冲区、将资源绑定到各种管线阶段、绘制几何体)。具体而言:

1. ID3D11Device接口用于检测显示适配器功能和分配资源。

2. ID3D11DeviceContext接口用于设置管线状态、将资源绑定到图形管线和生成渲染命令。

设备和上下文可用如下函数创建:

HRESULT  D3D11CreateDevice (
    IDXGIAdapter  *pAdapter,
    D3D_DRIVER_TYPE  DriverType,
    HMODULE  Software ,
    UINT  Flags ,
    CONST  D3D_FEATURE_LEVEL  *pFeatureLevels ,
    UINT  FeatureLevels ,
    UINT  SDKVersion,
    ID3D11Device  **ppDevice ,
    D3D_FEATURE_LEVE L  *pFeatureLevel,
    ID3D11DeviceContext  **ppImmediateContext
);

1.pAdapter:指定要为哪个物理显卡创建设备对象。当该参数设为空值时,表示使用主显卡。在本书的示例程序中,我们只使用主显卡。

2.DriverType:一般来讲,该参数总是指定为D3D_DRIVER_TYPE_HARDWARE,表示使用3D硬件来加快渲染速度。但是,也可以有两个其他选择:

D3D_DRIVER_TYPE_REFERENCE:创建所谓的引用设备(reference device)。引用设备是Direct3D的软件实现,它具有Direct3D的所有功能(只是运行速度非常慢,因为所有的功能都是用软件来实现的)。引用设备随DirectX SDK一起安装,只用于程序员,而不应该用于程序发布。使用引用设备有两个原因:

测试硬件不支持的代码;例如,在一块不支持Direct3D 11的显卡上测试一段Direct3D 11的代码。
测试驱动程序缺陷。当代码能在引用设备上正常运行,而不能在硬件上正常工作时,说明硬件的驱动程序可能存在缺陷。
D3D_DRIVER_TYPE_SOFTWARE:创建一个用于模拟3D硬件的软件驱动器。要使用软件驱动器,你必须自己创建一个,或使用第三方的软件驱动器。与下面要说的WARP驱动器不同,Direct3D不提供软件驱动器。

D3D_DRIVER_TYPE_WARP:创建一个高性能的Direct3D 10.1软件驱动器。WARP代表Windows Advanced Rasterizati on Platform。因为WARP不支持Direct3D 11,因此我们对它不感兴趣。

3.Software:用于支持软件光栅化设备(software rasterizer)。我们总是将该参数设为空值,因为我们使用硬件进行渲染。如果读者想要使用这一功能,那么就必须先安装一个软件光栅化设备。

4.Flags:可选的设备创建标志值。当以release模式生成程序时,该参数通常设为0(无附加标志值);当以debug模式生成程序时,该参数应设为:

D3D11_CREATE_DEVICE_DEBUG:用以激活调试层。当指定调试标志值后,Direct3D会向VC++的输出窗口发送调试信息;图4.6展示了输出错误信息的一个例子。

这里写图片描述
(Direct3D 11调试输出的一个例子)

5.pFeatureLevels:D3D_FEATURE_LEVEL数组,元素的顺序表示要特征等级(见§4.1.9)的测试顺序。将这个参数设置为null表示选择可支持的最高等级。

6.FeatureLevels:pFeatureLevels数组中的元素D3D_FEATURE_LEVELs的数量,若pFeatureLevels设置为null,则这个值为0。

7.SDKVersion:始终设为D3D11_SDK_VERSION。

8.ppDevice:返回创建后的设备对象。

9.pFeatureLevel:返回pFeatureLevels数组中第一个支持的特征等级(如果pFeatureLevels 为null,则返回可支持的最高等级)。

10.ppImmediateContext:返回创建后的设备上下文。

下面是调用该函数的一个示例:

UINT createDeviceFlags = 0;

#if  defined(DEBUG)||defined(_DEBUG)
    createDeviceFlags  |= D3D11_CREATE_DEVICE_DEBUG;
#endif

D3D_FEATURE_LEVEL featureLevel;
ID3D11Device *  md3dDevice;
ID3D11Device Context*  md3dImmediate Context;
HRESULT  hr = D3D11CreateDevice(
    0,                     //  默认显示适配器
    D3D_DRIVER_TYPE_HARDWARE ,
    0,                     //  不使用软件设备
    createDeviceFlags ,
    0, 0,               //  默认的特征等级数组
    D3D11_SDK_VERSION,
    &  md3dDevice ,
    & featureLevel,
    &  md3dImmediateContext);
if(FAILED(hr) )
{
    MessageBox(0, L"D3D11CreateDevice Failed.", 0, 0);
    return  false ;
}
if(featureLevel != D3D_FEATURE_LEVEL_11_0)
{
    MessageBox(0<
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值