簡體   English   中英

HRESULT 0x8876086c D3DERR_INVALIDCALL with DirectX9 幾乎遵循文檔示例

[英]HRESULT 0x8876086c D3DERR_INVALIDCALL with DirectX9 pretty much following the documentation example

所以我想在另一個 window 上繪制一個疊加層,但我沒有得到真正的運行時錯誤,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);

在 header 文件中:

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));
}
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 上存在已知的性能問題,因此無論如何您可能只需要硬件。

您不應將舊版 Direct3D9 或 Direct3D9Ex 用於新項目。 它主要在較新版本的 Windows 上進行模擬,有很多奇怪的行為,此時已經快 20 歲了。 Windows 8.x 或 Windows 10 上不支持 Direct3D 9 調試設備。對於 DirectX 新手來說,您應該考慮將 Direct3D 11 作為更好的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM