D3D设备Reset之前需要将所有 D3DPOOL_DEFAULT 内的资源释放,否则Reset会失败。
改用D3DPOOL_MANAGED的可以不用手动释放。
//创建一个渲染表面
IDirect3DSurface9* pSurface;pDevice->CreateOffscreenPlainSurface(width,height,D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT,&pSurface,0);//写入表面void SetPixel(int x,int y,DWORD c)
{D3DLOCKED_RECT rc;memset(&rc,0,sizeof(rc));
pSurface->LockRect(&rc,NULL,D3DLOCK_DISCARD);//Pitch表示一个表面上一行像素的长度(已经乘以DWORD宽度)
//除以4可以获得准确的一行像素个数
int linePixel = rc.Pitch/4;
DWORD* pBits = (DWORD*)rc.pBits;int index = y*linePiexl + x;
//小心越界
pBits[index] = c;pSurface->UnlockRect();}//获取D3D默认交换链中的后台缓存
IDirect3DSurface9* backBuffer = 0;pDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&backBuffer);//使用自定义渲染表面填充后台缓存
pDevice->StretchRect(pSurface,0,backBuffer,0,D3DTEXF_NONE);//GetBackBuffer所得的缓存需要被释放
backBuffer->Release();//将交换链中的后台缓存显示
m_pDevice->Present(0,0,0,0);