2016-08-22 2 views
2

En essayant de mapper des données de pixels sous forme de tableau d'octets à une texture dynamique en utilisant direct3d, pour une raison quelconque, les données de pixels résultantes sont noires et ne sont pas transférées. J'ai converti ce code directement en utilisant updatesubresource avant, mais maintenant en utilisant map/unmap.Direct3D Map Pixels Noir

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); 

Répondre

2

Vous n'êtes pas la vérification de la HRESULT retour de la fonction ID3D11DeviceContext::Map. Probablement, la texture ne peut pas être mappée. Il y a plusieurs raisons pour lesquelles une texture dans D3D11 pourrait ne pas être mappable, le plus évident est qu'elle n'a pas été créée avec l'indicateur d'accès D3D11_CPU_ACCESS_WRITE (lorsque vous utilisez D3D11_MAP_WRITE dans l'appel à Map). Si vous forcez sur le calque de débogage D3D11, la sortie de débogage affichera un message détaillé sur l'échec.

Si vous comptez mapper une texture créée en interne par Unity, vous ne devez pas supposer qu'elle est mappable. L'utilisation de UpdateSubresource (comme vous l'utilisiez) est plus largement compatible, quels que soient les drapeaux utilisés pour créer la texture. Vous pouvez interroger le CPUAccessFlags sur la texture, en utilisant ID3D11Texture2D::GetDesc et décider quelle méthode de mise à jour utiliser (mappage/mise à jour).