Microsoft Corporation
October 6, 1997
In Microsoft® Direct3D®, the IDirect3DRMViewport::Clear() function will clear a Retained Mode viewport's z-buffer and target rendering surface. You cannot direct this function to clear the z-buffer only. If you need to clear the z-buffer without calling IDirect3DRMViewport::Clear(), then you need to extract the immediate mode viewport from the retained mode viewport and use the low-level clear functions in the immediate mode API to clear the z-buffer only.
A set of normal Retained Mode rendering instructions may look like the following:
scene->Move(D3DVALUE(1.0));
view->Clear();
view->Render(scene);
rmdev->Update();
If you want to render without clearing your target surface, you need to remove your call to Clear(). If you do this, however, your z-buffer will not get cleared, and your objects will not be rendered properly. If you obtain the immediate mode viewport associated with your retained mode viewport, you can clear the z-buffer without clearing the target. Call Direct3DRMViewport::GetDirect3DViewport() to retrieve the Direct3D immediate mode viewport. Then call the immediate mode viewport's Clear() method to clear the z-buffer. You can do this by calling IDirect3DViewport::Clear() with the D3DCLEAR_ZBUFFER flag set.
The following code shows how to modify rendering calls to achieve this functionality:
LPDIRECT3DVIEWPORT d3dview;
scene->Move(D3DVALUE(1.0));
view->GetDirect3DViewport(&d3dview);
int clearflags;
D3DRECT rc;
clearflags = D3DCLEAR_ZBUFFER;
rc.x1 = rc.y1 = 0;
rc.x2 = 640;
rc.y2 = 480;
d3dview->Clear(1, &rc, clearflags);
view->Render(scene);
rmdev->Update();
Note The IDirect3DRMViewport::Clear() function also clears the Retained Mode dirty-rectangle list. If you use the technique above, the dirty-rectangle list will not be cleared. This can result in a degradation of performance under certain circumstances. Therefore, it is helpful to call IDirect3DRMViewport::Clear() after Update to clear the dirty-rectangle list.