最近IDirect3DDevice9 :: CreateDeviceEx有时不会从D3DFMT_UNKNOWN更改BackBufferFormat

时间:2016-09-28 08:43:33

标签: direct3d direct3d9

IDirect3D9Ex::CreateDeviceEx上的

MSDN说:

  

如果在调用方法之前BackBufferFormat等于D3DFMT_UNKNOWN,则在方法返回时会更改它。

所以这应该打印format: 0以外的其他内容(现在format: 22通常为D3DFMT_X8R8G8B8):

#include <cstdio>
#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"User32.lib")
int main(int argc, char **argv)
{
    IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION);
    if (!d3d) {
        printf("No d3d!\n");
        return 0;
    }
    D3DPRESENT_PARAMETERS pp = {};
    pp.BackBufferWidth = 1;
    pp.BackBufferHeight = 1;
    pp.BackBufferFormat = D3DFMT_UNKNOWN;
    pp.BackBufferCount = 1;
    pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    pp.Windowed = TRUE;
    IDirect3DDevice9* device = NULL;
    HRESULT hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &device);
    if (FAILED(hr)) {
        printf("Failed!\n");
        return 0;
    }
    printf("format: %i\n", pp.BackBufferFormat);
    device->Release();
    d3d->Release();
}

这总是符合我的经验。现在最近有时这不再像预期的那样工作了。它打印format: 0。为什么呢?

最近在一些Windows 10 PC上观察到这种情况。后来它神奇地再次开始工作了。这可能与Windows 10周年更新有关吗?

1 个答案:

答案 0 :(得分:0)

我希望在代码中HRESULT返回失败的情况下打印0。尝试:

IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (!d3d) 
    return false;

...

HRESULT hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
    GetDesktopWindow(), D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp,
    &device);
if (FAILED(hr))
    return false;
printf("format: %i\n", pp.BackBufferFormat);
  

Windows 10 for BackCompat中存在旧版Direct3D 9 API。它已经在Windows Vista中被仿效了。 Direct3D9Ex暴露了现代Windows的更多“真实”行为,因为它知道DXGI,但一般来说Direct3D 11是现代软件测试和使用的主要代码路径。因此,传统的Direct3D 9在每个Windows版本中都会变得有点怪异。

     

请注意,Windows 8.0,Windows 8.1或Windows 10不支持Direct3D 9的“Developer Runtime”(又名调试设备)。

     

使用Direct3D 9通常也意味着使用已弃用的D3DX支持库,该库仅在end-of-life DirectX SDK中可用。部署D3DX需要使用旧版 DirectX运行时最终用户重新分发包。请参阅Living without D3DXNot So Direct Setup