J'ai un identifiant pour ID3D11Texture2D, mais pas d'accès à ID3D11DeviceContext ou ID3D11Device. Je veux copier cette texture à l'autre texture sur l'autre ID3D11Device. La texture n'est créée avec aucun indicateur de partage. Si j'essaie de copier avec ID3D11DeviceContext :: CopyResource je reçois un avertissement "Le paramètre CORRUPTION D3D11 ne correspond pas au périphérique". Comment puis-je copier la texture ou son contenu? Je suppose que c'est possible, car par exemple OpenVR API utilise uniquement le handle de texture sans aucun contexte.Copie de la texture Direct3D11 sur un autre périphérique D3D11
Répondre
Si une texture n'est pas créée avec le drapeau de partage, vous ne pouvez pas l'utiliser entre deux périphériques.
Mais vous avez l'objet de texture, qui est un ID3D11DeviceChild
et il suffit d'avoir accès à ID3D11DeviceChild::GetDevice
pour récupérer l'appareil et par extension ID3D11Device::GetImmediateContext
Maintenant que vous avez accès à l'appareil et le contexte, vous pouvez créer une texture supplémentaire avec le drapeau de partage D3D11_RESOURCE_MISC_SHARED
sur l'appareil d'origine ou le vôtre et récupérer l'objet sur l'autre avec ID3D11Device::OpenSharedResource
. Et enfin copier la texture originale sur le nouvel objet avec CopyResource
N'oubliez pas que toutes les thèses Get
ajouter une référence aux objets qui doivent être libérés une fois que vous avez terminé avec eux.
Fonctionne comme un charme et résout parfaitement mon problème. Merci beaucoup! – superg
Si vous n'utilisez pas le partage, vous devez le recopier via une mémoire CPU qui va être terriblement lente. –
@ChuckWalbourn Pour copier la texture dans le processeur, il faudrait que je la copie d'abord dans la texture de transfert. Et pour ce faire, j'aurais besoin d'un contexte d'appareil que je n'ai pas? – superg
Vous ne pouvez pas effectuer de copie sans le contexte de périphérique immédiat. –