2016-08-22 122 views
2

我試圖將像素數據作爲字節數組映射到使用direct3d的動態紋理,由於某些原因導致的像素數據是黑色的並且沒有被轉移。我之前已經使用updatesubresource直接轉換了這段代碼,但現在我正在使用map/unmap。Direct3D映射像素黑色

ID3D11Texture2D* d3dtex = (ID3D11Texture2D*)textureHandle; 
assert(d3dtex); 

ID3D11DeviceContext* ctx = NULL; 
m_Device->GetImmediateContext(&ctx); 
D3D11_MAPPED_SUBRESOURCE mappedResource; 
ZeroMemory(&mappedResource, sizeof(D3D11_MAPPED_SUBRESOURCE)); 

// Disable GPU access to the vertex buffer data. 
ctx->Map(d3dtex, 0, D3D11_MAP_WRITE, 0, &mappedResource); 
// Update the vertex buffer here. 
memcpy(mappedResource.pData, dataPtr, textureWidth * textureHeight * 4); 
// Reenable GPU access to the vertex buffer data. 
ctx->Unmap(d3dtex, 0); 

回答

2

你是不是檢查從ID3D11DeviceContext::Map功能HRESULT回報。可能,紋理無法映射。 D3D11中的紋理可能無法映射的原因有幾個,最明顯的是它不是用D3D11_CPU_ACCESS_WRITE訪問標誌創建的(當您在撥打Map時使用D3D11_MAP_WRITE)。如果您在D3D11調試層上強制執行,則調試輸出將打印出關於失敗的詳細消息。

如果您依賴的是映射Unity內部創建的紋理,則不應認爲它是可映射的。使用UpdateSubresource(正如您使用的)更廣泛地兼容,無論使用哪種標誌來創建紋理。您可以使用ID3D11Texture2D::GetDesc來查詢紋理上的CPUAccessFlags,並決定使用哪種更新方法(地圖/更新)。