D3D 直接操作后台缓存绘制

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);

你可能感兴趣的:(D3D 直接操作后台缓存绘制)