공유 리소스를 사용하여 하나의 D3D11 장치에서 다른 장치로 텍스처를 전송하므로 두 번째 장치에서 백 버퍼를 복사하고 두 번째 장치 컨텍스트를 사용하여 해당 텍스처를 파일에 저장할 수 있습니다. 이것은 효과가있는 것처럼 보이지만 텍스처를 저장할 때 비어있는 PNG를 저장합니다. 리소스를 공유하기 위해 필요한 D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX MiscFlag를 사용하는 경우를 제외하고는 기본 장치 컨텍스트로 텍스처를 저장하려고 시도했지만 작동합니다. D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX가 텍스처가 저장되는 것을 막는 어떤 이유가 있습니까? 아니면 작동시키기 위해 뭔가를 놓친 것일까 요? 여기 공유 리소스가있는 D3DX11SaveTextureToFile
내가 사용하고 코드입니다 :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);
에서 공유 여는 textue을 저장하는 데 사용되는 코드로 가정되는 코드 자신의 스레드에서 실행중인 파일 시스템에 공유 텍스처를 저장하십시오.
그게 내가하고있는 일이야. – dotminic