知识大全 VC.NET的Direct3D极速入门宝典
Posted
函数
篇首语:书卷多情似故人,晨昏忧乐每相亲。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 VC.NET的Direct3D极速入门宝典相关的知识,希望对你有一定的参考价值。
VC.NET的Direct3D极速入门宝典 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
听说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_ cha138/Article/program/net/201311/12668 相关参考
知识大全 用VC.NET制作启动屏幕的新方法
用VC.NET制作启动屏幕的新方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在利用VC+编
知识大全 VC#.Net中浏览Crystal Report
VC#.Net中浏览CrystalReport 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb
知识大全 VC# .Net中使用Crystal Report(一)
VC#.Net中使用CrystalReport(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 VC# .Net中使用Crystal Report(二)
VC#.Net中使用CrystalReport(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 VC.NET索引对查询条件顺序的影响
VC.NET索引对查询条件顺序的影响 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 环境SqlS
知识大全 使用 VC.net 轻松实现按钮控件自绘
使用VC.net轻松实现按钮控件自绘 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用&nbs
知识大全 VC++.NET中使用GDI+创建特效字体
VC++.NET中使用GDI+创建特效字体 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!来自于微软
知识大全 VC.NET扩展Windows磁盘清理工具的功能
VC.NET扩展Windows磁盘清理工具的功能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 基于VC.NET的GDI+编程之CImage
基于VC.NET的GDI+编程之CImage 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我们
知识大全 VC++.NET几个比较难缠的问题及其解决方法
VC++.NET几个比较难缠的问题及其解决方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问