|
|
////////////////////////////////////////////////初始化//////////////////////////////////////////
/*创建directdraw*/
DirectDrawCreateEx(NULL,(PVOID*)&pane,IID_IDirectDraw7,NULL);
pane->SetCooperativeLevel(GetSafeHwnd(),DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);//设置协作方式
pane->SetDisplayMode(640,480,16,0,0);//设置显示方式
DDSURFACEDESC2 des;
memset(&des,0,sizeof(des));
des.dwSize=sizeof(des);
des.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
des.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_3DDEVICE;
des.dwBackBufferCount=1;
pane->CreateSurface(&des,&front,NULL);//创建显示表面
des.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER;
bool ret=front->GetAttachedSurface(&des.ddsCaps,&back)==D3D_OK;//取得缓冲表面
/*初始化d3d7*/
if(FAILED(pane->QueryInterface(IID_IDirect3D7,(LPVOID*)&d3d)))
return FALSE;
/*Z缓冲*/
// D3DDEVICEDESC7 ddDesc;
// device->GetCaps(&ddDesc);
// if(!(ddDesc.dpcTriCaps.dwRasterCaps&D3DPRASTERCAPS_ZBUFFERLESSHSR)){//无硬件Z缓冲区
lpz_buf=NULL;
/*创建Z缓冲区*/
DDSURFACEDESC2 ddsd;
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
back->GetSurfaceDesc(&ddsd);
/*选择Z缓冲区像素模式*/
d3d->EnumZBufferFormats(IID_IDirect3DTnLHalDevice,EnumZBufferFormatsCallback,(PVOID)&ddsd.ddpfPixelFormat);//尝试tnl
if(!zBufFind){
d3d->EnumZBufferFormats(IID_IDirect3DHALDevice,EnumZBufferFormatsCallback,(PVOID)&ddsd.ddpfPixelFormat);//尝试hal
if(!zBufFind){
d3d->EnumZBufferFormats(IID_IDirect3DMMXDevice,EnumZBufferFormatsCallback,(PVOID)&ddsd.ddpfPixelFormat);//尝试mmx
if(!zBufFind){
d3d->EnumZBufferFormats(IID_IDirect3DRGBDevice,EnumZBufferFormatsCallback,(PVOID)&ddsd.ddpfPixelFormat);//尝试软件
if(!zBufFind){
return FALSE;
}
else
zbuf_format=4;}
else
zbuf_format=3;}
else
zbuf_format=2;}
else
zbuf_format=1;
if(ddsd.ddpfPixelFormat.dwRGBBitCount!=16)
return FALSE;
ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
if(zbuf_format<3)
ddsd.ddsCaps.dwCaps=DDSCAPS_ZBUFFER|DDSCAPS_VIDEOMEMORY;
else
ddsd.ddsCaps.dwCaps=DDSCAPS_ZBUFFER|DDSCAPS_SYSTEMMEMORY;
if(!FAILED(pane->CreateSurface(&ddsd,&lpz_buf,NULL)))
if(back->AddAttachedSurface(lpz_buf)!=DD_OK){
return FALSE;
}
else{
Beep(2000,2000);
return FALSE;
}
/**/
// }
/*创建D3D渲染设备*/
if(d3d->CreateDevice(IID_IDirect3DTnLHalDevice,back,&device)!=D3D_OK)
if(d3d->CreateDevice(IID_IDirect3DHALDevice,back,&device)!=D3D_OK)
if(d3d->CreateDevice(IID_IDirect3DMMXDevice,back,&device)!=D3D_OK){
d3d->CreateDevice(IID_IDirect3DRGBDevice,back,&device);
// Beep(2000,2000);
}
/*设置显示屏幕*/
D3DVIEWPORT7 view;
view.dwX=0;
view.dwY=0;
view.dwWidth=640;
view.dwHeight=480;
view.dvMinZ=0.0f;
view.dvMaxZ=1.0f;
if(device->SetViewport(&view)!=D3D_OK)
return FALSE;
////////////////////////////////////////////////////初始化完成///////////////////////////////////////////////////
小弟我刚学D3D,由于新手想看看整个流程,所以一开始不打算用D3DFrameWork,自己先熟悉,这段代码再CDialog::OnInitxxxxx的过程中,初始化整个流程,不过在
if(!FAILED(pane->CreateSurface(&ddsd,&lpz_buf,NULL)))
这段出现错误,!FAILED检测成立了,现在Z缓冲怎么也见不起来,不知道什么与原因。
|
|