D3DPRSENT_PARAMETERS结构解析
终于开始学习了,前阵子在纠结是直接搞Ogre游戏开发,还是深入学习DirectX? 现在明白了,还是基础重要!哈哈哈~~~
虽然大学期间学过也初步学习和运用过DirectX,但那时理解真的很浅。
废话结束,运用Direct3D最开始的第一步:创建DirectDevice对象。这一步说简单很简单,说难其实也有点难。
这一步最关键的是对结构体 D3DPRESENT_PARAMETERS 的理解,参数很多,貌似还有点深奥!
下面将详细解释下各种参数的涵义,当然,不是原创的,从书籍上摘下来的。
结构定义如下:
typedef struct _D3DPRESENT_PARAMETERS_
{
UINT BackBufferWidth;
UINT BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
/* FullScreen_RefreshRateInHz must be zero for Windowed mode */
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS;
|
成员 |
说明 |
|
BackBufferWidth BackBufferHeight |
后备缓存区所需要的宽度和高度。 如果使用全屏模式,则必须使用显示器所支持的分辨率(使用EnumAdapterMode获取各种分辨率) 如果使用窗口模式,默认使用0。 |
|
BackBufferFormat |
后备缓冲区使用的颜色模式。即颜色深度和格式。 如果使用全屏模式,可以使用设备支持的任何颜色模式。使用CheckDeviceType方法来检查。 如果使用窗口模式,则必须使用当前窗口使用的颜色模式。可以使用D3DFMT_UNKOWN,系统会自动获取该值。 |
|
BackBufferCount |
后备缓冲区的数目。可以为0,1,2,3. 通常一个后备缓冲区就足够了。 |
|
MultiSampleType |
多重采样类别,用于图形反锯齿。使用1X – 16X。 注意,使用高级别的多重采样类别的话,会消耗更多的图形显存。 |
|
SwapEffect |
指定系统如何将后台缓冲区的内容复制到前台缓冲区,从而在屏幕上显示。它的值有: D3DSWAPEFFECT_DISCARD:清除后台缓存的内容 D3DSWAPEEFECT_FLIP:保留后台缓存的内容。当缓存区>1时。 D3DSWAPEFFECT_COPY: 保留后台缓存的内容,缓冲区=1时。 一般情况下使用D3DSWAPEFFECT_DISCARD |
|
hDeviceWindow |
指定进行渲染的窗口。 |
|
Windowed |
指定窗口模式。True = 窗口模式;False = 全屏模式 |
|
EnableAutoDepthStencil |
指定是否需要DirectX自动管理深度缓冲(用于关于每个像素点的深度信息)。3D场景应该开启深度测试。 |
|
AutoDepthStencilFormat |
深度缓冲的格式。一般使用D3DFMT_D16,即深度值用16位二进制表示。位数越多,场景绘制得越精确,相应内存消耗更多。 |
|
Flags |
D3DPRESENTFLAG_LOCKABLE_BACKBUFFER表示锁定后备缓冲区。一般情况下不使用。默认为0. |
|
FullScreen_RefreshRateInHz |
指定屏幕刷新率。 如果使用全屏模式的话,使用屏幕支持的任意频率(使用EnumAdapterModes获取)。值为0表示使用默认刷新率。 如果使用窗口模式的话,值必须为0,表示使用桌面刷新率。 |
|
FullScreen_PresentationInterval |
指定后备缓冲区与前台缓冲区的交换频率。一般情况下使用D3DPRESENT_INTERVAL_DEFAULT. D3DPRESENT_INTERVAL_DEFAULT: 窗口模式一定得用该选项! D3DPRESENT_INTERVAL_IMMEDIATE: VSync关闭,立即更新~ D3DPRESENT_INTERVAL_ONE:等待一个垂直扫描周期才更新,有助于减少剪断和撕裂效果。 D3DPRESENT_INTERVAL_TWO ~ FOUR:分别等待相应个数周期才更新! |
对于创建一个窗口模式的3D应用程序而言,初始化D3D貌似很简单。如下:
HRESULT InitD3D( HWND hWnd )
{
//创建Direct3D对象, 该对象用来创建Direct3D设备对象
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
//设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
//创建Direct3D设备对象
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
return S_OK;
}
对于创建一个全屏模式的3D应用,步骤就繁琐多了,主要在于对D3DPRESENT_PARAMETERS 的详细设置,
貌似每个参数都得设置一遍。具体程序,俺先不写了。

浙公网安备 33010602011771号