Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Every windows application needs to include this
- #include "windows.h"
- //Every Direct3D application this
- #include "d3d9.h"
- #include "d3dx9.h"
- bool g_bContinue = true;
- LPD3DXEFFECT g_lpEffect = NULL;
- LPDIRECT3DVERTEXBUFFER9 g_lpVertexBuffer = NULL;
- D3DXMATRIX g_ShaderMatrix;
- //Definition of the Vertex Format including position and diffuse color
- #define D3DFVF_COLOREDVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
- struct COLORED_VERTEX
- {
- float x, y, z; //Position
- DWORD color; //Color
- };
- //Besides the main function, there must be a message processing function
- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- switch( msg )
- {
- case WM_DESTROY:
- PostQuitMessage( 0 );
- g_bContinue = false;
- return 0;
- }
- return DefWindowProc( hWnd, msg, wParam, lParam );
- }
- //The entry point of a windows application is the WinMain function
- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
- {
- //Create a window class.
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
- "Direct3D Window", NULL };
- //Register the window class.
- RegisterClassEx( &wc );
- //Create the application's window.
- HWND hWnd = CreateWindow( "Direct3D Window", "DirectXers - D3D9 Tutorial 2",
- WS_OVERLAPPEDWINDOW, 100, 100, 400, 400,
- GetDesktopWindow(), NULL, wc.hInstance, NULL );
- ShowWindow(hWnd,SW_SHOW);
- //Create the Direct3D Object
- LPDIRECT3D9 pD3D = NULL;
- if( NULL == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
- return E_FAIL;
- //Setup the device presentation parameters
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory( &d3dpp, sizeof(d3dpp) );
- d3dpp.Windowed = TRUE;
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
- //The final step is to use the IDirect3D9::CreateDevice method to create the Direct3D device, as illustrated in the
- //following code example.
- LPDIRECT3DDEVICE9 pd3dDevice = NULL;
- if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
- D3DCREATE_HARDWARE_VERTEXPROCESSING,
- &d3dpp, &pd3dDevice ) ) )
- {
- MessageBox(hWnd, "No HAL HARDWARE_VERTEXPROCESSING! Sample will exit!", NULL, 0);
- pD3D->Release();
- pD3D = NULL;
- return E_FAIL;
- }
- //set the vertex buffer size 4 vertices * vertex structure size
- UINT uiBufferSize = 4*sizeof(COLORED_VERTEX);
- //create the buffer
- if( FAILED( pd3dDevice->CreateVertexBuffer( uiBufferSize,
- D3DUSAGE_WRITEONLY, D3DFVF_COLOREDVERTEX, D3DPOOL_DEFAULT, &g_lpVertexBuffer, NULL ) ) )
- return E_FAIL;
- COLORED_VERTEX* pVertices;
- //lock the buffer for writing
- if( FAILED( g_lpVertexBuffer->Lock( 0, uiBufferSize, (void**)&pVertices, 0 ) ) )
- return E_FAIL;
- //write the vertices. Here a simple rectangle
- pVertices[0].x = -1.0f; //left
- pVertices[0].y = -1.0f; //bottom
- pVertices[0].z = 0.0f;
- pVertices[0].color = 0xffff0000; //red
- pVertices[1].x = -1.0f; //left
- pVertices[1].y = 1.0f; //top
- pVertices[1].z = 0.0f;
- pVertices[1].color = 0xff0000ff; //blue
- pVertices[2].x = 1.0f; //right
- pVertices[2].y = -1.0f; //bottom
- pVertices[2].z = 0.0f;
- pVertices[2].color = 0xff00ff00; //green
- pVertices[3].x = 1.0f; //right
- pVertices[3].y = 1.0f; //top
- pVertices[3].z = 0.0f;
- pVertices[3].color = 0xffffffff; //white
- //unlock the buffer
- g_lpVertexBuffer->Unlock();
- //set the Vertex Format
- pd3dDevice->SetFVF( D3DFVF_COLOREDVERTEX );
- //transfer the buffer to the gpu
- pd3dDevice->SetStreamSource( 0, g_lpVertexBuffer, 0, sizeof(COLORED_VERTEX) );
- //create an effect
- if(FAILED(D3DXCreateEffectFromFile( pd3dDevice, "Effect.fx", NULL,
- NULL, D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY, NULL, &g_lpEffect, NULL )))
- return E_FAIL;
- D3DXMatrixIdentity(&g_ShaderMatrix);
- g_lpEffect->SetMatrix( "ShaderMatrix", &g_ShaderMatrix );
- MSG msg;
- while( g_bContinue )
- {
- //Clear render region with blue
- pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
- //before rendering something, you have to call this
- pd3dDevice->BeginScene();
- //rendering of scene objects happens here
- //begin the effect
- UINT uiPasses = 0;
- g_lpEffect->Begin(&uiPasses, 0);
- for (UINT uiPass = 0; uiPass < uiPasses; uiPass++)
- {
- //render an effect pass
- g_lpEffect->BeginPass(uiPass);
- //render the rectangle
- pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
- g_lpEffect->EndPass();
- }
- g_lpEffect->End();
- //after the scene call
- pd3dDevice->EndScene();
- //update screen = swap front and backbuffer
- pd3dDevice->Present(NULL, NULL, NULL, NULL);
- // A window has to handle its messages.
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- PeekMessage(&msg, 0, 0, 0, PM_REMOVE);
- }
- //Do not forget to clean up here
- pd3dDevice->Release();
- pd3dDevice = NULL;
- pD3D->Release();
- pD3D = NULL;
- g_lpEffect->Release();
- g_lpEffect = NULL;
- g_lpVertexBuffer->Release();
- g_lpVertexBuffer = NULL;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement