当前位置:   article > 正文

解析最简单的DirectX程序“Blank Window”(三)_renderenginedirectx8_d::initializerenderwindow fun

renderenginedirectx8_d::initializerenderwindow function:

导言:一个黑屏程序,要调用这么多的函数,可见游戏编程的艰辛。
上次我们学了函数InitializeD3D()函数,现在我们的任务就是学习真正的渲染屏幕了。我们不妨用RenderScece()这个函数来承载这个功能。详细的过程我们可以参考《DirectX游戏开发终极指南》这本书。我只是想说说自己对于这个函数的理解。
RenderScene()这个函数的功能大概是这样的:

最后一定不要忘记四方自己所创建的所有对象。书上使用的是Shutdown()函数。这个函数将所有已创建的类都释放出来。我注意到,这些类首先被释放资源,然后将指针设置为NULL,至此,所有的任务就已经完成了。

以下是程序的主干框架。


下面是完整的代码。

Code:
  1. #include<d3d9.h>   
  2.   
  3. #pragma comment(lib, "d3d9.lib")//连接库函数的   
  4. #pragma comment(lib, "d3dx9.lib")//连接库函数的   
  5.   
  6. #define WINDOW_CLASS "UGPDX"   
  7. #define WINDOW_NAME  "Blank D3D Window"   
  8.   
  9.   
  10. // Function Prototypes...   
  11. bool InitializeD3D(HWND hWnd, bool fullscreen);   
  12. void RenderScene();   
  13. void Shutdown();   
  14.   
  15.   
  16. // Direct3D object and device.   
  17. LPDIRECT3D9 g_D3D = NULL;   
  18. LPDIRECT3DDEVICE9 g_D3DDevice = NULL;   
  19.   
  20.   
  21. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)   
  22. {   
  23.    switch(msg)   
  24.       {   
  25.          case WM_DESTROY:   
  26.             PostQuitMessage(0);   
  27.             return 0;   
  28.             break;   
  29.   
  30.          case WM_KEYUP:   
  31.             if(wParam == VK_ESCAPE) PostQuitMessage(0);   
  32.             break;   
  33.       }   
  34.   
  35.    return DefWindowProc(hWnd, msg, wParam, lParam);   
  36. }   
  37.   
  38.   
  39. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)   
  40. {   
  41.    // Register the window class   
  42.    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,   
  43.                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,   
  44.                      WINDOW_CLASS, NULL };   
  45.    RegisterClassEx(&wc);   
  46.   
  47.    // Create the application's window   
  48.    HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,   
  49.                             100, 100, 640, 480, GetDesktopWindow(), NULL,   
  50.                             wc.hInstance, NULL);   
  51.   
  52.    // Initialize Direct3D   
  53.    if(InitializeD3D(hWnd, false))   
  54.       {   
  55.          // Show the window   
  56.          ShowWindow(hWnd, SW_SHOWDEFAULT);   
  57.          UpdateWindow(hWnd);   
  58.   
  59.          // Enter the message loop   
  60.          MSG msg;   
  61.          ZeroMemory(&msg, sizeof(msg));   
  62.   
  63.          while(msg.message != WM_QUIT)   
  64.             {   
  65.                if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))   
  66.                   {   
  67.                      TranslateMessage(&msg);   
  68.                      DispatchMessage(&msg);   
  69.                   }   
  70.                else  
  71.                   RenderScene();   
  72.             }   
  73.       }   
  74.   
  75.    // Release any and all resources.   
  76.    Shutdown();   
  77.   
  78.    // Unregister our window.   
  79.    UnregisterClass(WINDOW_CLASS, wc.hInstance);   
  80.    return 0;   
  81. }   
  82.   
  83.   
  84. bool InitializeD3D(HWND hWnd, bool fullscreen)   
  85. {   
  86.    D3DDISPLAYMODE displayMode;   
  87.   
  88.    // Create the D3D object.   
  89.    g_D3D = Direct3DCreate9(D3D_SDK_VERSION);   
  90.    if(g_D3D == NULL) return false;   
  91.   
  92.    // Get the desktop display mode.   
  93.    if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))   
  94.       return false;   
  95.   
  96.    // Set up the structure used to create the D3DDevice   
  97.    D3DPRESENT_PARAMETERS d3dpp;   
  98.    ZeroMemory(&d3dpp, sizeof(d3dpp));   
  99.   
  100.    if(fullscreen)   
  101.       {   
  102.          d3dpp.Windowed = FALSE;   
  103.          d3dpp.BackBufferWidth = 640;   
  104.          d3dpp.BackBufferHeight = 480;   
  105.       }   
  106.    else  
  107.       d3dpp.Windowed = TRUE;   
  108.    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   
  109.    d3dpp.BackBufferFormat = displayMode.Format;   
  110.   
  111.    // Create the D3DDevice   
  112.    if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,   
  113.              D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))   
  114.       {   
  115.          return false;   
  116.       }   
  117.   
  118.    return true;   
  119. }   
  120.   
  121.   
  122. void RenderScene()   
  123. {   
  124.    // Clear the backbuffer.   
  125.    g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);   
  126.   
  127.    // Begin the scene.  Start rendering.   
  128.    g_D3DDevice->BeginScene();   
  129.   
  130.    // End the scene.  Stop rendering.   
  131.    g_D3DDevice->EndScene();   
  132.   
  133.    // Display the scene.   
  134.    g_D3DDevice->Present(NULL, NULL, NULL, NULL);   
  135. }   
  136.   
  137.   
  138. void Shutdown()   
  139. {   
  140.    if(g_D3DDevice != NULL) g_D3DDevice->Release();   
  141.    if(g_D3D != NULL) g_D3D->Release();   
  142. }  

 

要顺利地运行程序,必须使用这些语句:

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
当然,这些也可在VS2005中可以设置,即不用加语句,在VS2005,点“项目->属性”打开对话框,在左边树状图:配置属性->连接器->输入,在右边附加依赖项中写上要连接的库文件就行了。

至此这个“Black Window”程序终于完成了,是不是有些困难呢?以后我相信大家熟悉了后就不会觉得困难了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/121310?site
推荐阅读