我正在尝试在两个进程之间共享一个 direct3d 表面。他们都在 Windows 7 上使用 D3D9Ex。MSDN文档指出:
要共享,您需要在创建时指定要共享的资源,并在默认池(D3DPOOL_DEFAULT)中找到该资源。
还:
要创建共享资源,请使用未初始化的句柄调用任何资源创建 API(见下文)(指针本身不是 NULL (pSharedHandle != NULL),但指针指向 NULL 值 (*pSharedHandle == NULL))。API 将生成一个共享资源并返回一个有效句柄。
所以这是我对 CreateTexture 创建共享纹理的调用:
IDirect3DTexture9* texture;
HANDLE sharedHandle = nullptr;
d3dDevice9Ex->CreateTexture(width, height, 1,
D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &texture, &sharedHandle);
这失败了;DgbView.exe 中的输出是:
[8788] Direct3D9: (ERROR) :Failure trying to create a texture
[8788]
[8788] Direct3D9: (ERROR) :Source of shared texture must be in D3DPOOL_SYSTEMMEM. CreateTexture fails.
我不明白。似乎文档声明表面必须在 D3DPOOL_DEFAULT 中,但来自 Direct3D 的错误消息是表面必须在 D3DPOOL_SYSTEMMEM 中。它是哪一个,或者我调用这个方法的方式还有什么问题吗?
请注意,当我将参数更改为 D3DPOOL_SYSTEMMEM 时,错误消息变为:
[10068] Direct3D9: (ERROR) :Failure trying to create a texture
[10068]
[10068] Direct3D9: (ERROR) :*pSharedHandle must be a valid pointer to create such D3DPOOL_SYSTEMMEM texture. CreateTexture fails.