知识大全 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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  问