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周年更新有关吗?
答案 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 D3DX和Not So Direct Setup