HRESULT 0x8876086c D3DERR_INVALIDCALL with DirectX9 几乎遵循文档示例

问题描述 投票:0回答:2

所以我想在另一个窗口上绘制一个覆盖图,但是我没有得到真正的运行时错误,visual Studio 调试工具告诉我

的结果
HRESULT res = object->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWND, D3DCREATE_HARDWARE_VERTEXPROCESSING, &params, NULL, &device);

是 0x8876086c。所以这里是我的代码片段,它们很重要并导致这个错误(D3DERR_INVALIDCALL),这导致设备成为空指针,这意味着我不能用它做任何事情。

我无法真正弄清楚是什么导致了这个,因为我几乎遵循了文档

int Paint::init(HWND hWND) {
if (FAILED(Direct3DCreate9Ex(D3D_SDK_VERSION, &object))) {
    exit(1);
}
ZeroMemory(&params, sizeof(params));

params.BackBufferWidth = width;
params.BackBufferHeight = height;
params.Windowed = true;
params.hDeviceWindow = hWND;
params.MultiSampleQuality = D3DMULTISAMPLE_NONE;
params.BackBufferFormat = D3DFMT_A8R8G8B8;
params.EnableAutoDepthStencil = TRUE;
params.AutoDepthStencilFormat = D3DFMT_D16;


HRESULT res = object->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWND, D3DCREATE_HARDWARE_VERTEXPROCESSING, &params, NULL, &device);

在头文件中:

class Paint {
private:
IDirect3D9Ex* object = NULL;
IDirect3DDevice9Ex* device = NULL;
DWORD behaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;

D3DPRESENT_PARAMETERS params;
ID3DXFont* font = 0;
HWND TargetHWND;
int width, height;

int init(HWND(hWND));
}
c++ directx directx-9
2个回答
4
投票
D3DPRESENT_PARAMETERS params = {};

// Use Win32 BOOL "TRUE" instead of C++ "true"
params.Windowed = TRUE;
params.hDeviceWindow = m_window;

// params.BackBufferWidth, BackBufferHeight are ignored for Windowed = TRUE

// For Windowed = TRUE, use params.BackBufferFormat = D3DFMT_UNKNOWN, which is zero.

// For params.BackBufferCount zero is assumed to be 1, but best practice
// would be to set it
params.BackBufferCount = 1;

// You used D3DMULTISAMPLE_NONE for the MultiSampleQuality instead of MultiSampleType. 
// It's all zero anyhow.

params.EnableAutoDepthStencil = TRUE;
params.AutoDepthStencilFormat = D3DFMT_D16;

// --->>> This is the actual bug: there is no valid SwapEffect that has a value of zero <<<---
params.SwapEffect = D3DSWAPEFFECT_DISCARD;

你假设 Direct3D9 设备支持

D3DCREATE_HARDWARE_VERTEXPROCESSING
,但你还没有验证它实际上支持它。也就是说,
D3DCREATE_SOFTWARE_VERTEXPROCESSING
在 Windows 10 上存在已知的性能问题,因此无论如何您应该只需要 HW。

您不应该将旧版 Direct3D9 或 Direct3D9Ex 用于新项目。它主要是在较新版本的 Windows 上模拟的,有很多奇怪的行为,此时已经有将近 20 年的历史了。 Windows 8.x 或 Windows 10 不支持 Direct3D 9 调试设备。您应该将 Direct3D 11 视为 DirectX 新开发人员的更好起点。


0
投票

修改以下代码

WNDCLASS wc = { };

wc.lpfnWndProc = MsgProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;

这解决了我的问题

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.