目录
创建D3D设备 IDirect3DDevice9 *
D3D9设备的初始化步骤:
1.创建IDirect3D9对象
2.检查硬件
3.填充D3DPRESENT_PARAMETERS结构体
4.创建D3D设备
bool InitD3D(HWND hwnd, bool isFullScreen, D3DDEVTYPE deviceType, IDirect3DDevice9** device)
{
//1.创建IDirect3D9对象
IDirect3D9* pd3dp{ NULL };
pd3dp = Direct3DCreate9(D3D_SDK_VERSION);
if (!pd3dp)
{
PrintDebugMsg("创建IDirect3D9对象失败\n");
return false;
}
//2.检查硬件
D3DCAPS9 caps;
pd3dp->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
int vp = 0;
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)//是否支持硬件
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
//3. 填充D3DPRESENT_PARAMETERS结构体
D3DPRESENT_PARAMETERS d3dp;
ZeroMemory(&d3dp, sizeof(d3dp));
d3dp.BackBufferHeight = 768;
d3dp.BackBufferWidth = 1024;
d3dp.BackBufferFormat = D3DFMT_UNKNOWN;//后台缓存的像素点
d3dp.BackBufferCount = 1;//后台缓存的个数
d3dp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dp.MultiSampleQuality = 0;
d3dp.SwapEffect = D3DSWAPEFFECT_DISCARD;//交换链置换
d3dp.hDeviceWindow = hwnd;//绘制的窗口
d3dp.Windowed = isFullScreen;//是否全屏
d3dp.EnableAutoDepthStencil = true;//是否创建维护深度缓存
d3dp.AutoDepthStencilFormat = D3DFMT_D16;//深度缓冲区格式 如果 EnableAutoDepthStencil为false 则忽略该参数
d3dp.Flags = 0;
d3dp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;//刷新率
d3dp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;// 交换频率
/*
ZeroMemory(&d3dp, sizeof(d3dp));
d3dp.Windowed = TRUE;
d3dp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dp.EnableAutoDepthStencil = TRUE;
d3dp.AutoDepthStencilFormat = D3DFMT_D16;
d3dp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
*/
//4.创建D3D设备
HRESULT hr = pd3dp->CreateDevice(D3DADAPTER_DEFAULT,//显卡设备
deviceType,//设备类型
hwnd, //与D3D设备所关联的窗口句柄
vp,//软件 / 硬件 运算方式
&d3dp,//参数结构体
device); //传出参数 IDirect3DDevice9*的指针
if (FAILED(hr))
{
PrintDebugMsg("创建D3D9设备对象失败\n");
pd3dp->Release();
return false;
}
pd3dp->Release();
return true;
}
绘制框架
if (g_d3dDevice)
{
//1.缓冲区个数 2.指定清除缓冲区 3.清楚的是那些缓冲区(后台|深度) 4 5 6 ->用来那些值来清除相应的缓冲区
g_d3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);
//开始在后台缓冲区进行绘制
g_d3dDevice->BeginScene();
//结束后台缓冲区绘制
g_d3dDevice->EndScene();
//将后台缓冲区提交到前台
g_d3dDevice->Present(0, 0, 0, 0);
}