您现在的位置是:首页
>
福彩3d汇总 VC.NET的Direct3D极速入门宝典
VC.NET的Direct3D极速入门宝典 听说DirectX 发布了吗?如果没有 你现在也应该听我说过了 那就去 e d e de /dx dk exe下载一个最新的DirectX 的SDK 因
VC.NET的Direct3D极速入门宝典

听说DirectX 发布了吗?如果没有 你现在也应该听我说过了 那就去 e d e de /dx bsdk exe下载一个最新的DirectX 的SDK 因为我将使用D D 来进行全文的讲解 其实DirectX 里有非常详细的教程和参考 大多数人只需要看看这些帮助就可以自己学习D D了 我的这篇文章适合那些很懒但想快速入门 不懂英文或编程知识很欠缺的人看 装好DirectX 后 打开 新建一个Win 工程 在StdAfx h里添加下面的语句 #include // D D标准头文件 #include // D D数学库头文件 #include // 这个不用我说了吧? #pragma ment( lib d d ) // D D的静态库 #pragma ment( lib d dx ) // D D数学库的静态库 然后把winmain所在文件的代码做如下的修改 #include stdafx h #define MAX_LOADSTRING HINSTANCE g_hInst; HWND g_hWnd; IDirect D *g_pD D; IDirect DDevice *g_pd dDevice; IDirect DVertexBuffer *g_pVB; TCHAR szTitle[MAX_LOADSTRING]; TCHAR szWindowClass[MAX_LOADSTRING]; ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE int); LRESULT CALLBACK WndProc(HWND UINT WPARAM LPARAM); LRESULT CALLBACK About(HWND UINT WPARAM LPARAM); void OnIdle( void ); void OnCreate( HWND hWnd ); HRESULT InitD D( void ); HRESULT CreateObject( void ); void ReleaseD D( void ); HRESULT SetModalMatrix( void ); HRESULT SetProjMatrix( WORD wWidth WORD wHeight ); void BeforePaint( void ); int APIENTRY _tWinMain(HINSTANCE hInstance HINSTANCE hPrevInstance LPTSTR lpCmdLine int nCmdShow) { MSG msg; HACCEL hAccelTable; LoadString(hInstance IDS_APP_TITLE szTitle MAX_LOADSTRING); LoadString(hInstance IDC_D DTEST szWindowClass MAX_LOADSTRING); MyRegisterClass(hInstance); if (!InitInstance (hInstance nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance (LPCTSTR)IDC_D DTEST); while ( true ) { if ( PeekMessage( &msg NULL PM_REMOVE ) ) { if (!TranslateAccelerator(msg hwnd hAccelTable &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } continue; } if ( WM_QUIT == ssage ) { break; } OnIdle(); } UnregisterClass( szWindowClass g_hInst ); return (int)msg wParam; } ATOM MyRegisterClass( HINSTANCE hInstance ) { WNDCLASSEX wcex; wcex cbSize = sizeof(WNDCLASSEX); wcex style = CS_HREDRAW | CS_VREDRAW; wcex lpfnWndProc = (WNDPROC)WndProc; wcex cbClsExtra = ; wcex cbWndExtra = ; wcex hInstance = hInstance; wcex hIcon = LoadIcon(hInstance (LPCTSTR)IDI_D DTEST); wcex hCursor = LoadCursor(NULL IDC_ARROW); wcex hbrBackground = (HBRUSH)(COLOR_WINDOW+ ); wcex lpszMenuName = (LPCTSTR)IDC_D DTEST; wcex lpszClassName = szWindowClass; wcex hIconSm = LoadIcon(wcex hInstance (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex); } BOOL InitInstance( HINSTANCE hInstance int nCmdShow ) { g_hInst = hInstance; CreateWindow( szWindowClass szTitle WS_OVERLAPPEDWINDOW CW_USEDEFAULT CW_USEDEFAULT NULL NULL hInstance NULL ); if ( !g_hWnd ) { return FALSE; } ShowWindow( g_hWnd nCmdShow ); UpdateWindow( g_hWnd ); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd UINT message WPARAM wParam LPARAM lParam) { int wmId wmEvent; switch (message) { case WM_CREATE: OnCreate( hWnd ); break; case WM_MAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd message wParam lParam); } break; case WM_SIZE: SetProjMatrix( LOWORD( lParam ) HIWORD( lParam ) ); break; case WM_DESTROY: ReleaseD D(); PostQuitMessage( ); break; default: return DefWindowProc(hWnd message wParam lParam); } return ; } void OnCreate( HWND hWnd ) { g_hWnd = hWnd; InitD D(); CreateObject(); } void ReleaseD D( void ) { } HRESULT InitD D( void ) { return S_OK; } void BeforePaint( void ) { } HRESULT CreateObject( void ) { return S_OK; } void OnIdle( void ) { } HRESULT SetModalMatrix( void ) { return S_OK; } HRESULT SetProjMatrix( WORD wWidth WORD wHeight ) { return S_OK; } 上面的代码仅是一个框架 仔细研究过上篇文章的朋友应该非常清楚这些代码的含意 不过我还是需要大至讲解一下 在InitInstance函数中 初始化程序实例的开始 我们将该实例的句柄放到全局变量中去 以便以后使用 g_hInst = hInstance; 在创建窗体时 我并没有直接将CreateWindow的返回值——创建成功的窗体句柄赋给全局变量g_hWnd 因为CreateWindow函数在执行中会引发几个消息 其中有WM_CREATE 在这个消息的处理函数中OnCreate中 我执行了下面的语句 g_hWnd = hWnd; 这样 我们就可以早一点用到g_hWnd了 SetProjMatrix是设置投影矩阵的 投影矩形仅受窗口纵横比影响 所以在WM_SIZE事件时调用时就可以了 而SetModalMatrix是设置模型矩阵的 也就是眼睛点和视点之类的东东 所以它一定要在Rander的时候 准确的说是在Render之前执行 InitD D在窗体创建时调用 用于初始化D D设备 CreateObject和InitD D一样是初始化函数 它用于创建三维对象 下面我们来填写代码 首先是初始化 我们在InitD D函数里填写下面的代码 g_pD D = Direct DCreate ( D D_SDK_VERSION ); if( NULL == g_pD D ) { return E_FAIL; } D DPRESENT_PARAMETERS d dpp; ZeroMemory( &d dpp sizeof(d dpp) ); d dpp Windowed = TRUE; d dpp SwapEffect = D DSWAPEFFECT_DISCARD; d dpp BackBufferFormat = D DFMT_A R G B ; g_pD D >CreateDevice( D DADAPTER_DEFAULT D DDEVTYPE_HAL g_hWnd D DCREATE_HARDWARE_VERTEXPROCESSING | D DCREATE_PUREDEVICE &d dpp &g_pd dDevice ); g_pd dDevice >SetRenderState( D DRS_LIGHTING TRUE ); g_pd dDevice >SetRenderState( D DRS_AMBIENT D DCOLOR_COLORVALUE( f f f ) ); g_pd dDevice >LightEnable( TRUE); D DMATERIAL mtrl; ZeroMemory( &mtrl sizeof(mtrl) ); mtrl Diffuse r = mtrl Ambient r = f / f; mtrl Diffuse g = mtrl Ambient g = f / f; mtrl Diffuse b = mtrl Ambient b = f / f; mtrl Diffuse a = mtrl Ambient a = f; g_pd dDevice >SetMaterial( &mtrl ); return S_OK; Direct DCreate 函数为我们创建了一个D D接口指针 并将接口指针返回到全局变量中保存起来 参数必须为D D_SDK_VERSION D DPRESENT_PARAMETERS是一个结构体 它就像OpenGL中的PixelFormat一样 是创建时指定设备的一些属性的 d dpp Windowed = TRUE; // 设备是窗口设备而不是全屏 d dpp SwapEffect = D DSWAPEFFECT_DISCARD; // 翻转缓冲区时不改动后台缓冲 d dpp BackBufferFormat = D DFMT_A R G B ; // ARGB颜色模式 在这之后 我们就可以调用CreateDevice来创建设备了 第一个参数指定使用主显示驱动 第二个参数指定该设备是否使用硬件来处理显示 第三个参数当然是你的窗体句柄 第四个参数如果指定D DCREATE_HARDWARE_VERTEXPROCESSING | D DCREATE_ lishixinzhi/Article/program/net/201311/12668
很赞哦! (1056)