• [direct-X] direct-X最小框架


      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 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
     39 {
     40    // Register the window class
     41    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
     42                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
     43                      WINDOW_CLASS, NULL };
     44    RegisterClassEx(&wc);
     45 
     46    // Create the application's window
     47    HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
     48                             100, 100, 640, 480, GetDesktopWindow(), NULL,
     49                             wc.hInstance, NULL);
     50 
     51    // Initialize Direct3D
     52    if(InitializeD3D(hWnd,false))
     53    {
     54          // Show the window
     55          ShowWindow(hWnd, SW_SHOWDEFAULT);
     56          UpdateWindow(hWnd);
     57 
     58          // Enter the message loop
     59          MSG msg;
     60          ZeroMemory(&msg, sizeof(msg));
     61 
     62          while(msg.message != WM_QUIT)
     63          {
     64                if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
     65                {
     66                      TranslateMessage(&msg);
     67                      DispatchMessage(&msg);
     68                }
     69                else
     70                   RenderScene();
     71          }
     72    }
     73 
     74    // Release any and all resources.
     75    Shutdown();
     76 
     77    // Unregister our window.
     78    UnregisterClass(WINDOW_CLASS, wc.hInstance);
     79    return 0;
     80 }
     81 //====================================================================================
     82 //InitializeD3D函数的参数有窗口句柄hWnd,标识窗口是否全屏的标识符fullscreen
     83 // (窗口句柄是在调用CreateWindows()函数创建窗口句柄时,返回给WinMain()函数的数值)
     84 //1、Direct3DCreat9()函数将创建一个Direct3D接口对象,并返回该对象
     85 //2、GetAdapterDisplayMode()将返回当前的显示信息,分辨率、显示格式、显示器的刷新频率等。该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。将D3DADAPTER_DEFAULT发送给函数,详细说明代码,通过这些代码可以获取想要的主显卡信息。
     86 // (D3DPRESENT_PARAMETERS结构用于定义Direct3D窗口的显示信息。这样可以设置正在创建窗口的期望宽度和高度,刷新率,显示模式为全屏或窗口,后天缓存数目等)
     87 //3、CreateDevice()主要负责创建Direct3D设备对象,该对象用于向屏幕渲染图形
     88 // (CreateDevice()函数中的1Adapter。该参数用于指定正在使用的显卡。
     89 //                        2DeviceType是一个标识符,用于指定Direct3D中的渲染方式。该参数的参数值可以是采用硬件渲染的D3DDEVTYPE_HAL、采用软件渲染的D3DDEVTYPE_REF、不需要软硬件支持的D3DDEVTYPE_NULLREF,或是采用要进行渲染工作的可插拔软件的D3DDEVTYPE_SW。软件渲染标识符允许运行Direct3D程序,它可以使用硬件不支持的特性。软件渲染存在的问题是渲染速度慢,尤其是在开发游戏时。
     90 //                        3hFocusWindow是一个窗口句柄
     91 //                        4BehaviorFlags是标识符组合,用于指定设备的运行方式
     92 //                        5pPresentationParameter是一个指针,它指向该函数前面创建的D3DPRESENT_PARAMTERS结构
     93 //                        6ppReturnedDeviceInterface是一个指针,它指向新创建的Direct3D设备对象。如果该对象为NULL(空),或是函数返回除D3D_OK以外的值,那么Direct3D设备的创建失败。
     94 //一旦完成Direct3D的设置和创建,就可以随意渲染屏幕。初始化阶段的CreateDevice()函数中创建的设备对象可以完成Direct3D中的渲染工作。渲染屏幕开始先要清屏为指定的颜色,告知Direct3D将要开始绘制新场景,渲染想要渲染的物体,完成屏幕渲染,在屏幕上显示渲染结果。
     95 //====================================================================================
     96 bool InitializeD3D(HWND hWnd, bool fullscreen)
     97 {
     98    D3DDISPLAYMODE displayMode;
     99 
    100    // Create the D3D object.
    101    
    102    g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
    103    if(g_D3D == NULL) return false;
    104 
    105    // Get the desktop display mode.
    106    if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))//
    107       return false;
    108 
    109    // Set up the structure used to create the D3DDevice
    110    D3DPRESENT_PARAMETERS d3dpp;//定义一个结构体用于定义Direct3D窗口的显示信息(具体见定义处)
    111    ZeroMemory(&d3dpp, sizeof(d3dpp));
    112 
    113    if(fullscreen)
    114    {
    115          d3dpp.Windowed = FALSE;//标识符用于指定创建的窗口是否是全屏窗口。
    116          d3dpp.BackBufferWidth = 640;//窗口宽
    117          d3dpp.BackBufferHeight = 480;
    118    }
    119    else
    120       d3dpp.Windowed = TRUE;
    121    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//成员变量MultiSampleType、MultiSampleQuality和SwapEffect处理交换效果
    122    d3dpp.BackBufferFormat = displayMode.Format;
    123 
    124    // Create the D3DDevice
    125    if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
    126              D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
    127    {
    128          return false;
    129    }
    130 
    131    return true;
    132 }
    133 //==========================================================================================================
    134 //Clear()函数的参数包括:
    135 //         1要清除的矩形数目(0代表清除整个屏幕)
    136 //         2定义想要清除的屏幕区域矩形链表(NULL代表整个屏幕)
    137 //         3标识要清除内容的标识符4清除后的颜色5要设定的深度值6设定模板缓存值
    138 //          对标识符参数而言,D3DCLEAR_DEFAULT清除所有的渲染目标,D3DCLEAR_STENCIL清除模板缓存,而D3DCLEAR_ZBUFFER清除深度缓存
    139 //一旦完成清除工作,渲染函数将调用设备对象的BeginScene()函数,在Direct3D中启动一个新场景。
    140 //在Direct3D中渲染任何图形前,都必须先调用BeginScene()函数。一旦渲染完要渲染的物体,就调用设备对象的EndScene()函数结束渲染。
    141 //        记住:每个BeginScene()函数必须有一个与之对应的EndScene()函数。
    142 //调用设备对象的Present()函数可以完成显示。就目前的学习而言,Present()函数的参数可以全部设为NULL(空)。
    143 //         第一个参数是正在显示的原始矩形,如果不使用交换链,那么该值必须为NULL(空)。
    144 //         第二个参数是一个指针,它指向要渲染的最终矩形。
    145 //         第三个参数是正在显示的窗口的窗口句柄。另外,由于没有用到交换链,所以对正在使用的窗口句柄而言,该值设为NULL(空)。这个正在使用的窗口句柄是在Direct3D初始化过程中为D3DPRESENT_PARAMETERS对象设置的窗口句柄。
    146 //         最后一个参数是缓存区域,它代表需要更新的最小区域。同样,该参数涉及到交换链,也可以设为NULL(空)。
    147 //==========================================================================================================
    148 void RenderScene()
    149 {
    150    // Clear the backbuffer.
    151    g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(100,0,0), 1.0f, 0);
    152 
    153    // Begin the scene.  Start rendering.
    154    g_D3DDevice->BeginScene();
    155 
    156    // End the scene.  Stop rendering.
    157    g_D3DDevice->EndScene();
    158 
    159    // Display the scene.
    160    g_D3DDevice->Present(NULL, NULL, NULL, NULL);
    161 }
    162 
    163 //==========================================================================================================
    164 void Shutdown()
    165 {
    166    if(g_D3DDevice != NULL) g_D3DDevice->Release();
    167    if(g_D3D != NULL) g_D3D->Release();
    168 }
    169 //==========================================================================================================
  • 相关阅读:
    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
    输入一个链表,反转链表后,输出链表的所有元素。java实现
    少一点虚荣,多一点务实
    Mysql存储引擎__笔记
    osi七层模型和两主机传输过程:
    redis_笔记
    zookeeper_笔记
    rest和soap_笔记
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3581658.html
Copyright © 2020-2023  润新知