Direc3D设备对象

来源:互联网 发布:淘宝太坑了女主角视频 编辑:程序博客网 时间:2024/05/19 06:36

1.创建Direct3D设备对象

在创建Direct3D设备对象之前,先需要初始化交换链DXGI_SWAP_CHAIN_DESC。

typedef struct DXGI_SWAP_CHAIN_DESC {

 DXGI_MODE_DESC   BufferDesc;

 DXGI_SAMPLE_DESC SampleDesc;

 DXGI_USAGE       BufferUsage;

 UINT             BufferCount;

 HWND             OutputWindow;

 BOOL             Windowed;

 DXGI_SWAP_EFFECT SwapEffect;

 UINT             Flags;

} DXGI_SWAP_CHAIN_DESC;

其中:

BufferDesc指定后台缓冲区(BackBuffer)的显示模式。该成员是DXGI_MODE_DESC类型,DXGI_MODE_DESC类型定义如下:

typedef struct DXGI_MODE_DESC {

 UINT                     Width;

 UINT                     Height;

 DXGI_RATIONAL           RefreshRate;

 DXGI_FORMAT              Format;

 DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;

 DXGI_MODE_SCALING        Scaling;

} DXGI_MODE_DESC;

Width指定后台缓冲区的宽度(以像素为单位)。如果图形以窗口方式显示并且该变量被设置为0,则系统自动使用显示窗口客户区的宽度作为后台缓冲区的宽度。

 

Height指定后台缓冲区的高度(以像素为单位)。如果图形以窗口方式显示并且该变量被设置为0,则系统自动使用显示窗口客户区的宽度作为后台缓冲区的高度。

 

RefreshRate指定显示适配器刷新屏幕的速率。该成员是DXGI_RATIONAL 类型,DXGI_RATIONAL 类型定义如下:

typedef struct DXGI_RATIONAL {

  UINT Numerator;  // 分子

  UINT Denominator;  // 分母

} DXGI_RATIONAL;

 

Format指定后台缓冲区的像素格式,类似于屏幕显示的像素格式。该成员是DXGI_FORMAT枚举类型,DXGI_FORMAT枚举类型数量众多,具体看MSDN。一般指定DXGI_FORMAT_B8G8R8A8_UNORM  。

 

ScanlineOrdering描述渲染器的绘图模式。该成员是DXGI_MODE_SCANLINE_ORDER枚举类型,DXGI_MODE_SCANLINE_ORDER枚举类型定义如下:

typedef enum DXGI_MODE_SCANLINE_ORDER {

 DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED         = 0,

 DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE         = 1,

 DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST   = 2,

 DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST   = 3

} DXGI_MODE_SCANLINE_ORDER;

 

Scaling描述扩展模式。该成员是DXGI_MODE_SCALING枚举类型,DXGI_MODE_SCALING枚举类型定义如下:

typedef enum DXGI_MODE_SCALING {

 DXGI_MODE_SCALING_UNSPECIFIED   =0,

 DXGI_MODE_SCALING_CENTERED      =1,

 DXGI_MODE_SCALING_STRETCHED     =2

} DXGI_MODE_SCALING;

 

 

SampleDesc指定多重采样,用于图形反锯齿。该成员是DXGI_SAMPLE_DESC类型,DXGI_SAMPLE_DESC类型定义如下:

typedef struct DXGI_SAMPLE_DESC {

 UINT Count;  // 每像素点的数量。

 UINT Quality;  //  图像指令等级。

} DXGI_SAMPLE_DESC;

 

BufferUsage枚举缓冲区的用法和CPU访问后台缓冲区的选项。后台缓冲区用于shader input或者render-target output阶段。有多个宏,具体看MSDN。一般使用DXGI_USAGE_RENDER_TARGET_OUTPUT。

 

BufferCount指定交换链中缓冲区的数量。

 

OutputWindow指定图形绘制窗口。不能为NULL。

 

Windowed标识图形以窗口方式还是全屏方式显示。如果Windowed设置为TRUE,图形以窗口显示;Windowed设置为FALSE,图形以全屏方式显示。

 

SwapEffect指定系统如何将后台缓冲区的内容复制到前台缓冲区(FrontBuffer),从而在显示器屏幕上显示。该成员是DXGI_SWAP_EFFECT枚举类型,DXGI_SWAP_EFFECT枚举类型定义如下:

typedef enum DXGI_SWAP_EFFECT {

 DXGI_SWAP_EFFECT_DISCARD          = 0,

 DXGI_SWAP_EFFECT_SEQUENTIAL       = 1,

 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL  = 3

} DXGI_SWAP_EFFECT;

DXGI_SWAP_EFFECT_DISCARD标识使用Bitblt模式,后台缓存复制到前台缓存后,清楚后台缓存内容。

DXGI_SWAP_EFFECT_SEQUENTIAL标识使用Bitblt模式,后台缓存复制到前台缓存后,保留后台缓存原内容不变。

DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL标识翻转演示模式,后台缓存复制到前台缓存后,保留后台缓存原内容不变。

 

Flags描述交换链的选项。该成员是DXGI_SWAP_CHAIN_FLAG枚举类型,DXGI_SWAP_CHAIN_FLAG枚举类型定义如下:

typedef enum DXGI_SWAP_CHAIN_FLAG {

 DXGI_SWAP_CHAIN_FLAG_NONPREROTATED                     = 1,

 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH                 = 2,

 DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE                    = 4,

 DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT                = 8,

 DXGI_SWAP_CHAIN_FLAG_RESTRICT_SHARED_RESOURCE_DRIVER   = 16,

 DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY                      = 32

} DXGI_SWAP_CHAIN_FLAG;

 

下面通过Direct3D的接口函数D3D11CreateDeviceAndSwapChain()来创建Direct设备对象。

HRESULT D3D11CreateDeviceAndSwapChain(

 __in   IDXGIAdapter *pAdapter,

 __in   D3D_DRIVER_TYPE DriverType,

 __in   HMODULE Software,

 __in   UINT Flags,

 __in   const D3D_FEATURE_LEVEL*pFeatureLevels,

 __in   UINT FeatureLevels,

 __in   UINT SDKVersion,

 __in   const DXGI_SWAP_CHAIN_DESC*pSwapChainDesc,

 __out  IDXGISwapChain**ppSwapChain,

 __out  ID3D11Device **ppDevice,

 __out  D3D_FEATURE_LEVEL*pFeatureLevel,

 __out  ID3D11DeviceContext**ppImmediateContext

);

其中:

pAdapter指定显卡序号,表示使用哪块显卡创建Direct3D设备对象。设置为NULL使用默认显卡。

 

DriverType指定Direct3D设备类型。该成员是D3D_DRIVER_TYPE枚举类型,D3D_DRIVER_TYPE枚举类型定义如下:

typedef enum D3D_DRIVER_TYPE {

 D3D_DRIVER_TYPE_UNKNOWN     = 0,

 D3D_DRIVER_TYPE_HARDWARE    = (D3D_DRIVER_TYPE_UNKNOWN + 1 ),

 D3D_DRIVER_TYPE_REFERENCE   = (D3D_DRIVER_TYPE_HARDWARE + 1 ),

 D3D_DRIVER_TYPE_NULL        = (D3D_DRIVER_TYPE_REFERENCE + 1 ),

 D3D_DRIVER_TYPE_SOFTWARE    = (D3D_DRIVER_TYPE_NULL + 1 ),

 D3D_DRIVER_TYPE_WARP        = (D3D_DRIVER_TYPE_SOFTWARE + 1 )

} D3D_DRIVER_TYPE;

 

Software软件光栅器的DLL句柄,如果DriverType是D3D_DRIVER_TYPE_SOFTWARE,此值不能为NULL,否则设置为NULL。

 

Flags运行层开关。该成员是D3D11_CREATE_DEVICE_FLAG枚举类型,D3D11_CREATE_DEVICE_FLAG枚举类型定义如下:

typedef enum D3D11_CREATE_DEVICE_FLAG {

 D3D11_CREATE_DEVICE_SINGLETHREADED                                  = 0x1,

 D3D11_CREATE_DEVICE_DEBUG                                           =0x2,

 D3D11_CREATE_DEVICE_SWITCH_TO_REF                                   = 0x4,

 D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS        = 0x8,

 D3D11_CREATE_DEVICE_BGRA_SUPPORT                                    = 0x20,

 D3D11_CREATE_DEVICE_DEBUGGABLE                                      = 0x40,

 D3D11_CREATE_DEVICE_PREVENT_ALTERING_LAYER_SETTINGS_FROM_REGISTRY   = 0x80,

 D3D11_CREATE_DEVICE_DISABLE_GPU_TIMEOUT                             = 0x100,

 D3D11_CREATE_DEVICE_VIDEO_SUPPORT                                   = 0x800

} D3D11_CREATE_DEVICE_FLAG;

 

pFeatureLevels选择特征层。

typedef enum D3D_FEATURE_LEVEL {

 D3D_FEATURE_LEVEL_9_1    = 0x9100,

 D3D_FEATURE_LEVEL_9_2    = 0x9200,

 D3D_FEATURE_LEVEL_9_3    = 0x9300,

 D3D_FEATURE_LEVEL_10_0   = 0xa000,

 D3D_FEATURE_LEVEL_10_1   = 0xa100,

 D3D_FEATURE_LEVEL_11_0   = 0xb000,

 D3D_FEATURE_LEVEL_11_1   = 0xb100

} D3D_FEATURE_LEVEL;

 

FeatureLevels特征层数量。

 

SDKVersionSDK版本,使用 D3D11_SDK_VERSION。


pSwapChainDesc交换链DXGI_SWAP_CHAIN_DESC信息。

 

ppSwapChain返回指向交换链的指针。

 

ppDevice返回D3D设备对象的指针地址。

 

pFeatureLevel返回特征层的指针。

 

ppImmediateContex返回设备上下文的指针地址。


原创粉丝点击