【问题标题】:Minimal code to create a Direct3D9 Device创建 Direct3D9 设备的最少代码
【发布时间】:2011-01-23 15:11:37
【问题描述】:

这不适用于稳定的发布代码,我只需要从我的开发 PC 上的 HWND 获取在 C++ 应用程序中创建的窗口 D3D9 设备,以进行测试……它可以默认加载大量选项。

我试图从一个旧的 D3D8 类中破解它,但我得到了 D3DERR_INVALIDCALL。

基本上我现在有这个:

    HWND mHWnd = ...;
    LPDIRECT3D9 mpD3D = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS md3dpp;
    ZeroMemory( &md3dpp, sizeof(D3DPRESENT_PARAMETERS) );
    md3dpp.Windowed                 = true;
    md3dpp.SwapEffect               = D3DSWAPEFFECT_DISCARD;
    md3dpp.BackBufferCount          = 1;
    md3dpp.EnableAutoDepthStencil   = 0;
    md3dpp.hDeviceWindow            = mHWnd;
    md3dpp.BackBufferWidth          = 0;
    md3dpp.BackBufferHeight         = 0;
    md3dpp.FullScreen_RefreshRateInHz = 0;
    md3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    md3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    md3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
    md3dpp.MultiSampleQuality = 0;

    LPDIRECT3DDEVICE9 mpD3DDevice=0;
    HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd,0,&md3dpp,&mpD3DDevice);

我认为某些 D3DPRESENT_PARAMETERS 选项可能是罪魁祸首 - 我不关心 z 缓冲区或模板或 AA 的后缓冲区,任何旧的普通设备都可以。

我是否将一些不兼容的标志复制粘贴在一起?

【问题讨论】:

    标签: visual-c++ directx direct3d direct3d9


    【解决方案1】:

    1 问题是您需要设置一些行为标志。

    来自CreateDevice. 上的文档:

    BehaviorFlags [in]
    双字
    控制设备创建的一个或多个选项的组合。有关详细信息,请参阅 D3DCREATE。

    来自D3DCREATE 文档:

    D3DCREATE_HARDWARE_VERTEXPROCESSING、D3DCREATE_MIXED_VERTEXPROCESSING 和 D3DCREATE_SOFTWARE_VERTEXPROCESSING 是互斥标志。 在调用 CreateDevice 时必须指定这些顶点处理标志中的至少一个

    试试:

    HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd,D3DCREATE_MIXED_VERTEXPROCESSING,&md3dpp,&mpD3DDevice);
    

    【讨论】:

    • 噢!这就是无脑代码粘贴的结果。它现在按预期工作。
    • @John:呵呵,很容易错过:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多