![](/img/trans.png)
[英]DirectX9 CreateOffscreenPlainSurface returns D3DERR_INVALIDCALL
[英]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, ¶ms, NULL, &device);
是 0x8876086c。 所以這里是我的代碼片段,它們很重要並導致此錯誤(D3DERR_INVALIDCALL),這導致設備成為空指針,這意味着我無法用它做任何事情。
我無法真正弄清楚是什么導致了這種情況,因為我幾乎遵循了文檔
int Paint::init(HWND hWND) {
if (FAILED(Direct3DCreate9Ex(D3D_SDK_VERSION, &object))) {
exit(1);
}
ZeroMemory(¶ms, 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, ¶ms, 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.