gpt4 book ai didi

c++ - 具有共享资源的 D3DX11SaveTextureToFile

转载 作者:太空狗 更新时间:2023-10-29 21:07:15 25 4
gpt4 key购买 nike

我正在使用共享资源将纹理从一个 D3D11 设备发送到另一个设备,这样我就可以将后台缓冲区复制到第二个设备上,并使用第二个设备上下文将该纹理保存到一个文件中。这似乎可行,但是当我保存纹理时,它会保存一个空的 PNG。我尝试使用主要设备上下文保存纹理并且它有效,除非我使用 D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX MiscFlag,我需要它来共享资源。D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX 是否有任何原因阻止保存纹理?还是我可能遗漏了一些东西以使其正常工作?

这是我使用的代码:

D3D11_TEXTURE2D_DESC td;
backBuffer->GetDesc(&td);
td.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;
this->_device->CreateTexture2D(&td, 0, &g_tex);
this->_context->CopyResource(g_tex, backBuffer);

// saves a blank image if using D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
D3DX11SaveTextureToFile(this->_context, g_tex, D3DX11_IFF_JPG, "test.jpg");

g_tex->QueryInterface(__uuidof(IDXGIResource), reinterpret_cast<void **>(&g_dxgiResource));
g_dxgiResource->GetSharedHandle(&g_shaderHandle);
g_dxgiResource->Release();
g_tex->QueryInterface(__uuidof(IDXGIKeyedMutex), reinterpret_cast<void **>(&g_dxgiMutex));

这是用于在第二个设备中保存共享文本​​的代码

ID3D11Texture2D *texture = 0;
IDXGIKeyedMutex *keyedMutex = 0;
device2->OpenSharedResource(g_shaderHandle, __uuidof(ID3D11Texture2D), reinterpret_cast<void **>(&texture));
texture->QueryInterface(__uuidof(IDXGIKeyedMutex), reinterpret_cast<void **>(&keyedMutex));
UINT acqKey = 0;
UINT relKey = 1;
DWORD timeout = 16;
DWORD res = keyedMutex->AcquireSync(acqKey, timeout);
if (res == WAIT_OBJECT_0 && texture)
{
// saves a blank image too
D3DX10SaveTextureToFile(texture, D3DX10_IFF_JPG, "test2.jpg");
}
keyedMutex->ReleaseSync(relKey);

此外,应该将共享纹理保存到文件系统的代码正在它自己的线程中运行。

最佳答案

这是我解决问题的方法。事实证明,使用 D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX 杂项标志不允许将纹理保存到文件中。因此,我将 D3D11_RESOURCE_MISC_SHARED 标志与常规互斥锁一起使用,而不使用 DXGIKeyedMutex 东西。

将后台缓冲区复制到共享纹理并创建一个共享句柄:

D3D11_TEXTURE2D_DESC td;
backBuffer->GetDesc(&td);
td.MiscFlags = D3D11_RESOURCE_MISC_SHARED;

this->_device->CreateTexture2D(&td, 0, &g_tex);
this->_context->CopyResource(g_tex, backBuffer);
IDXGIResource *dxgiResource = 0;
g_tex->QueryInterface(__uuidof(IDXGIResource), reinterpret_cast<void **>(&dxgiResource));
dxgiResource->GetSharedHandle(&g_shaderHandle);
dxgiResource->Release();
backBuffer->Release();

现在我们有了后台缓冲区的共享拷贝并对其进行了处理,我们可以将它从另一个线程保存到一个文件中,而不会占用设备上下文:

// device_2 and context_2 are the "secondary" device and context
bool imgSaved = true;
ID3D11Texture2D *texture = 0;
HRESULT h = WaitForSingleObject(g_mutex, INFINITE);
if (h == WAIT_OBJECT_0)
{
// check to see if there is an image to save
if (wdata->hasFrame)
{
wdata->hasFrame = false;
imgSaved = false
}
}
ReleaseMutex(g_mutex);
if (!imgSaved)
{
device_2->OpenSharedResource(g_shaderHandle, __uuidof(ID3D11Texture2D), (LPVOID*)&texture);
if (texture)
{
h = D3DX11SaveTextureToFile(context_2, texture, D3DX11_IFF_PNG, "image.png");
texture->Release();
}
}

基本上,这允许我在不降低帧率的情况下保存高清屏幕捕获,因为我的设备上下文没有卡在 D3DX11SaveTextureToFile 函数中,它由辅助上下文处理。附带一提,我没有对它进行过大量测试,我今天早上只是把它拼凑在一起,在某些情况下它可能不起作用,但它解决了我在另一个标志上遇到的问题,该问题导致保存了空图像归档。

关于c++ - 具有共享资源的 D3DX11SaveTextureToFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5585038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com