CreateDevice函数详解

翻译自:http://msdn.microsoft.com/en-us/library/windows/desktop/bb174313%28v=vs.85%29.aspx

Creates a device torepresent the display adapter.

创建一个设备对象代表显示的显卡。

HRESULT CreateDevice(

  [in]          UINT Adapter,

  [in]          D3DDEVTYPE DeviceType,

  [in]          HWND hFocusWindow,

  [in]          DWORD BehaviorFlags,

  [in, out]     D3DPRESENT_PARAMETERS *pPresentationParameters,

  [out, retval] IDirect3DDevice9 **ppReturnedDeviceInterface

);

 Adapter:

将要使用的显卡适配器的标识号(D3DADAPTER_DEFAULT默认即可)。

DeviceType:

设备的类型(类型是D3DDEVTYPE_HAL或D3DDEVTYPE_REF)。

hFocusWindow:

是焦点窗口,当应用程序从前台模式切换到后台模式的时候向Direct3D提示的窗口。

如果是全屏模式,这个窗口指定的焦点窗口必须是最顶层窗口。

对于窗口模式,这个参数可以是NULL(用的是当前显示的窗口),除非PRESENTPARAMETERS的hDeviceWindow参数是一个合法的非NULL值。

交换链有多个后台缓存的时候,每个后台缓存需要各自hDeviceWindow设备窗口,可以共用一个hFocusWindow焦点窗口(一个焦点窗口可以只给一个后台缓存当做自己的设备窗口)

 

BehaviorFlags:

一个或多个D3DCREATE选项的组合,用于控制创建设备的顶点运算类型和一些特性表现。

D3DCREATE_HARDWARE_VERTEXPROCESSING,D3DCREATE_MIXED_VERTEXPROCESSING, and D3DCREATE_SOFTWARE_VERTEXPROCESSING

are mutually exclusiveflags. At least one of these vertex processing flags must be specified whencalling CreateDevice.

这三个是相互互斥的,且指定的类型中需要有一个作为顶点运算的标志。

 

pPresentionParameters:

指定到一个D3DPRESENT_PARAMETERS的结构体,这个结构体描述了将要创建的设备的表现的参数。如果Behavior

指定为D3DCREATE_ADAPTERGROUP_DEVICE,那么pPresentionParameters是一个数组。不管设备的个数有几个,只有

一个depth/stencil 表面会被自动创建

 

全屏模式下设备的刷新频率是按照下面的优先级来设置的(windows 200和windows xp):

    用户指定非0的ForcedRefreshRate注册键,如果设备支持的话。

    用户在D3DPRESENT_PARAMETERS结构体中指定的非0刷新频率值。

    上一个桌面的刷新频率,如果设备支持。

    75HZ的频率,如果设备支持。

    60HZ的频率,如果设备支持。

    设备默认的刷新频率。

一个指定的不支持的刷新频率将默认被调整到支持的,低于该频率的频率。例如如果应用程序指定63HZ,那么将

会被调整到60HZ.低于57HZ的频率设备是不支持的。

pPresentionParameters是一个支持输入输出的值,调用这个方法将会改变多个参数,包括:

    如果后台缓存的个数,后台缓存的宽度和高度是0,那么调用这个函数后将会返回系统默认设置的值。

    如果后台缓存格式被指定为D3DFMT_UNKNOWN,那么调用这个函数后将会返回系统默认设置的值

ppReturnedDeviceInterface:

IDirect3DDevice9的二维指针,用于返回设备的指针。

 

注意:交换链后台缓存,后台缓存像素格式,后台缓存和深度缓存的锁定;相同线程中操作设备对象。

这个方法返回一个完全可以工作的设备接口,设置到一个请求的显卡设备模式或者windowed模式(分辨率大小),分配

给一个合适的后台缓存(创建交换链)。为了开始渲染,应用程序必须去创建和设置一个深度缓存(假如D3DPRESENT_PARAMETERS参数

指定的深度缓存EnableAutoDepthStencil是FALSE).

当你创建一个Dricet3D设备,你提供了两个window窗口的参数,一个焦点窗口(hFocusWindow)和一个设备窗口(

D3DPRESENT_PARAMETERS的hDeviceWindow),这两个窗口的目的是:

hFocusWindow用于提示Direct3D当一个应用程序从后台模式切换到前台模式(通过Alt+Tab,一个鼠标点击或者其它的

方法)。单个的hFocusWindow可以被一个应用程序创建的多个设备device共享使用。

hDeviceWindow窗口用于决定屏幕后台缓存的位置和该后台缓存的大小。在Direct3D调用Present函数切换交换链

后台缓存内容拷贝到前台的过程中被使用。

 

这个方法不能被有效的调用,当应用程序在处理WM_CREATE消息的时候。一个应用程序不能通过一个窗口处理Direct3D

当这个窗口在处理WM_CREATE消息的时候。任何调用create,release或reset操作设备的函数必须被在同一个focusWindow

的线程中才能使用。

 

Note thatD3DCREATE_HARDWARE_VERTEXPROCESSING, D3DCREATE_MIXED_VERTEXPROCESSING, and

D3DCREATE_SOFTWARE_VERTEXPROCESSINGare mutually exclusive flags,

and at least one of thesevertex processing flags must be specified when calling this method.

这三个顶点运算时互斥的,且在该函数中必须被指定一个。

 

Back buffers created as partof the device are only lockable if D3DPRESENTFLAG_LOCKABLE_BACKBUFFER isspecified

in the presentationparameters. (Multisampled back buffers and depth surfaces are never lockable.)

后台缓存只用在D3DPRESENT_PARAMETERS中用 D3DPRESENTFLAG_LOCKABLE_BACKBUFFER指定了才能被锁定,

多重采样纹理的后台缓存和深度缓存不能被锁定。

 

The methods Reset, IUnknown,and TestCooperativeLevel must be called from the same thread that used thismethod to create a device.

Reset, IUnknown, andTestCooperativeLevel必须在创建这个设备的相同线程中才能被调用

 

D3DFMT_UNKNOWN can bespecified for the windowed mode back buffer format when calling CreateDevice,

 Reset, and CreateAdditionalSwapChain. Thismeans the application does not have to query the

current desktop formatbefore calling CreateDevice for windowed mode. For full-screen mode,

the back buffer format mustbe specified.

D3DFMT_UNKNOWN像素格式在窗口模式的CreateDevice,Reset,CreateAdditionalSwapChain函数中可以使用。这表示

在窗口模式中应用程序不需要去查询当前桌面的显卡模式在窗口设备管理器之前。对于全屏模式,后台缓存的像素格式

必须是被指定的。

 

If you attempt to create adevice on a 0x0 sized window, CreateDevice will fail.

如果你创建一个在0大小的窗口上的设备,这个函数将失败。

你可能感兴趣的:(DirectX)