|
|
前两天郁闷的抛弃了DDRAW转投D3D后,遇到了两个小问题:
1 恢复设备时ID3DXSPRITE对象和纹理还要重新创建么?我恢复设备后,发现上面两种对象的指针都非空,但无法引用,这样要重新创建他们之前要先release么?
2 我用ID3DXSPRITE的DRAW出来的图象不完整而且变形(图见附件,Ascent是原图,back是运行时我截的图),怎么回事?下面事我的代码,恢复设备的部分我省略了。d3dpp、d3ddm、pDev、spr、tex都是全局变量
BOOL D3DDisplay::InitGraph() {
if(NULL == (pD3D = Direct3DCreate8(D3D_SDK_VERSION)))return FALSE;
if(FAILED(pD3D -> GetAdapterDisplayModeD3DADAPTER_DEFAULT,&d3ddm)))
return FALSE;
ZeroMemory(&d3dpp, sizeof(d3dpp));
#if defined(_Windowed)
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
#endif
#if defined(_FullScreen)
d3dpp.Windowed=FALSE;
d3dpp.hDeviceWindow=*hWnd; d3dpp.SwapEffect=D3DSWAPEFFECT_FLIP;
d3dpp.BackBufferCount=2;
d3dpp.BackBufferWidth=1024;
d3dpp.BackBufferHeight=768;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.FullScreen_PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
#endif
d3dpp.BackBufferFormat=d3ddm.Format;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
if(FAILED(pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
*hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &pDev ) ) )
return FALSE;
Setup2DCamera();
D3DXCreateTextureFromFileEx(pDev,BitmapFileName , D3DX_DEFAULT,
D3DX_DEFAULT,D3DX_DEFAULT,0, D3DFMT_UNKNOWN,
D3DPOOL_MANAGED, D3DX_DEFAULT,D3DX_DEFAULT,
0, NULL, NULL,&tex);
D3DXCreateSprite(pDev,&spr);
return TRUE;
}
void D3DDisplay::Render()
{
if(pDev == NULL||spr==NULL||tex==NULL)return;
pDev->Clear0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,0),1.0f,0);
pDev->BeginScene();
spr->Draw(tex,NULL, NULL, NULL, 0, &D3DXVECTOR2(0,0), 0xFFFFFFFF);
pDev->EndScene();
pDev-> resent(NULL,NULL,NULL,NULL);//恢复设备的部分我省略了
}
void D3DDisplay::Setup2DCamera()
{
D3DXMATRIX matOrtho;
D3DXMATRIX matIdentity;
D3DXMatrixOrthoLH(&matOrtho, (float)m_nScreenWidth, (float)m_nScreenHeight,
0.0f, 1.0f);
D3DXMatrixIdentity(&matIdentity);
pDev->SetTransform(D3DTS_PROJECTION, &matOrtho);
pDev->SetTransform(D3DTS_WORLD, &matIdentity);
pDev->SetTransform(D3DTS_VIEW, &matIdentity);
pDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
pDev->SetRenderState(D3DRS_LIGHTING, FALSE);
} |
|