D3DPRESENT

xiaoxiao2021-02-27  282

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:分别等待相应个数周期才更新!

 创建Device代码段:

bool CApp::InitD3D() { IDirect3D9 *d3d=0; d3d=Direct3DCreate9(D3D_SDK_VERSION); if (d3d==NULL) { MessageBox(m_hwnd,_T("Direct3DCreate9 ERROR!"),_T("ERROR"),MB_OK); return false; } D3DDEVTYPE d3dt=D3DDEVTYPE_HAL; D3DCAPS9 caps; d3d->GetDeviceCaps(D3DADAPTER_DEFAULT,d3dt,&caps); int vp=0; if (caps.DevCaps& D3DDEVCAPS_HWTRANSFORMANDLIGHT) { vp=D3DCREATE_HARDWARE_VERTEXPROCESSING; }else { vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING; } D3DPRESENT_PARAMETERS d3dpp; d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8; d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8; d3dpp.EnableAutoDepthStencil=true; d3dpp.Flags=0; d3dpp.hDeviceWindow=m_hwnd; d3dpp.Windowed=m_bWindowed; d3dpp.MultiSampleQuality=0; d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE; if (m_bWindowed)//窗口模式 { d3dpp.BackBufferCount=1; d3dpp.BackBufferHeight=0; //窗口模式,默认使用0 d3dpp.BackBufferWidth=0; //窗口模式,默认使用0 d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT; //窗口模式一定得用 D3DPRESENT_INTERVAL_DEFAULT ! d3dpp.FullScreen_RefreshRateInHz=0;//显示器刷新率,窗口模式该值必须为0 d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; //指定系统如何将后台缓冲区的内容复制到前台缓冲区 D3DSWAPEFFECT_DISCARD:清除后台缓存的内容 }else { //全屏模式 d3dpp.BackBufferCount=2; d3dpp.BackBufferHeight=m_height;//可以用 GetSystemMetrics(SM_CXSCREEN) 获得屏幕宽 d3dpp.BackBufferWidth=m_width; //可以用 GetSystemMetrics(SM_CYSCREEN) 获得屏幕高 d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE; d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;//显示器刷新率,窗口模式该值必须为0 d3dpp.SwapEffect=D3DSWAPEFFECT_FLIP; //D3DSWAPEEFECT_FLIP:保留后台缓存的内容。当缓存区>1时。 } HRESULT hr=0; hr=d3d->CreateDevice(D3DADAPTER_DEFAULT,d3dt,m_hwnd,vp,&d3dpp,&m_device); if (FAILED(hr)) { MessageBox(m_hwnd,_T("CreateDevice ERROR"),_T("ERROR"),MB_OK); safe_release(d3d); return false; } return true; }

 

 另外创建窗口的style风格也不一样:

//创建窗口 if (m_bWindowed)//窗口模式 { m_hwnd=CreateWindowEx(NULL,_T("DXCLASSNAME"),lpcwTitle, (WS_OVERLAPPEDWINDOW|WS_VISIBLE)&~WS_THICKFRAME,0,0, m_width,m_height,NULL,NULL,hinstance,NULL); }else { //全屏模式 m_hwnd=CreateWindowEx(NULL,_T("DXCLASSNAME"),lpcwTitle, (WS_EX_TOPMOST|WS_VISIBLE|WS_POPUP),0,0, m_width,m_height,NULL,NULL,hinstance,NULL); }

 点击打开链接

转载请注明原文地址: https://www.6miu.com/read-3887.html

最新回复(0)