D3D视频渲染入门程序.
来源:互联网 发布:邪恶帝软件下载 编辑:程序博客网 时间:2024/06/07 03:15
学习D3D必备的基础知识:
1. C/C++;
2. Win32 API基础;
3. COM( 组件对象模型)的使用;
4. 数学基础(矩阵、向量、四元数等);
5. 计算机图形学基础(三维变换,渲染,灯光等)。
一个D3D程序的基本结构:
一个基本的D3D程序,渲染显示一个空白窗口,代码如下:-
-
-
-
- #include <d3d9.h>
-
-
-
-
-
- LPDIRECT3D9 g_pD3D = NULL;
- LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
-
-
-
-
-
- HRESULT InitD3D( HWND hWnd )
- {
-
- if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
- return E_FAIL;
-
-
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory( &d3dpp, sizeof(d3dpp) );
- d3dpp.Windowed = TRUE;
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
-
-
- if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &d3dpp, &g_pd3dDevice ) ) )
- {
- return E_FAIL;
- }
-
- return S_OK;
- }
-
-
-
-
-
- VOID Cleanup()
- {
-
- if( g_pd3dDevice != NULL)
- g_pd3dDevice->Release();
-
-
- if( g_pD3D != NULL)
- g_pD3D->Release();
- }
-
-
-
-
-
- VOID Render()
- {
-
- g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
-
-
- if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
- {
-
-
-
- g_pd3dDevice->EndScene();
- }
-
-
- g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
- }
-
-
-
-
-
- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- switch( msg )
- {
- case WM_DESTROY:
- Cleanup();
- PostQuitMessage( 0 );
- return 0;
-
- case WM_PAINT:
- Render();
- ValidateRect( hWnd, NULL );
- return 0;
- }
-
- return DefWindowProc( hWnd, msg, wParam, lParam );
- }
-
-
-
-
-
- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
- {
-
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
- L"ClassName", NULL };
- RegisterClassEx( &wc );
-
-
- HWND hWnd = CreateWindow( L"ClassName", L"最简单的Direct3D程序",
- WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
- NULL, NULL, wc.hInstance, NULL );
-
-
- if( SUCCEEDED( InitD3D( hWnd ) ) )
- {
-
- ShowWindow( hWnd, SW_SHOWDEFAULT );
- UpdateWindow( hWnd );
-
-
- MSG msg;
- ZeroMemory( &msg, sizeof(msg) );
- while( msg.message!=WM_QUIT )
- {
- if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- }
- else
- {
- Render();
- }
- }
- }
-
- UnregisterClass( L"ClassName", wc.hInstance );
- return 0;
- }
运行结果: