zoukankan      html  css  js  c++  java
  • 初始化D3D设备

     1 bool initD3D(HWND hWnd)
     2 {
     3 
     4     // 主要目的是获取设备,为调用下面的函数做很多准备。
     5     // 比如 获取IDirect3D9 ,获取支持的顶点处理,填充后备缓冲相关参数等。
     6 
     7     // IDirect3D9::CreateDevice(
     8     //UINT Adapter,
     9     //D3DDEVTYPE DeviceType,
    10     //HWND hFocusWindow,
    11     //DWORD BehaviorFlags,
    12     //D3DPRESENT_PARAMETERS *pPresentationParameters,
    13     //IDirect3DDevice9 ** ppReturnDeviceInterface
    14     //);
    15 
    16     // 第一步 获取 IDirect3D9 接口
    17     // Direct3DCreate9(D3D_SDK_VERSION);
    18     pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    19     if (NULL == pD3D)
    20     {
    21         MessageBox(NULL,TEXT("NULL == pD3D"),NULL,MB_OK);
    22         return false;
    23     }
    24      // 第二步 确定显卡是否支持顶点转换和光照
    25     // 通过获取设备性能,里面包含顶点处理,纹理,shader等信息。
    26     // pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)
    27     // caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT
    28     D3DCAPS9 caps;
    29     pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
    30 
    31     int vp = 0;
    32     if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
    33     {
    34         vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    35     }
    36     else
    37     {
    38         vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    39     }
    40 
    41   
    42     // 第三步 填充显示参数,主要是和后备缓冲相关的设置。
    43     D3DPRESENT_PARAMETERS d3dpp;
    44     d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
    45     d3dpp.BackBufferCount = 1;
    46     d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    47     d3dpp.BackBufferHeight = SCREEN_H;
    48     d3dpp.BackBufferWidth = SCREEN_W;
    49     d3dpp.EnableAutoDepthStencil = true;
    50     //d3dpp.FullScreen_RefreshRateInHz = 0; // 屏幕刷新频率,默认值即可
    51     d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; // 屏幕刷新频率,默认值即可
    52     d3dpp.Windowed = true;
    53     d3dpp.hDeviceWindow = hWnd; // 窗口句柄。
    54     d3dpp.MultiSampleQuality = 0;
    55     d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
    56     //d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; 
    57     d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; 
    58     // D3DPRESENT_INTERVAL_IMMEDIATE 图形绘制完后立即显示,实时的,可以提高帧率,但过快会产生图形撕裂。
    59     // D3DPRESENT_INTERVAL_DEFAULT 则需等待屏幕刷新完后绘制
    60     d3dpp.Flags = 0;        // 附加特性一般为0.
    61 
    62 //    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 这个一定要赋值(即使初始化为0),枚举值从1开始
    63     d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; // 这个一定要赋值(即使初始化为0),枚举值从1开始
    64     //d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; // 这个一定要赋值(即使初始化为0),枚举值从1开始
    65     // 使用FLIP 屏幕有很强的抖动,难道是交换链的切换和显示不同步所致??。
    66     // 
    67 
    68 
    69     // 第四步 创建设备。
    70     
    71     // IDirect3D9::CreateDevice(
    72     //UINT Adapter,
    73     //D3DDEVTYPE DeviceType,
    74     //HWND hFocusWindow,
    75     //DWORD BehaviorFlags,
    76     //D3DPRESENT_PARAMETERS *pPresentationParameters,
    77     //IDirect3DDevice9 ** ppReturnDeviceInterface
    78     //);
    79 
    80     pD3D->CreateDevice(
    81         D3DADAPTER_DEFAULT,
    82         D3DDEVTYPE_HAL,
    83         hWnd,
    84         vp,
    85         &d3dpp,
    86         &pD3DDev
    87         );
    88 
    89     if (NULL == pD3DDev)
    90     {
    91         MessageBox(NULL,TEXT("NULL == pD3DDev"),NULL,MB_OK);
    92         return false;
    93     }
    94 
    95     return true;
    96 }
  • 相关阅读:
    迭代器在LinkedList上的删除
    java多线程:CopyOnWriteArrayList
    vs中代码编译通过,但还是有红色波浪线
    vs中项目属性配置
    TortoiseGit安装与配置
    DC(device context)
    weak_ptr 使用
    C++ 中shared_ptr循环引用计数问题
    for_each与lambda表达式联合使用
    new 和 make_shared 在内存上的区别
  • 原文地址:https://www.cnblogs.com/lc-cnblong/p/3365039.html
Copyright © 2011-2022 走看看