簡體   English   中英

Direct3D11:在設備之間共享紋理:黑色紋理

[英]Direct3D11: Sharing a texture between devices: black texture

我有兩個D3D11設備,每個設備都有自己的上下文,但在同一個適配器上。

我想在兩者之間分享一個紋理,但我在另一邊接收的紋理總是黑色。

HRESULT hr;

// Make a shared texture on device_A / context_A
D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = 1024;
desc.Height = 1024;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.CPUAccessFlags = 0;
desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
ID3D11Texture2D* copy_tex;
hr = device_A->CreateTexture2D(&desc, NULL, &copy_tex);

// Test the texture by filling it with some color
D3D11_RENDER_TARGET_VIEW_DESC rtvd = {};
rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvd.Texture2D.MipSlice = 0;
ID3D11RenderTargetView* copy_tex_view = 0;
hr = device_A->CreateRenderTargetView(copy_tex, &rtvd, &copy_tex_view);
FLOAT clear_color[4] = {1, 0, 0, 1};
context_A->ClearRenderTargetView(copy_tex_view, clear_color);

// Now try to share it to device_B:
IDXGIResource* copy_tex_resource = 0;
hr = copy_tex->QueryInterface( __uuidof(IDXGIResource), (void**)&copy_tex_resource );
HANDLE copy_tex_shared_handle = 0;
hr = copy_tex_resource->GetSharedHandle(&copy_tex_shared_handle);
IDXGIResource* copy_tex_resource_mirror = 0;
hr = device_B->OpenSharedResource(copy_tex_shared_handle, __uuidof(ID3D11Texture2D), (void**)&copy_tex_resource_mirror);
ID3D11Texture2D* copy_tex_mirror = 0;
hr = copy_tex_resource_mirror->QueryInterface(__uuidof(ID3D11Texture2D), (void**)(&copy_tex_mirror));

但是: copy_tex_mirror紋理始終為黑色。

我沒有得到任何HRESULT錯誤代碼,甚至可以正常使用device_B / context_B上的copy_tex_mirror,但我無法獲取我在device_A上放入的像素數據。

我錯過了什么嗎?

提前致謝!

你怎么知道紋理總是黑色的? :-)

GPU操作由Direct3D的排隊,所以當你打開共享資源上的device_BClearRenderTargetView()上的device_A可能還沒有被執行。 根據ID3D11Device :: OpenSharedResource方法的MSDN庫文檔:

如果在一個設備上更新共享紋理,則必須在該設備上調用ID3D11DeviceContext::Flush

當我們在工作中的設備之間實現共享紋理時,我們遇到了很多問題。 如果你添加D3D9或OpenGL,那么陷阱就會成倍增加..

暫無
暫無

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

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