c++ - 无法创建 d3d 设备

标签 c++ directx directx-9

我正在尝试初始化 directX,但由于某些原因它无法创建 d3d 设备。 它编译正确,但显示最后一个消息框(“无法创建 D3D 设备”)

调试时:
- d3dObject 0x00000000 IDirect3D9 *
- IUnknown {...} IUnknown
__vfptr CXX0030:错误:无法计算表达式

#include <d3d9.h>
#include <d3dx9.h>
#include <windows.h>

HWND hMainWindow;

IDirect3D9 *d3dObject = 0;
IDirect3DDevice9 *d3dDevice = 0;

bool InitDirectX()
{
    d3dObject = Direct3DCreate9(D3D_SDK_VERSION);
    if( !d3dObject )
    {
        MessageBox(0, "Can't create Direct3D Object", "Error", MB_ICONSTOP);
        PostQuitMessage(0);
    }

    D3DDISPLAYMODE mode;
    d3dObject->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);
    d3dObject->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mode.Format, mode.Format, true);
    d3dObject->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, false);

    D3DCAPS9 caps;
    d3dObject->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

    DWORD devBehaviorFlags = 0;
    if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
          devBehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
    else
          devBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    // If pure device and HW T&L supported
    if( caps.DevCaps & D3DDEVCAPS_PUREDEVICE &&
          devBehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING)
                devBehaviorFlags |= D3DCREATE_PUREDEVICE;

    D3DPRESENT_PARAMETERS d3dpp;
    d3dpp.BackBufferWidth            = 800;
    d3dpp.BackBufferHeight           = 600;
    d3dpp.BackBufferFormat           = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferCount            = 1;
    d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
    d3dpp.MultiSampleQuality         = 0;
    d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow              = hMainWindow;
    d3dpp.Windowed                   = true;
    d3dpp.EnableAutoDepthStencil     = true;
    d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
    d3dpp.Flags                      = 0;
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;


    if(!d3dObject->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hMainWindow, devBehaviorFlags, &d3dpp, &d3dDevice))
    {
        ::MessageBox(0, "Can't create D3D device", "Error", MB_ICONSTOP);
        return false;
    }

    return true;
}

最佳答案

IDirect3D9::CreateDevice 返回一个 HRESULT 而不是 bool 值。 检查设备是否已创建的正确方法是使用 SUCCEEDED 或 FAILED 宏:

HRESULT hr = d3dObject->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hMainWindow, devBehaviorFlags, &d3dpp, &d3dDevice);
if( FAILED(hr) )
{
    // hr will be one of the D3DERR_ values
    ::MessageBox(0, "Can't create D3D device", "Error", MB_ICONSTOP);
    return false;
}

关于c++ - 无法创建 d3d 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9850500/

相关文章:

c++ - 使用 DirectX 渲染单独的纹理

c++ - Transform - 一种变异序列算法

c++ - 无序、固定大小的基于内存池的频繁插入和删除的容器

c# - 在 C# 中使用 DirectX 进行无缝(循环)音频播放

directx/HLSL 什么是输入和输出语义?

c++ - directx 旋转 C++

c++ - 启用照明时 DirectX 9 顶点颜色会被忽略吗?

c++ - C2248 : cannot access private member declared in Singleton class如何解决

c++ - 控制台应用程序中的 Linux Qt QSystemTrayIcon

c++ - 使用 DirectX 获取显示设备输出类型