|
|
|
|
Clearing the screen using DirectX |
Last chapter, we created a link between your hardware and the software. Now, we’re actually going to use DirectX to clear the contents of your window to a color of choice. Every iteration of our game loop, we are going to add a call to a method DrawScene, which we will define here and will redraw our window using DirectX.
Every time you redraw a scene to your window, you first have to clear it. Then let the device know you are going to draw the scene by calling the BeginScene method of it. After defining the scene, place a call to EndScene and a call to Present to actually present the buffered new screen. This is done be the code below:
void DrawScene(LPDIRECT3DDEVICE9 p_dx_Device) { p_dx_Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); p_dx_Device->BeginScene(); p_dx_Device->EndScene(); p_dx_Device->Present(NULL, NULL, NULL, NULL); }
The first line shows that our new method will need a pointer to the device passed to it from the calling function, and that it will not return a value (void). The Clear method can actually clear some specific parts of the screen, specified by a number of rectangles. This number of rectangles is the first parameter, the second is a pointer to the list of rectangles. Because we are going to clear the whole window, we define 0 and NULL. Then we define to what color the window should be cleared and at what distance this layer should be, where 1f means infinity. The last pixel clears the stencil buffer, which is more advanced and is used to mask certain pixels in the screen.
The first, second and last parameters of the Present method are too advanced for now, the third parameter is a handle to the window to draw to, or NULL to draw to the window specified in the Present_Parameters structure.
All we need to do now is add a call to our new method from within the while loop:
DrawScene(p_Device);
Okay, that should give you a window, cleared by DirectX to the color of your choice. Not too exciting yet, but hey…

Click here to go to the forum on this chapter!
Or click on one of the topics on this chapter to go there: Problem with clearing Hello
I wrote whole program in VC 6.0. I have com...
This is the code you should have up to this point:
#include<windows.h>
#include<d3d9.h>
#include<d3dx9.h>
int int_AppRunning = 1;
LRESULT CALLBACK OurWindowProcedure(HWND han_Wind,UINT uint_Message,WPARAM parameter1,LPARAM parameter2) { switch(uint_Message) { case WM_KEYDOWN: { int_AppRunning = 0; break; } break; }
return DefWindowProc(han_Wind,uint_Message,parameter1,parameter2); }
HWND NewWindow(LPCTSTR str_Title,int int_XPos, int int_YPos, int int_Width, int int_Height) { WNDCLASSEX wnd_Structure;
wnd_Structure.cbSize = sizeof(WNDCLASSEX); wnd_Structure.style = CS_HREDRAW | CS_VREDRAW; wnd_Structure.lpfnWndProc = OurWindowProcedure; wnd_Structure.cbClsExtra = 0; wnd_Structure.cbWndExtra = 0; wnd_Structure.hInstance = GetModuleHandle(NULL); wnd_Structure.hIcon = NULL; wnd_Structure.hCursor = NULL; wnd_Structure.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); wnd_Structure.lpszMenuName = NULL; wnd_Structure.lpszClassName = "WindowClassName"; wnd_Structure.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&wnd_Structure);
return CreateWindowEx(WS_EX_CONTROLPARENT, "WindowClassName", str_Title, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, int_XPos, int_YPos, int_Width, int_Height, NULL, NULL, GetModuleHandle(NULL), NULL); }
LPDIRECT3DDEVICE9 InitializeDevice(HWND han_WindowToBindTo) { LPDIRECT3D9 p_dx_Object; LPDIRECT3DDEVICE9 p_dx_Device;
p_dx_Object = Direct3DCreate9(D3D_SDK_VERSION); if (p_dx_Object == NULL) { MessageBox(han_WindowToBindTo,"DirectX Runtime library not installed!","InitializeDevice()",MB_OK); }
D3DPRESENT_PARAMETERS dx_PresParams; ZeroMemory( &dx_PresParams, sizeof(dx_PresParams) ); dx_PresParams.Windowed = TRUE; dx_PresParams.SwapEffect = D3DSWAPEFFECT_DISCARD; dx_PresParams.BackBufferFormat = D3DFMT_UNKNOWN;
if (FAILED(p_dx_Object->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, han_WindowToBindTo, D3DCREATE_HARDWARE_VERTEXPROCESSING, &dx_PresParams, &p_dx_Device))) { if (FAILED(p_dx_Object->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, han_WindowToBindTo, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dx_PresParams, &p_dx_Device))) { MessageBox(han_WindowToBindTo,"Failed to create even the reference device!","InitializeDevice()",MB_OK); } }
return p_dx_Device; }
void DrawScene(LPDIRECT3DDEVICE9 p_dx_Device) { p_dx_Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); p_dx_Device->BeginScene(); p_dx_Device->EndScene(); p_dx_Device->Present(NULL, NULL, NULL, NULL); }
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreviousInstance,LPSTR lpcmdline,int nCmdShow) { MSG msg_Message; HWND han_Window = NewWindow("DirectX C++ Tutorial",100,100,500,500); LPDIRECT3DDEVICE9 p_Device = InitializeDevice(han_Window); while(int_AppRunning) { if(PeekMessage(&msg_Message,han_Window,0,0,PM_REMOVE)) { DispatchMessage(&msg_Message); }
DrawScene(p_Device);
} p_Device->Release(); DestroyWindow(han_Window); return 0; }
- Website design & XNA + DirectX code : Riemer Grootjans - ©2003 - 2008 Riemer Grootjans
|
|
|
|
|